15

ListView にいくつかのカスタム要素があり、各要素は、知る限り、LinearLayout の TextView にすぎません。テキストが長すぎる場合、 TextView 内のテキストを水平方向にスクロールする 1 行にしたいと思います。これに関する多くの投稿を読んで、うまくいくはずの解決策を思いつきましたが、テキスト全体をスクロールする代わりに、含まれているビューの長さに合わせてテキストを切り取り、3 つのドットで終了しました。3 つのドットは必要ありませんが、テキスト全体をスクロールする必要があります。

これは、リスト内の項目のレイアウトです (list_item.xml)

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/listItem"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@drawable/list_item_selector"
    android:orientation="horizontal"
    android:paddingBottom="7dp"
    android:paddingLeft="15dp"
    android:paddingTop="7dp" >

    <TextView
        android:id="@+id/listText"
        style="@style/Text_View_Style_White"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:ellipsize="marquee"
        android:focusableInTouchMode="true"
        android:marqueeRepeatLimit="marquee_forever" 
        android:padding="3dp"

        android:selectAllOnFocus="true"
        android:singleLine="true"
        android:textColor="@drawable/list_item_text_selector" />


</LinearLayout>

android:focusable="true"android:scrollHorizontally="true"および属性も試しandroid:maxLines="1"ましたが、どれも機能していません。getView()(BaseAdapter を拡張する) アダプターのメソッドでsetSelected(true)は、ビューを返す前に、TextView でメソッドを使用します。

何が問題なのかわかりません。どんな助けでも大歓迎です。

4

7 に答える 7

41

私は今日同じ問題を抱えていて、それを理解することができました。ここにリストされている解決策はどれもうまくいかなかったので、それを修正したものを共有したいと思いました.

TL;DR: TextView のテキストを動的に設定する場合は、必要な「マーキー」プロパティをレイアウト xml ファイルではなくコードで設定してみてください。

より長いバージョン: 私の場合、各項目にアダプターと TextView を備えた GridView がありました。一部の項目には長すぎてグリッドの「セル」に収まらないテキストが含まれていたため、長すぎて数回スクロールできないすべての項目が必要でした。TextView はアダプターを使用して GridView にあるため、テキストは明らかにアダプターの現在の項目からコードで設定されていました。

大変なデバッグ作業を経て、最終的にすべてのマーキー設定をレイアウト xml ファイルではなくコードで設定するというアイデアにたどり着きました。これにより、3 つのドット (...) が最終的に TextView から離れ、代わりにスクロールを開始しました。

レイアウト ファイルは次のようになります (上記のプロパティはどれもここでは設定されていないことに注意してください)。

<TextView
android:text="Placeholder"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="16dp"
android:id="@+id/name"
/>

そして、ここに私のアダプターコードがどのように見えるかがあります:

nameView.setText(name);
nameView.setEllipsize(TextUtils.TruncateAt.MARQUEE);
nameView.setSingleLine(true);
nameView.setMarqueeRepeatLimit(5);
nameView.setSelected(true);
于 2014-04-01T20:37:24.440 に答える
1

@iDroid Explorer が指摘したように、回答を投稿して受け入れることは、他の誰かの助けになる可能性があります。トムのコメントへの私の返信から適応:

私の問題の解決策を見つけました。いくつかの試行の後、私は問題が android:selectAllOnFocus="true" 行であることに気付きました (おそらく理由については @Tom の説明を読んでください)。その行を削除したところ、すべてが非常にうまく機能しています。テキストが完成し、含まれているビューには長すぎる場合に、必要に応じてスクロールします。

于 2015-01-07T08:44:03.057 に答える
0

layout_width を「match_parent」に設定してみてください。TextView は、省略記号が機能するために特定の幅を必要とし、「wrap_content」では機能しません。

于 2013-07-01T13:33:50.447 に答える
0
<TextView
    android:text="START | lunch 20.00 | Dinner 60.00 | Travel 60.00 | Doctor 5000.00 | lunch 20.00 | Dinner 60.00 | Travel 60.00 | Doctor 5000.00 | END"
android:id="@+id/MarqueeText" 
android:layout_width="fill_parent"
android:layout_height="wrap_content" 
android:singleLine="true"
android:ellipsize="marquee" 
android:marqueeRepeatLimit="marquee_forever"
android:scrollHorizontally="true" 
android:paddingLeft="15dip" 
android:paddingRight="15dip" 
android:focusable="true" 
android:focusableInTouchMode="true" 
android:freezesText="true">` 

textView.setSelected(true) // これらの行をアクティビティに追加します

于 2020-09-17T09:22:59.150 に答える