我是Android的菜鸟,我正在尝试创建一个使用textview marquee以自动收报机方式显示推文的小部件。当我在xml中设置文本时,选框会在窗口小部件中正确滚动。但是,当我尝试以编程方式设置文本时,选取框不会滚动。文本已设置,但它不会滚动。这种行为令人困惑,因为我使用this SO问题作为我的向导。非常感谢任何帮助。
我的布局
<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>
我的代码
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);
}
答案 0 :(得分:1)
我想这是以下问题:
方法setText(CharSequence)
正在重置MarqueeRepeatLimit。方法setText(CharSequence)
是RemotableViewMethod
,这意味着您可以从RemoteView访问它。 setMarqueeRepeatLimit()
没有这个特殊的注释。我认为没办法,如何设置Text并将你的Marquee状态保存在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());
}
}
答案 1 :(得分:1)
确保在XML中使用android:singleLine="true"
和android:scrollHorizontally="false"
(或完全删除它)。这应该可以解决问题。
答案 2 :(得分:1)
这可能适合你
在你的布局中:
<TextView
android:id="@+id/TextView03"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
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);
答案 3 :(得分:0)
试试这个。 在设置文本之前设置选框范围。
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);
答案 4 :(得分:0)
您可以使用以下代码在textView中滚动文本:
textView.setEllipsize(TextUtils.TruncateAt.MARQUEE);
textView.setSingleLine();
textView.setMarqueeRepeatLimit(10);
textView.setFocusable(true);
textView.setHorizontallyScrolling(true);
textView.setFocusableInTouchMode(true);
textView.requestFocus();