web-dev-qa-db-ja.com

TextView Android:ellipsize = "Marquee"が期待どおりに機能しない

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"_属性も試してみましたが、いずれも機能していません。 (BaseAdapterを拡張する)アダプターのgetView()メソッドでは、ビューを返す前に、TextViewでsetSelected(true)メソッドを使用します。

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

14
Andre

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

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

1
Andre

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

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);
31
kdenney

重要なのは、テキストビューでsetSelected(true);を実行することです。もちろんです。

Android:ellipsize="Marquee"
Android:scrollHorizontally="true"

xmlでも設定する必要があります。このマーキーのすべてがなければ、起こりません。これまで。

13
Ewoks

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

0
chrisbjr

LinearLayoutまたはTextViewHorizontalScrollViewの中に入れます。これにより、テキストが完全に表示され、左右にスクロールできるようになります。

0
BC2

TextViewで同じ問題に直面していましたが、テキストの最後に表示される理由がわかりました。

               <TextView
                Android:id="@+id/MarqueeText"
                Android:layout_width="wrap_content"
                Android:layout_height="wrap_content"
                Android:layout_centerVertical="true"
                Android:layout_marginLeft="2dp"
                Android:ellipsize="Marquee"
                Android:singleLine="true"
                Android:maxLines="1"
                Android:textColor="@color/text_gray"
                Android:textSize="14sp"
                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" />

と私の活動の初期化後

MarqueeText.setSelected(true);

私は自分の問題の解決策を見つけました。何度か試した結果、問題はAndroid:textIsSelectable="true"であることがわかりました。その行を削除したところ、すべてが非常にうまく機能しています。テキストが完成し、含まれているビューに対して長すぎる場合は、希望どおりにスクロールします。

0
Atif AbbAsi