web-dev-qa-db-ja.com

Android:textviewの最後の行が途切れる

LinearLayoutに続いてTextViewが続く水平Spinnerがあります。このLinearLayoutは、LinearLayout内に含まれる固定垂直RelativeLayoutで動的に複数回膨張します。

問題は、Theme.lightからTheme.holo.lightに切り替えたため、TextViewの最後の行が半分にカットされることです。これは、ダイナミックテキストが長く、複数行にわたる場合に発生します。

enter image description here

LinearLayoutおよびTextViewを含む水平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">

    <TextView
        Android:id="@+id/textView1"
        Android:layout_width="150dp"
        Android:layout_height="wrap_content"
        Android:layout_marginRight="20dp"
        Android:text="TextView"/>

    <Spinner
        Android:id="@+id/spinner1"
        Android:layout_width="wrap_content"
        Android:layout_height="wrap_content"/>

</LinearLayout>

上記のレイアウトがID ll2_7のリニアレイアウトで動的に拡張される相対レイアウト:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:layout_width="match_parent"
    Android:layout_height="match_parent" >

    <ScrollView
        Android:id="@+id/scrollView"
        Android:layout_width="fill_parent"
        Android:layout_height="wrap_content"
        Android:layout_above="@+id/relLayoutButtonNext"
        Android:layout_below="@id/textView1" >

        <RelativeLayout
            Android:layout_width="fill_parent"
            Android:layout_height="wrap_content"
            Android:paddingBottom="20dp"
            Android:paddingLeft="10dp"
            Android:paddingRight="10dp"
            Android:paddingTop="10dp" >

            <TextView
                Android:id="@+id/textView10"
                Android:layout_width="wrap_content"
                Android:layout_height="wrap_content"
                Android:paddingRight="30dp"
                Android:text="2.7" />

            <TextView
                Android:id="@+id/textView11"
                Android:layout_width="wrap_content"
                Android:layout_height="wrap_content"
                Android:layout_marginBottom="10dp"
                Android:layout_toRightOf="@id/textView10"
                Android:text="@string/question2_7" />


            <LinearLayout
                Android:id="@+id/ll2_7"
                Android:layout_width="wrap_content"
                Android:layout_height="wrap_content"
                Android:layout_alignLeft="@+id/textView11"
                Android:layout_below="@+id/textView11"
                Android:orientation="vertical" Android:layout_marginBottom="20dp">
            </LinearLayout>

        </RelativeLayout>

    </ScrollView>

</RelativeLayout>

