androidx关于自定义Preference的问题
近日学习Android编程,遇到一个自定义Preference的问题。看了网上各位大侠提供的完整的示例说明后自己也试编了一个TextPreference。调试时,发现仿真器闪退,提示:
Caused by: java.lang.ClassCastException: com.example.xxxx.TextPreference cannot be cast to androidx.preference.Preference...
再找攻略,却少有帮助。最后自己摆弄一番,终于搞清原因,在此与大家分享一下。
出现问题的原因
目前,Android Studio创建新的项目已经强制勾选使用AndroidX架构。
在 gradle.properties 文件中可以找到设置
android.useAndroidX=true
所以,无论定义Preference的基类使用的是android.preference.Preference或androidx.preference.Preference,如下所示:
import android.preference.Preference;
public class TextPreference extends Preference...
系统执行createItem时都会将对象强制转换为androidx.preference.Preference。由于androidx.preference.Preference和android.preference.Preference对象不兼容,所以无法实现强制转换,从而引发错误。
解决方案
传统的基于android.preference.Preference的自定义preference采样onBindView展现布局调节后的显示效果,如:
@Override
protected void onBindView(View view) {
super.onBindView(view);
TextView titleView = (TextView) view.findViewById(R.id.title);
titleView.setText(getTitle());
TextView summaryView = (TextView) view.findViewById(R.id.summary);
summaryView.setText(getSummary());
}
- 但是androidx.preference.Preference已经不提供onBindView方法,因此简单的通过import
androidx.preference.Preference改变基类,Android Studio将会报错。 新的基于 androidx.preference.Preference改变布局效果一般采用onBindViewHolder。修改后的程序如下:
@Override
public void onBindViewHolder(PreferenceViewHolder holder) {
super.onBindViewHolder(holder);
TextView titleView = (TextView) holder.itemView.findViewById(R.id.title)
titleView.setText(getTitle());
TextView summaryView = (TextView) holder.itemView.findViewById(R.id.summary);
summaryView.setText(getSummary());
}
如此,问题便可以解决。