Android: Last line of textview cut off

后端 未结 20 1142
北荒
北荒 2020-11-28 02:46

I have a horizontal LinearLayout containing a TextView followed by a Spinner next to it. This LinearLayout is dynamically

相关标签:
20条回答
  • 2020-11-28 03:11

    Put the problematic textview inside a framelayout. I think the text view is not calculated correctly because of the sibling view, Spinner.

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:orientation="horizontal">
    
        <FrameLayout
            android:layout_width="150dp"
            android:layout_height="wrap_content">
            <TextView
                android:id="@+id/textView1"
                android:layout_width="150dp"
                android:layout_height="wrap_content"
                android:layout_marginRight="20dp"
                android:text="TextView"/>
        </FrameLayout>
        <Spinner
            android:id="@+id/spinner1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"/>
    </LinearLayout>
    
    0 讨论(0)
  • 2020-11-28 03:11

    You can use a global layout listener for a TextView in any type of ViewGroup.

        final TextView dSTextView = (TextView)findViewById(R.id.annoyingTextView);
    dSTextView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
    
        @Override
        public void onGlobalLayout() {
            dSTextView.getViewTreeObserver().removeOnGlobalLayoutListener(this);
    
            float lineHeight = dSTextView.getLineHeight();
            int maxLines = (int) (dSTextView.getHeight() / lineHeight);
    
            if (dSTextView.getLineCount() != maxLines) {
                dSTextView.setLines(maxLines);
            }
    
        }
    });
    

    You can read more about it here

    0 讨论(0)
  • 2020-11-28 03:12

    After trying a million different things, I think I have the answer.

    I applied a LayoutGravity to the TextView item:

    android:layout_gravity="fill"
    

    Seems to solve all clipping issues I had. Hope this helps someone with the same problem.

    0 讨论(0)
  • 2020-11-28 03:12

    When this occurs, you should ensure that the TextView is not growing larger than it's container -

    If a TextView is set to wrap_content and it's container (or an ancestor container) doesn't leave room for the TextView to grow into it can be occluded.

    If that's not the case, it's also possible the onMeasure() of the TextView sometimes doesn't correctly measure the tails of letters, non-latin characters or the effects from text being italic. You can correct for this by setting a global style for your TextView so it will be picked up without needed to change your entire code base:

    Ensure that you're application/activities use a custom theme like so:

    <style name="Custom" parent="@android:style/Theme.Light">   
        <item name="android:textViewStyle">@style/Custom.Widget.TextView</item>
    </style>
    
    <style name="Custom.Widget.TextView" parent="@android:style/Widget.TextView"> 
        <item name="android:gravity">fill</item>
        <item name="android:padding">1sp</item>
    </style>
    

    The answer by @Rynadt was really helpful in getting to the above stage. Setting the gravity of the Text inside the View ensures on some devices that occlusion never takes place (The text is correctly fitted inside the view), on others a helping hand with padding of an sp value, ensures that the tails et al are accounted for with a TextSize specific value.

    0 讨论(0)
  • 2020-11-28 03:12

    I know it's so late, but this is work like charm for me. add this code to your textview

    android:ellipsize="marquee"
    android:layout_weight="1"
    
    0 讨论(0)
  • 2020-11-28 03:13

    I think there is very little you can do to get this working by altering the layouts. As I have found that some methods work only in some cases. I think it depends on the entire layout hierarchy and is not a one-size-fits-all solution. I have also noticed that it happens especially when you have a different font that you want to set to the TextView.

    A sure shot method that I have experimented and tested is that you can set the font attributes in code after the view is inflated. I am assuming that you have a font in the assets/fonts folder that you want to you.

    For eg in a Fragment:

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState)
    {
        View view = inflater.inflate(R.layout.fragment_view, container, false);
        TextView tv = (TextView)view.findViewById(R.id.text_view);
        tv.setText("Insert text that needs to be displayed");
        AssetManager assetManager = getContext().getAssets();
        Typeface typeFace = Typeface.createFromAsset(assetManager, "Fonts/OpenSans-Light.ttf");
        tv.setTypeface(typeFace , 0); // 0 is normal font
        tv.setPadding(10,  0, 10, 0); // This is not mandatory
    }
    

    And in an Activity:

    @Override
    protected void onCreate(Bundle savedInstanceState) 
    {
        super.onCreate(savedInstanceState);
        setContentView(Resource.Layout.main_activity);
        TextView tv = (TextView)this.findViewById(R.id.text_view);
        tv.setText("Insert text that needs to be displayed");
        AssetManager assetManager = getContext().getAssets();
        Typeface typeFace = Typeface.createFromAsset(assetManager, "Fonts/OpenSans-Light.ttf");
        tv.setTypeface(typeFace , 0); // 0 is normal font
        tv.setPadding(10,  0, 10, 0); // This is not mandatory
    }
    
    0 讨论(0)
提交回复
热议问题