web-dev-qa-db-ja.com

Android TextViewの自動水平スクロール

自動的にスクロールする単一行のテキストビューを実装しようとしています。しかし、残念ながらそれを機能させることはできません。 AutoScrollTextViewは、LinearLayout内で宣言されます(幅と高さ= fill_parent)。このクラスは基本的に、指定された量だけスクロールするために自身を呼び出すハンドラーを使用します。 1秒ごとに5ピクセルずつスクロールするテキストビューのみを表示するようにコードを簡略化しました。

ログ出力は正しく、getScrollX()メソッドは適切なscrollX位置を返します。

requestLayout()を呼び出さないと、何も描画されません。 invalidate()は効果がありません。

誰にも手がかりがありますか?

public class AutoScrollTextView extends TextView {

    public AutoScrollTextView(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        setSingleLine();
        setEllipsize(null);
        setText("Single-line text view that scrolls automatically if the text is too long to fit in the widget");
    }

    // begin to scroll the text from the original position
    public void startScrolling() {
        scrollHandler.sendEmptyMessage(0);
    }

    private Handler scrollHandler = new Handler() {
        private static final int REFRESH_INTERVAL = 1000;

        public void handleMessage(Message msg) {
            scrollBy(5, 0);
            requestLayout();
            Log.debug("Scrolled to " + getScrollX() + " px");
            sendEmptyMessageDelayed(0, REFRESH_INTERVAL);
        }
    };
}
54

TextViewをサブクラス化する必要がない場合は、レイアウトファイルでこれを試すことができます。

    <TextView
        Android:text="Single-line text view that scrolls automatically if the text is too long to fit in the widget" 
        Android:singleLine="true"
        Android:ellipsize="Marquee"
        Android:marqueeRepeatLimit ="Marquee_forever"
        Android:focusable="true"
        Android:focusableInTouchMode="true" 
        Android:scrollHorizontally="true"
        Android:layout_width="wrap_content" 
        Android:layout_height="wrap_content"/>

また、コードでは次を使用します。

findViewById(R.id.serviceColorCode).setSelected(true);

[コメントに基づいて編集された回答]

184
rajath

@rajatが回答したこれらのxmlコードの後

<TextView
        Android:text="Single-line text view that scrolls automatically if the text is too long to fit in the widget" 
        Android:singleLine="true" 
        Android:ellipsize="Marquee"
        Android:marqueeRepeatLimit ="Marquee_forever"
        Android:focusable="true"
        Android:focusableInTouchMode="true" 
        Android:scrollHorizontally="true"
        Android:layout_width="wrap_content" 
        Android:layout_height="wrap_content"/>

設定する必要があります

TextView tv=(TextView)findViewById(R.id.textview1);
  tv.setSelected(true); 

それはついに私の仕事をしました

18

私のソリューションは機能します:

_<TextView
     Android:id="@+id/titolotxt"
     Android:layout_width="..."
     Android:layout_height="..."
     Android:ellipsize="Marquee"
     Android:gravity="left"
     Android:marqueeRepeatLimit="Marquee_forever"
     Android:singleLine="true"
     Android:text="@string/titolo"/>
_

また、TextViewを選択して設定する必要があります。たとえば、onCreateのコードによってtextView.setSelected(true);を設定します。

16
alfo888_ibg
// this TextView will Marquee because it is selected
TextView marqueeText1 = (TextView) findViewById(R.id.Marquee_text_1);
marqueeText1.setSelected(true);

<TextView
    Android:id="@+id/Marquee_text_1"
    Android:layout_width="fill_parent"
    Android:layout_height="wrap_content"
    Android:text="Lorem ipsum dolor sit amet, consectetur adipiscing elit."
    Android:textSize="24sp"
    Android:singleLine="true"
    Android:ellipsize="Marquee"
    Android:marqueeRepeatLimit="Marquee_forever"
    Android:scrollHorizontally="true" />
1
A.G.THAMAYS

次のようにメインスレッドでinvalidateを呼び出すまで、無効化が機能しない場合があります。

handler.post(new Runnable() {

        @Override
        public void run() {
            yourView.invalidate();
        }
    });
0
Vitaliy A