編集:上記の完全なレイアウトxmlは次のとおりです。

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:layout_width="match_parent"
    Android:layout_height="match_parent" >

    <TextView
        Android:id="@+id/textView1"
        style="@style/question_section_title"
        Android:layout_width="wrap_content"
        Android:layout_height="wrap_content"
        Android:layout_alignParentLeft="true"
        Android:layout_alignParentTop="true"
        Android:text="@string/question2_header" />

    <RelativeLayout
        Android:id="@+id/relLayoutButtonNext"
        Android:layout_width="fill_parent"
        Android:layout_height="wrap_content"
        Android:layout_alignParentBottom="true"
        Android:background="@color/bottomBar"
        Android:paddingBottom="3dp"
        Android:paddingLeft="50dp"
        Android:paddingRight="50dp"
        Android:paddingTop="3dp" >

        <Button
            Android:id="@+id/buttonNext"
            Android:layout_width="180dp"
            Android:layout_height="wrap_content"
            Android:layout_alignParentRight="true"
            Android:onClick="NeXTSTEP"
            Android:text="Next Section"
            Android:textSize="20sp" />

        <Button
            Android:id="@+id/buttonPrevious"
            Android:layout_width="180dp"
            Android:layout_height="wrap_content"
            Android:layout_alignParentLeft="true"
            Android:layout_alignParentTop="true"
            Android:onClick="previousStep"
            Android:text="Previous Section"
            Android:textSize="20sp" />
    </RelativeLayout>


    <ScrollView
        Android:id="@+id/scrollView"
        Android:layout_width="fill_parent"
        Android:layout_height="wrap_content"
        Android:layout_above="@+id/relLayoutButtonNext"
        Android:layout_below="@id/textView1" >



        <RelativeLayout
            Android:layout_width="fill_parent"
            Android:layout_height="wrap_content"
            Android:paddingBottom="20dp"
            Android:paddingLeft="10dp"
            Android:paddingRight="10dp"
            Android:paddingTop="10dp" >

            <TextView
                Android:id="@+id/textView10"
                Android:layout_width="wrap_content"
                Android:layout_height="wrap_content"
                Android:paddingRight="30dp"
                Android:text="2.7" />

            <TextView
                Android:id="@+id/textView11"
                Android:layout_width="wrap_content"
                Android:layout_height="wrap_content"
                Android:layout_marginBottom="10dp"
                Android:layout_toRightOf="@id/textView10"
                Android:text="@string/question2_7" />


            <LinearLayout
                Android:id="@+id/ll2_7"
                Android:layout_width="wrap_content"
                Android:layout_height="wrap_content"
                Android:layout_alignLeft="@+id/textView11"
                Android:layout_below="@+id/textView11"
                Android:orientation="vertical" Android:layout_marginBottom="20dp">

            </LinearLayout>

            <TextView
                Android:id="@+id/textView2"
                Android:layout_width="wrap_content"
                Android:layout_height="wrap_content"
                Android:layout_alignLeft="@+id/textView10"
                Android:layout_below="@+id/ll2_7"
                Android:text="2.8" />

            <TextView
                Android:id="@+id/textView3"
                Android:layout_width="wrap_content"
                Android:layout_height="wrap_content"
                Android:layout_below="@+id/ll2_7"
                Android:layout_toRightOf="@+id/textView10"
                Android:text="@string/question2_8" Android:layout_marginBottom="10dp"/>


            <LinearLayout
                Android:id="@+id/ll2_8"
                Android:layout_width="wrap_content"
                Android:layout_height="wrap_content"
                Android:layout_alignLeft="@+id/textView3"
                Android:layout_below="@+id/textView3"
                Android:layout_marginBottom="20dp"
                Android:orientation="vertical" >

            </LinearLayout>

            <TextView
                Android:id="@+id/textView4"
                Android:layout_width="wrap_content"
                Android:layout_height="wrap_content"
                Android:layout_alignLeft="@+id/textView2"
                Android:layout_below="@+id/ll2_8"
                Android:text="2.9" />

            <TextView
                Android:id="@+id/textView5"
                Android:layout_width="wrap_content"
                Android:layout_height="wrap_content"
                Android:layout_below="@+id/ll2_8"
                Android:layout_toRightOf="@+id/textView10"
                Android:text="@string/question2_9" Android:layout_marginBottom="10dp"/>


            <LinearLayout
                Android:id="@+id/ll2_9"
                Android:layout_width="wrap_content"
                Android:layout_height="wrap_content"
                Android:layout_below="@+id/textView5"
                Android:layout_toRightOf="@+id/textView10"
                Android:orientation="vertical" Android:layout_marginBottom="20dp">

            </LinearLayout>

            <TextView
                Android:id="@+id/textView6"
                Android:layout_width="wrap_content"
                Android:layout_height="wrap_content"
                Android:layout_alignLeft="@+id/textView4"
                Android:layout_below="@+id/ll2_9"
                Android:text="2.10" />

            <TextView
                Android:id="@+id/textView7"
                Android:layout_width="wrap_content"
                Android:layout_height="wrap_content"
                Android:layout_below="@+id/ll2_9"
                Android:layout_toRightOf="@+id/textView10"
                Android:text="@string/question2_10" Android:layout_marginBottom="10dp"/>


            <LinearLayout
                Android:id="@+id/ll2_10"
                Android:layout_width="wrap_content"
                Android:layout_height="wrap_content"
                Android:layout_below="@+id/textView7"
                Android:layout_marginBottom="20dp"
                Android:layout_toRightOf="@+id/textView10"
                Android:orientation="vertical" >

            </LinearLayout>

            <TextView
                Android:id="@+id/textView8"
                Android:layout_width="wrap_content"
                Android:layout_height="wrap_content"
                Android:layout_alignLeft="@+id/textView6"
                Android:layout_below="@+id/ll2_10"
                Android:text="2.11" />

            <TextView
                Android:id="@+id/textView9"
                Android:layout_width="wrap_content"
                Android:layout_height="wrap_content"
                Android:layout_below="@+id/ll2_10"
                Android:layout_toRightOf="@+id/textView10"
                Android:text="@string/quesiton2_11" Android:layout_marginBottom="10dp"/>


            <LinearLayout
                Android:id="@+id/ll2_11"
                Android:layout_width="wrap_content"
                Android:layout_height="wrap_content"
                Android:layout_alignLeft="@+id/textView9"
                Android:layout_below="@+id/textView9"
                Android:orientation="vertical" Android:layout_marginBottom="20dp">

            </LinearLayout>

            <TextView
                Android:id="@+id/textView12"
                Android:layout_width="wrap_content"
                Android:layout_height="wrap_content"
                Android:layout_alignLeft="@+id/textView8"
                Android:layout_below="@+id/ll2_11"
                Android:text="2.11.1" />

            <TextView
                Android:id="@+id/textView13"
                Android:layout_width="wrap_content"
                Android:layout_height="wrap_content"
                Android:layout_below="@+id/ll2_11"
                Android:layout_toRightOf="@+id/textView10"
                Android:text="@string/question2_11_1" Android:layout_marginBottom="10dp"/>


            <LinearLayout
                Android:id="@+id/ll2_11_1"
                Android:layout_width="wrap_content"
                Android:layout_height="wrap_content"
                Android:layout_below="@+id/textView13"
                Android:layout_toRightOf="@+id/textView10"
                Android:orientation="vertical" Android:layout_marginBottom="20dp">

            </LinearLayout>

        </RelativeLayout>

    </ScrollView>

