【问题标题】: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_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);
}

【问题讨论】:

    标签: android string android-widget textview marquee


    【解决方案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_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);
    

    【讨论】:

      【解决方案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();
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-07-08
        • 1970-01-01
        • 2021-09-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-01-21
        • 1970-01-01
        相关资源
        最近更新 更多