Android:テキストビューの最後の行が途切れる


113

私はそれを横に続けてLinearLayout含む横を持っています。これは、内に含まれる固定垂直で複数回動的に膨張します。TextViewSpinnerLinearLayoutLinearLayoutRelativeLayout

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

ここに画像の説明を入力してください

私は横に下のパディングを追加することによってこの問題を解決することができましたLinearLayout含むTextViewSpinner

これは修正のようには感じられませんが、ハックのようなものです。誰かが私にこれを適切に修正する方法についていくつかのアドバイスをお願いできますか?

他の質問も読みましたが、どれも役に立たないようです。

水平線形レイアウト:

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

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

2
テキストビューをパディングしてみてください。線形のレイアウトマージンも良い手を与える可能性があります
Aashish Bhatnagar

LinearLayoutは、水平方向に使用すると本当に問題があります。代わりにConstraintLayoutを使用してください。見る。stackoverflow.com/a/48677954/630668
Dharmendra

回答:


55

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

android:baselineAligned="false"

またはコードで:

layout.setBaselineAligned(false);

2
これに100回賛成票を投じたいと思います。私はこの問題について過去数日間で非常に多くの時間を無駄にしました、そしてあなたの答えは私の解決策でした!Androidでビュー階層をデバッグするのは非常に難しいため、何が起こっているのか理解できませんでした。本当にありがとう!!!
mbm29414

これは、リナートの答えに加えて、私の問題の解決策でした。ありがとうございました!
James Dobson、2015

1
これは正解であり、エラーが発生した理由を示しています。ありがとう。
Hoang Nguyen Huu

これは、このような状況の大きなヒントです。悪くない、全く。ありがとうございました!
sunlover3

260

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

LayoutGravityTextViewアイテムにを適用しました:

android:layout_gravity="fill"

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


12
完璧、tnx、+ 1; 多くのlayout_gravity値が役立つことに注意してください。center_vertical
Grzegorz Dev

2
これが機能しない場合、「1sp」のパディング値を追加すると機能するはずです。I拡張スタイルを作成@android:style/Widget.TextViewし、次の行を追加します<item name="android:gravity">fill</item> <item name="android:padding">1sp</item>
グレアム

なぜこの問題はアラビア語のテキストだけで発生するのですか?
Menna-Allah Sami 2015

12
それは単なる回避策です。適切な解決策はandroid:baselineAligned="false"あなたに追加することですLinearLayout
tomrozb

1
これは仕事に見えますが、正しい解決策は、上記tomrozbさんのコメントから1、またはJusidの答えである
エドゥアルト・B.

28

同じ問題があり、単純に

android:includeFontPadding="false"

テキストの最終行では、ディセンダーがクリップされなくなりました。


1
カスタムフォントの場合、これで完全に修正できる可能性があります。これは、Droid Sans Japaneseを使用するときに私にとって有効な唯一のソリューションです。
コンピューティング

11

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

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

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


これは "chepi"と呼ばれます
Zulqurnain Jutt

6

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

1
私が持っていたCheckBox同じでLinearLayout。これで問題は解決しました。
Chintan Shah 2018

@ChintanShahのようなCheckBoxシチュエーションでチャームのように動作しました
ignacardel

5

これが発生した場合は、 TextViewコンテナより大きくならない -

場合TextViewに設定されwrap_content、それのコンテナ(または先祖コンテナ)の余地残していないTextView、それが閉塞することが可能に成長するが。

それはそうではないなら、それも可能ですonMeasure()TextView、時々 、正しく文字、非ラテン文字や斜体をされているテキストからの影響の尾を測定しません。これを修正するには、グローバルスタイルを設定します。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の回答は、上記の段階に到達するのに非常に役立ちました。ビュー内のテキストの重力を設定すると、一部のデバイスではオクルージョンが発生しないことが保証されます(テキストはビュー内に正しくフィットします)。他のデバイスでは、sp値のパディングを使用して、尾などが考慮されます。 TextSize固有の値。


5

私の解決策は承認されたものに近かったが、それを次のように変更する必要があった

   android:layout_gravity="fill_vertical"

代わりに。それ以外の場合は、他の行もストレッチされ、ランダムな場所に改行が追加されます。たとえば、最大の行は4行だったので、別の行が

this is a testphrase

thi
s is
a testph
rase

1
私のために働く。ありがとう!+1
アーメド

5

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

}

うまく機能しますが、textviewにlayout_marginを指定している場合は、フィッティングラインの数が本来よりも短くなる可能性があるので注意してください。余白の代わりにパディングを使用するように切り替え、問題を修正しました
MobileMon

1
これは完全に機能します。私が見つけた断然最高の解決策。
Moonbloom 2017年

1
これは正解です、ありがとう!少し見栄えをよくして、テキストの最後に「...」を追加this.setEllipsize(TextUtils.TruncateAt.END);してから切り詰める前に、上記のifステートメントに追加し、android:ellipsize="end"何らかの理由で壊れているXMLから削除します。
NeilS 2017

4

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

1
この相対レイアウト内に追加の項目が含まれているため、実際のパディングは関連していません。この投稿を読みやすくするために削除しました。問題の編集を参照してください。
Rynardt 2012年

4

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

textViewxmlで定義した省略記号が常に反映されているわけではないので、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

あなたはこの問題とあなたの持っている場合はTextView内部にあるがRelativeLayout、切り替えてみてくださいRelativeLayoutためにLinearLayout

それで問題が解決しました


これが私にとって有効な唯一の解決策です(奇妙な動作)!Thx
mrroboaat

1
どうすれば、RelativeLayoutからLinearLayoutに単純に「切り替える」ことができますか?比較的レイアウトする必要がある場合、LinearLayoutで実装することはほぼ不可能です。
信じられない月

3

任意のタイプの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);
        }

    }
});

あなたはそれについてここでもっと読むことができます


1

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

私が実験してテストした確かな方法は、ビューがインフレートされた後にコードでフォント属性を設定できることです。あなたがあなたがあなたが望むassets / fontsフォルダにフォントを持っていると仮定しています。

例えばフラグメントの場合:

@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

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

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

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

これを回避するためにカスタムコントロールを実行できます。しかし全体として、これは厄介なバグです。


新しい質問がある場合は、[ 質問する ]ボタンをクリックして質問してください。十分な評判がある場合は、質問に賛成票を投じください。または、お気に入りとして「スター」すると、新しい回答が通知されます。
Martijn Pieters

0

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

<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

遅いのはわかっていますが、これは私にとって魅力的な作品です。このコードをあなたのtextview

android:ellipsize="marquee"
android:layout_weight="1"

0

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

android:paddingBottom="24dp"

-1

ようやく修正しました!

サービスのTextView 文字列を追加しようとしています scrollTo()を呼び出すと、最後の行が切り取られます。

scrollTo()は、次のように「Runnable」で呼び出す必要があります。

private ScrollView mScrollView;
public void scrollToBottom()
{
    mScrollView = (ScrollView) findViewById(R.id.debug_textview_scrollview);
    mScrollView.post(new Runnable()
    {
        public void run()
        {
            mScrollView.fullScroll(View.FOCUS_DOWN);
        }
    });
}

サービスのscrollTo()呼び出しのモネントでは、TextViewの更新の準備ができていないためだと思います。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.