J'essaie d'implémenter une vue texte d'une seule ligne qui défilera automatiquement. Mais malheureusement, je ne peux pas le faire fonctionner. AutoScrollTextView est déclaré dans un LinearLayout (width et height = fill_parent). La classe utilise essentiellement un gestionnaire qui s’appelle lui-même pour faire défiler une quantité donnée. J'ai simplifié le code pour afficher uniquement une vue de texte défilant de 5 pixels par seconde.
La sortie du journal est correcte, la méthode getScrollX () renvoie la position scrollX appropriée.
Si je n'appelle pas requestLayout()
, rien n'est dessiné. invalidate()
n'a aucun effet.
Quelqu'un aurait-il un indice?
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);
}
};
}
Si vous n'avez pas besoin de sous-classer la TextView
, vous pouvez essayer ceci dans votre fichier de présentation:
<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"/>
En outre, dans votre code, utilisez ce qui suit:
findViewById(R.id.serviceColorCode).setSelected(true);
[Réponse modifiée en fonction des commentaires]
Après ces codes xml répondus par @rajat
<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"/>
Nous devons définir
TextView tv=(TextView)findViewById(R.id.textview1);
tv.setSelected(true);
qui a finalement fait le travail de mine
Ma solution fonctionne:
<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"/>
Et les TextView
doivent être configurés et sélectionnés: textView.setSelected(true);
par le code dans onCreate
par exemple.
Parfois invalider ne fonctionnera pas jusqu'à ce que vous appeliez invalidate dans le fil principal comme suit:
handler.post(new Runnable() {
@Override
public void run() {
yourView.invalidate();
}
});
// 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" />