Android 自定义列表首选项呈现问题

Android 自定义列表首选项呈现问题,android,listpreference,typed-arrays,Android,Listpreference,Typed Arrays,当我尝试预览我的首选项时,会出现此错误 呈现问题java.lang.UnsupportedOperationException位于 android.content.res.BridgeResources.obtainTypedArray(BridgeResources.java:472) 在 com.grozeaion.www.gvicameraremotecontrol.MyListPreference.(MyListPreference.java:52) 位于java.lang.reflec

当我尝试预览我的首选项时,会出现此错误

呈现问题java.lang.UnsupportedOperationException位于 android.content.res.BridgeResources.obtainTypedArray(BridgeResources.java:472) 在 com.grozeaion.www.gvicameraremotecontrol.MyListPreference.(MyListPreference.java:52) 位于java.lang.reflect.Constructor.newInstance(Constructor.java:526) 在 createItem(GenericInflater.java:385) 在 android.preference.GenericInflater.createItemFromTag(GenericInflater.java:432) 在 renflate(GenericInflater.java:483) 在 renflate(GenericInflater.java:495) 在 explate(GenericInflater.java:327) 在 preference.preference\u Delegate.inflateReference(preference\u Delegate.java:64) 将堆栈复制到剪贴板

我创建了一个自定义列表首选项,如下所示

  • 我有一个attr.xml

    <declare-styleable name="MyListPreference">
    <attr name="android:id" />
    <attr name="android:key" />
    <attr name="android:entries" />
    <attr name="android:entryValues" />
    <attr name="android:defaultValue" />
    <attr name="itemIco" format="integer" />
    

    如何修复此渲染问题?我猜这是因为我是如何获得图标ID的,但我不知道如何做,否则我会遇到同样的渲染问题。但是我正在尝试获取颜色资源。我是通过isInEditMode()计算出来的

    private int[]getColorsById(int-id){
    if(isInEditMode()){
    字符串[]s=mContext.getResources().getStringArray(id);
    int[]颜色=新的int[s.length];
    对于(int j=0;j

    我希望它能帮助你很多。或者你有更好的办法来解决这个问题。请评论我。

    我想这就解决了眼前的问题……帮助我的是,牙刷并没有回答这个问题
    isInEditMode
    是正确的使用方式,但它不能从扩展的
    首选项
    类中访问。我也遇到了同样的问题,并且正在扩展一个
    EditTextPreference
    ,但不能从该类调用
    isInEditMode
    。我认为这并不理想,但您甚至可以在Preference类中使用isInEditMode-您只需创建空视图实例并对其进行调用,如
    boolean isEditMode=new View(context).isInEditMode()
    
        <com.grozeaion.www.gvicameraremotecontrol.MyListPreference
        android:id="@+id/Dev2UseAs"
        android:icon="@drawable/off"
        android:key="Dev2UseAsK"
        android:summary="@string/trig_dev2m_s"
        android:title="@string/trig_dev2m_t"
        android:entries="@array/modeDevName"
        android:entryValues="@array/modeDevVal"
        android:defaultValue="0"
        custom:itemIco="@array/modeDevIco"
        />
    
    <array name="modeDevIco">
    <item>@drawable/off</item>
    <item>@drawable/camera</item>
    <item>@drawable/flash</item>
    <item>@drawable/split</item>
    
    public MyListPreference(Context context, AttributeSet attrs) {
    super(context, attrs);
    setLayoutResource(R.layout.my_list_value_main);
    this.context = context;
    Resources resources = context.getResources();
    preferences = PreferenceManager.getDefaultSharedPreferences(context);
    TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.MyListPreference, 0, 0);
    try {
        crtCtrlKey = a.getString(R.styleable.MyListPreference_android_key);
        itemTitle = resources.getStringArray(a.getResourceId(R.styleable.MyListPreference_android_entries, 0));
        itemVal = resources.getStringArray(a.getResourceId(R.styleable.MyListPreference_android_entryValues, 0));
        defVal = a.getString(R.styleable.MyEditText_android_defaultValue);
        int len = itemVal.length;
        itemIco = new int[len];
        TypedArray iDs = resources.obtainTypedArray(a.getResourceId(R.styleable.MyListPreference_itemIco, 0));//get ID's for icons
        for (int i = 0; i < len; i++) {
            itemIco[i] = iDs.getResourceId(i,0);
        }
        iDs.recycle();
    } finally {
        a.recycle();
    }
    
    TypedArray iDs = resources.obtainTypedArray(a.getResourceId(R.styleable.MyListPreference_itemIco, 0));//get ID's for icons
    
    private int[] getColorsById(int id){
        if(isInEditMode()){
            String[] s=mContext.getResources().getStringArray(id);
            int[] colors = new int[s.length];
            for (int j = 0; j < s.length; j++){
                colors[j] = Color.parseColor(s[j]);
            }
            return colors;
        }else{
            TypedArray typedArray=mContext.getResources().obtainTypedArray(id);
            int[] colors = new int[typedArray.length()];
            for (int j = 0; j < typedArray.length(); j++){
                colors[j] = typedArray.getColor(j,Color.BLACK);
            }
            typedArray.recycle();
            return colors;
        }
    }