1

ここで検索してサンプルを見ましたが、本質的に単純な問題に対する答えはまだ見つかりません。前の ListPreference で行った選択に応じて、CheckBoxPreferences の設定画面をコードで動的に構築したいと考えています。これは、クリック リスナーで単純な設定をクリックすると表示されます。チェックボックスのリストと数は、ケースごとに異なります。

これまでのところ、onClick リスナーの概念をテストするための簡単なコードですが、チェック ボックスの設定画面を表示するにはどうすればよいでしょうか。そうでない理由を簡単に説明する必要があります。私は何を間違っていますか?

私のxmlコードの一部:

<PreferenceCategory android:title="Filters">
    <PreferenceScreen android:key="FilterScreen"
        android:title="Filters" android:summary="Click to change filter settings">
        <ListPreference android:title="Filter type" 
            android:summary="Set to: Gliding"
            android:key="filterType"
            android:defaultValue="0"
            android:entries="@array/filterTypeOptions"
            android:entryValues="@array/filterTypeValues" />
        <CheckBoxPreference android:title=""
            android:summary="Include Aerodrome Notams"
            android:defaultValue="false" android:key="filterIncludeAerodrome" />
        <CheckBoxPreference android:title=""
            android:summary="Delete night-time Notams"
            android:defaultValue="true" android:key="filterDeleteNighttime" />
        <ListPreference android:title="Select category to change" 
            android:summary="Set to: Airspace organisation"
            android:key="filterCategory"
            android:defaultValue="0"
            android:entries="@array/filterCategoryOptions"
            android:entryValues="@array/filterCategoryValues" />
        <Preference android:title="Show filters for category"
            android:summary="Click to choose subjects to delete"
            android:key="filterShow" />
    </PreferenceScreen>
</PreferenceCategory>

「カテゴリのフィルタを表示」の内容は、「フィルタの種類」と「変更するカテゴリを選択」の設定によって異なります。

これは、「フィルターを表示」クリック リスナー用に用意した簡単なテスト コードです (要点を示すために省略しています)。

public class Settings extends PreferenceActivity
                  implements OnSharedPreferenceChangeListener
{
    ------
    public static final String KEY_FILTER_SHOW = "filterShow";

    ------
    private Preference mFilterShow;

    ------
    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        addPreferencesFromResource(R.layout.settings);

        // Get a reference to the preferences

        ------
        mFilterShow = (Preference)findPreference(KEY_FILTER_SHOW);

        ------
        // Set the click listener for  Show Filter options
        mFilterShow.setOnPreferenceClickListener(new OnPreferenceClickListener()
        {
            public boolean onPreferenceClick(Preference pref)
            {
                Context ctx = pref.getContext();
                PreferenceScreen screen =
                    pref.getPreferenceManager().createPreferenceScreen(ctx);
                CheckBoxPreference cb1 = new CheckBoxPreference(ctx);
                cb1.setTitle("This is cb1");
                cb1.setKey("cb1_key");
                cb1.setDefaultValue(false);
                screen.addPreference(cb1);
                return true;
            }

        });

私が間違ったこと、または私が見逃したことに対する簡単な答えがあるはずです! 助けてください...

4

1 に答える 1

3

OK、繰り返しのプロセスを通じて、私は自分で問題を解決しました! 他の人はこれが便利だと思うかもしれません。

xml で空の PreferenceScreen を作成するだけです。

        <PreferenceScreen android:title="Show filters for category"
            android:summary="Click to choose subjects to delete"
            android:key="filterShow">
        </PreferenceScreen>

次に、コードでは onClick リスナーは必要ありません。画面のコンテンツは onCreate 関数で作成されます。実際には、カテゴリ リストの設定 (元のコードを参照) で行われた選択が変更されたときに画面の内容を変更する必要があるため、これは onCreate と onSharedPreferenceChanged の両方から呼び出される別の関数で行う必要があります。

public static final String KEY_FILTER_SHOW = "filterShow";
...    
private PreferenceScreen mFilterShow;
...

// In onCreate:

    // Get a reference to the PreferenceScreen
    mFilterShow =
        (PreferenceScreen)getPreferenceScreen().findPreference(KEY_FILTER_SHOW);

    // Now the code to create the contents of the screen
    mFilterShow.removeAll();
    CheckBoxPreference cb1 = new CheckBoxPreference(this);
    cb1.setTitle("This is cb1");
    cb1.setKey("cb1_key");
    cb1.setDefaultValue(true);
    mFilterShow.addPreference(cb1);

上記は単なる「概念実証」です。期待どおりに機能します。私の最終バージョンでは、最初に「new」で CheckBoxPreferences の配列を作成し、変更された各カテゴリの選択の画面の内容を設定するときにそれらを再利用します (タイトルとデフォルトを変更します)。必要なチェック ボックスの数はカテゴリごとに異なる場合があります。必要な最大数の配列を作成し、それぞれの場合に必要な数だけ追加します。

于 2012-09-24T10:47:56.220 に答える