11

これは私にはバグのように見えます。プリファレンスフラグメントに多くのスイッチプリファレンスをロードすると、プリファレンスをスクロールすると、それらはどういうわけか自分自身をリセットします。私はこれを少しのデモコードで個別にテストしました:


/res/xml/prefs.xml(スイッチ設定の束で、設定を画面上でスクロールさせるのに十分です):

<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android" android:key="my_prefs">
    <PreferenceCategory android:key="my_prefs_cat" android:title="Settings">
        <SwitchPreference android:key="p1" android:title="p1" android:defaultValue="false" />
        <SwitchPreference android:key="p2" android:title="p2" android:defaultValue="false" />
        <SwitchPreference android:key="p3" android:title="p3" android:defaultValue="false" />
        <SwitchPreference android:key="p4" android:title="p4" android:defaultValue="false" />
        <SwitchPreference android:key="p5" android:title="p5" android:defaultValue="false" />
        <SwitchPreference android:key="p6" android:title="p6" android:defaultValue="false" />
        <SwitchPreference android:key="p7" android:title="p7" android:defaultValue="false" />
        <SwitchPreference android:key="p8" android:title="p8" android:defaultValue="false" />
        <SwitchPreference android:key="p9" android:title="p9" android:defaultValue="false" />
        <SwitchPreference android:key="p10" android:title="p10" android:defaultValue="false" />
    </PreferenceCategory>
</PreferenceScreen>

/src/Prefs.java(シンプルPreferenceFragment):

package com.example.preflistbug;

import android.os.Bundle;
import android.preference.PreferenceFragment;

public class Prefs extends PreferenceFragment {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        addPreferencesFromResource(R.xml.prefs);
    }

}

/res/layout/main.xmlPreferenceFragmentアクティビティレイアウトに配置):

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent">

    <fragment android:name="com.example.preflistbug.Prefs" 
        android:id="@+id/frg_prefs"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        />
</LinearLayout>

/src/MyActivity.java(デモ活動):

package com.example.preflistbug;

import android.app.Activity;
import android.os.Bundle;

public class MyActivity extends Activity {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
    }
}

問題:最初のスイッチ設定を変更し、下にスクロールし、上にスクロールすると、スイッチがリセットされます。スクロールして表示されなくなり、後でアクセスする他のスイッチ設定についても同じことが言えます。(特に水平方向)

エミュレーターでも発生します。プラットフォームバージョン15、ICSでコンパイルしています。上記のコードでわかるように、これは非常に単純なセットアップです。このコードには何も見つかりません。これが発生している理由を説明している可能性があります。

アップデート

問題26194として報告されたバグ。

アップデート2

androidLリリースで修正される予定です。

4

1 に答える 1

37

この問題を再現することができました。私も回避策を見つけましたが、なぜそれが機能するのかわかりません:)

SwitchPreference次のようなものから派生クラスを作成します。

public class Pref extends SwitchPreference {
    public Pref(Context context) {
        super(context);
    }

    public Pref(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public Pref(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
    }    
}

次に、prefs.xmlでこれらを使用する代わりに:

<SwitchPreference ... />

代わりにこれらを使用できます

<com.example.preflistbug.Pref ... />

ListView派生により、ドリブンプリファレンスリストのビューのリサイクルが、最初に前のオブジェクトからコントロールを「解放」せずにコントロールを再利用するという問題が何らかの形で修正されているPreferenceようです(またはそう思います)。詳細がわかったら、この回答を更新します。

于 2013-04-01T13:07:34.843 に答える