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()或setHorizontallyScrolling(boolean)将文本约束为单行。使用
null
关闭椭圆机。如果setMaxLines(int)用于设置两行或更多行,则仅支持END和MARQUEE(其他ellipsizing类型将不执行任何操作)。
以上是关于TextView setSelected(false)不会停止Marquee的主要内容,如果未能解决你的问题,请参考以下文章
android假设重写onDraw实现一个相似TextView能够显示表情和链接的控件