¿Por qué la marquesina no funciona en Widget?
Soy un noob a android y estoy tratando de crear un widget que utiliza la marquesina textview para mostrar tweets en una moda ticker. Cuando establezco el texto en el xml, la marquesina se desplaza correctamente en el widget. Sin embargo, cuando intento establecer el texto de forma programática la marquesina no se desplaza. El texto se establece, pero no se desplaza. Este comportamiento es desconcertante porque utilicé esta pregunta como mi guía. Cualquier ayuda es muy apreciada.
Mi diseño
- Mostrar icono de emoji / emoción en Android TextView
- ¿Puedo deshabilitar el desplazamiento en TextView cuando se utiliza LinkMovementMethod?
- No se puede inflar correctamente el diseño de un fragmento en la aplicación de Android
- Android: ¿Cómo hago bloques no rompibles en TextView?
- ¿Cómo alinear el texto con sus elementos compuestos en TextView?
<TextView android:id="@+id/ticker" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentRight="true" android:duplicateParentState="true" android:ellipsize="marquee" android:fadingEdge="horizontal" android:focusable="true" android:focusableInTouchMode="true" android:lines="1" android:marqueeRepeatLimit="marquee_forever" android:scrollHorizontally="true" android:text="Simple application that shows how to use marquee, with a long text for Twitter Feed" > //<--this text scrolls fine <requestFocus android:duplicateParentState="true" android:focusable="true" android:focusableInTouchMode="true" /> </TextView>
Mi código
public static void updateAppWidget(Context context, AppWidgetManager appWidgetManager, int appWidgetId) { //String currentTime = df.format(new Date()); String spotgold = String.valueOf(MyActivity.widgetlivespotgold); String spotsilver = String.valueOf(MyActivity.widgetlivespotsilver); StringBuilder tickertweets=new StringBuilder(); for (int i = 0; i < MyActivity.twittername.size(); i++) { tickertweets.append(MyActivity.twittername.get(i) + ":" + " " + MyActivityActivity.twittertweet.get(i) + " "); } RemoteViews updateViews = new RemoteViews(context.getPackageName(), R.layout.widget1); updateViews.setTextViewText(R.id.goldspot, spotgold); updateViews.setTextViewText(R.id.silverspot, spotsilver); updateViews.setTextViewText(R.id.ticker, tickertweets.toString()); //Text is set, but doesn't scroll appWidgetManager.updateAppWidget(appWidgetId, updateViews); }
- Ellipsize sólo una sección en un TextView
- ¿Cómo puedo hacer que mi cuadro de diálogo de Android sea de pantalla completa?
- Repetir una acción mientras se pulsa el botón
- ¿Cómo dejar que un TextView tenga varias líneas?
- ¿Cómo utilizar la fuente personalizada en android xml?
- Cómo hacer que TextView se desplace en Android
- TextView redimensionado para ajustarse al texto
- ¿Cómo puedo mostrar elipses en mi TextView si es mayor que la línea 1?
Supongo que es el siguiente problema:
El método setText(CharSequence)
está restableciendo el MarqueeRepeatLimit. El método setText(CharSequence)
es un RemotableViewMethod
, lo que significa que puede acceder desde una RemoteView. setMarqueeRepeatLimit()
no tiene esta anotación especial. No veo ninguna manera, cómo usted podría fijar el texto y guardar su estado de Marquee dentro de un RemoteView. Tal vez el método SetText
de TextView le ayuda un poco
private void setText(CharSequence text, BufferType type, boolean notifyBefore, int oldlen) { if (text == null) { text = ""; } if (!mUserSetTextScaleX) mTextPaint.setTextScaleX(1.0f); if (text instanceof Spanned && ((Spanned) text).getSpanStart(TextUtils.TruncateAt.MARQUEE) >= 0) { setHorizontalFadingEdgeEnabled(true); setEllipsize(TextUtils.TruncateAt.MARQUEE); } int n = mFilters.length; for (int i = 0; i < n; i++) { CharSequence out = mFilters[i].filter(text, 0, text.length(), EMPTY_SPANNED, 0, 0); if (out != null) { text = out; } } if (notifyBefore) { if (mText != null) { oldlen = mText.length(); sendBeforeTextChanged(mText, 0, oldlen, text.length()); } else { sendBeforeTextChanged("", 0, 0, text.length()); } }
Asegúrese de usar android:singleLine="true"
y android:scrollHorizontally="false"
(o eliminarlo completamente) en su XML. Esto debería funcionar.
Prueba esto. Establezca el intervalo de Marquee antes de configurar el texto.
SpannableString buffer = new SpannableString(tickertweets.toString()); buffer.setSpan(TextUtils.TruncateAt.MARQUEE,0, (tickertweets.length() -1) ,Spannable.SPAN_INCLUSIVE_INCLUSIVE); updateViews.setTextViewText(R.id.ticker, buffer);
Esto podría funcionar para usted
En su diseño:
<TextView android:id="@+id/TextView03" android:layout_width="wrap_content" android:layout_height="wrap_content" android:marqueeRepeatLimit="marquee_forever" android:text=""/>
En su código:
TextView textView = (TextView)findViewById(R.id.TextView03); textView.setText(";lkjdf;alkdsfjoiawejrokajdsl;fkadmnsflkamndvklahoreiuaweifjakldsmflkhfgoueyhtoaijpkjdflkahndsofuhyoeia"); textView.setHorizontallyScrolling(true); textView.setEllipsize(TextUtils.TruncateAt.MARQUEE); textView.setSingleLine(); textView.setSelected(true);