Android TexView走马灯效果解决焦点问题
最近在项目中遇到一个ListView和GridView中item文本过长显示不全的问题,我想通过走马灯效果展示这个TextView,我百度查了一下,需要给TextView设置以下属性:
android:singleLine="true"//单行展示
android:ellipsize="marquee" //循环展示
android:marqueeRepeatLimit="marquee_forever"//一直循环
android:focusableInTouchMode="true"//触屏焦点
android:focusable="true"//键盘焦点
但这样做只能在TextView获得焦点时实现跑马灯效果,而一个ListView中有这么多个TextView,那我们只能重写TextView的isFocused()方法,然后使用你自定义的TextView:
public class MarqueeText extends android.support.v7.widget.AppCompatTextView {
public MarqueeText(Context context) {
super(context);
}
public MarqueeText(Context context, AttributeSet attrs) {
super(context, attrs);
}
public MarqueeText(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
//textview是否选中的状态
@Override
public boolean isFocused() {
return true;
}
}
这样便能让所有TextView都实现走马灯效果了。
但是,
这样设计有一个很大的毛病,就是一旦你的TextView获取焦点后,他的focused状态就永远为true了,也就是说当前界面的其他控件都无法获得焦点了,比如说当前界面的EditText,就算你选中后能显示光标也拉不起小键盘了。
解决办法
先在属性中设置:
android:focusable="false"
自定义的TextView isFocused()返回false,或者直接用TextView:
@Override
public boolean isFocused() {
return false;
}
在java文件中设置:
textview.setSelected(true);
让TextView本身没有焦点,这样既能实现跑马灯效果,也不会和其他控件抢占焦点了。