</RelativeLayout>
108
Rynardt

スクリーンショットに示されているのと同じカットオフ問題に遭遇しました。これは、水平LinearLayoutのベースラインの配置が原因です。 TextViewSpinnerは、フォントサイズの違いによりベースラインが異なります。この問題を修正するには、次を設定してレイアウトのベースラインの配置を無効にする必要があります。

Android:baselineAligned="false"

またはコード内:

layout.setBaselineAligned(false);
42
Jusid

何百万ものことを試した後、私は答えを持っていると思います。

TextViewアイテムにLayoutGravityを適用しました。

Android:layout_gravity="fill"

私が持っていたすべてのクリッピングの問題を解決するようです。これが同じ問題を抱えている人を助けることを願っています。

257
Rynardt

私は同じ問題を抱えていて、単純に追加することがわかりました

Android:includeFontPadding="false"

テキストの最終行では、子孫がクリップされなくなりました。

25
Thorinside

テキストを追加してダミーのスペースを追加しました

textView.setText(firstString+"\n");

私は他のすべての解決策を試しましたが、これが私のために働いた唯一の解決策でした

10
Ameer

問題のあるテキストビューをフレームレイアウト内に配置します。兄弟ビュー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>
6
Rubin Yoo

この場合、TextViewがコンテナより大きくならないようにする必要があります-

TextViewwrap_contentに設定されていて、そのコンテナ(または祖先コンテナ)がTextViewに成長する余地を残さない場合は、閉塞できます。

そうでない場合は、TextViewonMeasure()が、文字の末尾、非ラテン文字、または斜体のテキストの効果を正しく測定しない場合もあります。これを修正するには、TextViewにグローバルスタイルを設定します。これにより、コードベース全体を変更することなくスタイルが選択されます。

アプリケーション/アクティビティが次のようなカスタムテーマを使用していることを確認します。

<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>

@Rynadtの答えは、上記の段階に到達するのに本当に役に立ちました。ビュー内のテキストの重力を設定すると、一部のデバイスではオクルージョンが発生しないことが保証されます(テキストはビュー内に正しくフィットします)。 TextSize固有の値。

5
Graeme

TextViewを拡張し、次のようなカスタムクラスを追加することで、別のソリューションを見つけました。

 public class AdaptingTextView extends TextView {

    public AdaptingTextView(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
    }

    public AdaptingTextView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public AdaptingTextView(Context context) {
        super(context);
    }

    @Override
    protected void onSizeChanged(int w, int h, int oldw, int oldh) {
        super.onSizeChanged(w, h, oldw, oldh);

        // set fitting lines to prevent cut text
        int fittingLines = h / this.getLineHeight();
        if (fittingLines > 0) {
            this.setLines(fittingLines);
        }
    }

}
5
Display name

