自動的にスクロールする単一行のテキストビューを実装しようとしています。しかし、残念ながらそれを機能させることはできません。 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);
}
};
}
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);
[コメントに基づいて編集された回答]
@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);
それはついに私の仕事をしました
私のソリューションは機能します:
_<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);
を設定します。
// 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" />
次のようにメインスレッドでinvalidateを呼び出すまで、無効化が機能しない場合があります。
handler.post(new Runnable() {
@Override
public void run() {
yourView.invalidate();
}
});