TextView setSelected(false)不会停止Marquee

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了TextView setSelected(false)不会停止Marquee相关的知识,希望对你有一定的参考价值。

我有一个TextView,我在CardFragment,在GridViewPager内使用。 TextView将永远保留。但是当用户实际上看不到TextView时,我希望它停止滚动。

<TextView
    android:id"@+id/text"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:ellipsize="marquee"
    android:marqueeRepeatLimit="marquee_forever"
    android:singleLine="true"/>

为了让TextView实际开始滚动我调用setSelected(true),但是当我在片段的setSelected(false)方法中调用onPause()时,没有任何反应,文本继续滚动。我知道onPause()被调用了,当我在isSelected()上调用TextView时它会返回false。

当我离开两页以上时,文本只停止滚动。我相信这是因为片段在不接近当前页面时实际上被破坏,然后在它重新开始时重新创建。

如何让TextView停止滚动(实际上没有破坏片段)?我也尝试过setMarqueeRepeatLimit(0)(再次选择setMarqueeRepeatLimit(-1)),但这也不起作用。

编辑:当前的xml代码:

<TextView
    android:id"@+id/text"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:ellipsize="end"
    android:marqueeRepeatLimit="marquee_forever"
    android:singleLine="true"/>

片段代码:

public class MyCardFragment extends CardFragment {
    private static final String TAG = MyCardFragment.class.getSimpleName();

    private String mText;

    private Context mContext;

    private TextView mTextView;

    public static MyCardFragment create(String text) {
        mText = text;
    }

    @OVerride
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        mContext = getActivity().getApplicationContext();
    }

    @Override
    public View onCreateContentView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.card_fragment, container, false);

        mTextView = (TextView) view.findViewById(R.id.text);
        mTextView.setText(mText);
        mTextView.setSelected(true);

        return view;
    }

    @Override
    public void onPause() {
        super.onPause();
        mTextView.setEllipsize(TextUtils.TruncateAt.END);
        Log.d(TAG, "text: " + mTextView.getText() + " ellipsize: " + mTextView.getEllipsize());
    }

    public void onSelected() {
        mTextView.setEllipsize(TextUtils.TruncateAt.MARQUEE);
        Log.d(TAG, "text: " + mTextView.getText() + " ellipsize: " + mTextView.getEllipsize());
    }
}

我的活动实现了GridViewPager.OnPageChangeListener来调用onSelected()

public class MainActivity implements GridViewPager.OnPageChangeListener {

    ...

    @Override
    public void onPageSelected(int row, int column) {
        MyCardFragment fragment = (MyCardFragment) mPagerAdapter.findExistingFragment(row, column);
        fragment.onSelected();
    }
}
答案

您可以使用setEllipsize()将ellipsize属性设置为none。

下面的代码适用于我:

public class MainActivity extends AppCompatActivity {

    private TextView textView;
    private TextUtils.TruncateAt noneEllipsize;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        textView = (TextView) findViewById(R.id.title);
        noneEllipsize = textView.getEllipsize(); // activity_main.xml has ellipsize property set to 'none'.
        textView.setSelected(true);
    }

    public void btnToggleMarqueeClick(View view) {
        if ( textView.getEllipsize() != noneEllipsize ) {
            textView.setEllipsize(noneEllipsize);
        } else {
            textView.setEllipsize(TextUtils.TruncateAt.MARQUEE);
        }
    }
}

这是我的activity_main.xml文件:

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent"
android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
android:paddingBottom="@dimen/activity_vertical_margin"
android:orientation="vertical"
tools:context=".MainActivity">

<TextView
    android:id="@+id/title"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:ellipsize="none"
    android:marqueeRepeatLimit="marquee_forever"
    android:text="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"
    android:singleLine="true"/>

<Button
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="Start"
    android:id="@+id/btnToggleMarquee"
    android:onClick="btnToggleMarqueeClick"/>
</LinearLayout>

建议对您的代码进行以下更改

更新布局xml如下

<TextView
android:id"@+id/text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:ellipsize="none"
android:marqueeRepeatLimit="marquee_forever"
android:singleLine="true"/>

更新片段代码如下:

public class MyCardFragment extends CardFragment {
    private static final String TAG = MyCardFragment.class.getSimpleName();

    private String mText;

    private Context mContext;

    private TextView mTextView;

    private TextUtils.TruncateAt noneEllipsize;

    public static MyCardFragment create(String text) {
        mText = text;
    }

    @OVerride
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        mContext = getActivity().getApplicationContext();
    }

    @Override
    public View onCreateContentView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.card_fragment, container, false);

        mTextView = (TextView) view.findViewById(R.id.text);
        noneEllipsize = mTextView.getEllipsize();
        mTextView.setText(mText);
        mTextView.setSelected(true);

        return view;
    }

    @Override
    public void onPause() {
        super.onPause();
        mTextView.setEllipsize(noneEllipsize);
        Log.d(TAG, "text: " + mTextView.getText() + " ellipsize: " + mTextView.getEllipsize());
    }

    public void onSelected() {
        mTextView.setEllipsize(TextUtils.TruncateAt.MARQUEE);
        Log.d(TAG, "text: " + mTextView.getText() + " ellipsize: " + mTextView.getEllipsize());
    }
}

MainActivity中的onPageSelected()方法保持不变。

另一答案
textView.setEllipsize(null)

来自doc:

导致文本中长于视图的单词宽度为椭圆形,而不是在中间断开。您可能还需要setSingleLine()或setHorizo​​ntallyScrolling(boolean)将文本约束为单行。使用null关闭椭圆机。如果setMaxLines(int)用于设置两行或更多行,则仅支持END和MARQUEE(其他ellipsizing类型将不执行任何操作)。

以上是关于TextView setSelected(false)不会停止Marquee的主要内容,如果未能解决你的问题,请参考以下文章

textview滑动效果

有没有办法以编程方式在 TextView 中选择文本?

android假设重写onDraw实现一个相似TextView能够显示表情和链接的控件

如何为 Jcrop 'setSelect' 选项指定自定义值?

EditText的setSelection属性

listview.setSelection()