androidx关于自定义Preference的问题

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());
    }

如此,问题便可以解决。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值