为啥 Marquee 在小部件中不起作用?
Posted
技术标签:
【中文标题】为啥 Marquee 在小部件中不起作用?【英文标题】:Why Is Marquee Not Working In Widget?为什么 Marquee 在小部件中不起作用? 【发布时间】:2012-11-25 18:04:33 【问题描述】:我是 android 的菜鸟,我正在尝试创建一个小部件,该小部件使用 textview marquee 以自动收报机方式显示推文。当我在 xml 中设置文本时,选框在小部件中正确滚动。但是,当我尝试以编程方式设置文本时,选取框不会滚动。文本已设置,但它只是不滚动。这种行为令人费解,因为我使用this SO 问题作为我的指导。非常感谢任何帮助。
我的布局
<TextView
android:id="@+id/ticker"
android:layout_
android:layout_
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>
我的代码
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);
【问题讨论】:
【参考方案1】:我猜是以下问题:
方法 setText(CharSequence)
正在重置 MarqueeRepeatLimit。方法setText(CharSequence)
是RemotableViewMethod
,这意味着您不能从RemoteView 访问它。 setMarqueeRepeatLimit()
没有这个特殊的注释。我看不出,如何设置文本并将选取框状态保持在 RemoteView 中。
也许 TextView 中的 SetText
方法对你有一点帮助
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());
【讨论】:
Rafael 感谢您的回复。我是android新手,不完全理解你的答案。我是否将我当前的方法替换为您推荐的 setText 方法? 不,抱歉答案不清楚。我是说不可能(在我看来)在 RemoteView 中更改带有 marqueeflag 的字符串。您必须在 XML 中定义一个静态字符串并且不要触摸 TextView,或者您可以在没有 Marquee 的情况下动态设置文本【参考方案2】:确保在您的 XML 中使用 android:singleLine="true"
和 android:scrollHorizontally="false"
(或将其完全删除)。这应该可以解决问题。
【讨论】:
感谢您的回复。我尝试了您的建议,但没有奏效。 哦,我看到您的代码中还设置了scrollHorizontally
。这没有意义,因为这会使您的文本可滚动(使用触摸)而不是使用选取框功能。尝试将android:scrollHorizontally="false"
(或完全删除)与android:singleLine="true"
结合使用。【参考方案3】:
这可能对你有用
在您的布局中:
<TextView
android:id="@+id/TextView03"
android:layout_
android:layout_
android:marqueeRepeatLimit="marquee_forever"
android:text=""/>
在您的代码中:
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);
【讨论】:
【参考方案4】:试试这个。 在设置文本之前设置 Marquee 跨度。
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);
【讨论】:
感谢您的回复。我尝试了您的建议,但没有奏效。【参考方案5】:您可以使用此代码在 textView 中滚动文本:
textView.setEllipsize(TextUtils.TruncateAt.MARQUEE);
textView.setSingleLine();
textView.setMarqueeRepeatLimit(10);
textView.setFocusable(true);
textView.setHorizontallyScrolling(true);
textView.setFocusableInTouchMode(true);
textView.requestFocus();
【讨论】:
以上是关于为啥 Marquee 在小部件中不起作用?的主要内容,如果未能解决你的问题,请参考以下文章
isPlaceholder 修饰符不可用且在小部件工具包 + SwiftUI 中不起作用
为啥我的 Center 小部件在 Dart 中不起作用? |扑
ScaffoldMessenger.of(context).showSnackBar() 在小部件构建函数中直接调用时不起作用