私の解決策は受け入れられたものに近かったが、私はそれを

   Android:layout_gravity="fill_vertical"

代わりに。そうしないと、他の行もランダムに配置され、改行が追加されます。たとえば、最大の行には4行あるため、別の行が

this is a testphrase

thi
s is
a testph
rase
4
Spookysister

android:paddingBottom = "20dp"を削除してみてください

から

 <RelativeLayout
            Android:layout_width="fill_parent"
            Android:layout_height="wrap_content"
            Android:paddingBottom="20dp"
            Android:paddingLeft="10dp"
            Android:paddingRight="10dp"
            Android:paddingTop="10dp" >
4
Dheeresh Singh

任意のタイプのViewGroupでTextViewのグローバルレイアウトリスナーを使用できます。

    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);
        }

    }
});

それについてもっと読むことができます こちら

3
Jim Baca

この問題があり、TextViewRelativeLayout内にある場合は、RelativeLayoutLinearLayoutに切り替えてみてください。

それは私のために問題を修正しました

3
JesperB

getViewTreeObserver().addOnGlobalLayoutListenerは、リサイクラビューでは機能しません。リサイクラを使用している場合は、View.addOnLayoutChangeListenerを使用します。

XmlのtextViewに対して定義した省略記号が常に反映されないことがわかったため、textプロパティを再割り当てする前にプログラムで設定しました。これは私のために働いた。

textView.addOnLayoutChangeListener(new OnLayoutChangeListener() {
    @Override
        public void onLayoutChange(View v, int left, int top, int right, int bottom,
                                   int oldLeft, int oldTop, int oldRight, int oldBottom) {
            textView.removeOnLayoutChangeListener(this);
            float lineHeight = textView.getLineHeight();
            int maxLines = (int) (textView.getHeight() / lineHeight);
            if (textView.getLineCount() != maxLines) {
                textView.setLines(maxLines);
                textView.setEllipsize(TextUtils.TruncateAt.END);
                // Re-assign text to ensure ellipsize is performed correctly.
                textView.setText(model.getText());
            }
        }
    });
3
mp501

レイアウトを変更してこれを機能させるためにできることはほとんどないと思います。私が見つけたように、いくつかの方法はいくつかの場合にのみ機能する。私はそれがレイアウト階層全体に依存しており、万能のソリューションではないと思います。また、特にTextViewに設定する別のフォントがある場合に発生することにも気付きました。

私が実験してテストした確かな方法は、ビューが膨張した後にコードでフォント属性を設定できることです。私は、あなたが望むアセット/フォントフォルダにフォントがあると仮定しています。

たとえば、フラグメント内の場合:

@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
}

そしてアクティビティで:

@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
}
1
Mahesh Iyer

私もこれと同じ問題を抱えており、非常に迷惑です。

アラビア語のテキストでのみ発生します。

ラベルを複数行にし、文字列の最後に\nを追加すると、それは修正されますが、問題はこのラベルとその下のオブジェクトの間に大きなギャップがあることですこのフィールドの下に新しい空の行があるという事実。

それを回避するためにカスタムコントロールを行うことができます。しかし、全体的に、これは迷惑なバグです。

1
Adel Ammari

これに対する最善の回避策は、ビューの下部に希望する高さのダミービューを追加することです(つまり、これによりパディング自体が追加されます)。

<TableRow
 Android:layout_width="fill_parent"
 Android:layout_height="wrap_content"
 Android:layout_marginLeft="5dp"
 Android:layout_marginRight="5dp" >
     <View 
       Android:layout_width="match_parent" 
       Android:layout_height="30dp"/>
</TableRow>

私の場合のように、ビューの下部にもう1行テーブルを追加しました。これが誰かを助けることを願っています。

0
Anuj Sharma

私はそれがとても遅いことを知っていますが、これは私にとって魅力のような仕事です。このコードをtextviewに追加します

Android:ellipsize="Marquee"
Android:layout_weight="1"
0
dewy

テキストビューの下部にパディングを追加します。

Android:paddingBottom="24dp"
0
Phil