1

こんにちは、Android 開発の初心者です。ユーザーがプリファレンス アクティビティのリスト プリファレンスでテーマを選択したときにアラート ダイアログを開きたいと思います。Google でたくさん検索しましたが、適切な回答が見つかりませんでした。

public class Setting extends PreferenceActivity { 

    /** Called when the activity is first created. */  
        @Override  
        public void onCreate(Bundle savedInstanceState) { 
            Setting.setAppTheme(this);
            super.onCreate(savedInstanceState);  
            addPreferencesFromResource(R.xml.prefs); 

        } 


    String ListPreference;  

        public static void setAppTheme(Activity a)  {  
            // Get the xml/preferences.xml preferences  
            SharedPreferences prefs = PreferenceManager  
                            .getDefaultSharedPreferences(a); 
         int ListPreference = Integer.parseInt(prefs.getString("listPref", "3"));
         if(ListPreference == 0) {
                a.setTheme(R.style.AppBaseThemeDark);
                return;
                } else if(ListPreference == 1){
                    a.setTheme(R.style.AppBaseThemeLight);
                    //Toast.makeText(getApplicationContext(),"TTS Engines not found.\n Install TTS Engins",Toast.LENGTH_LONG).show();
                } else if(ListPreference == 2){
                    a.setTheme(R.style.AppBaseTheme);
                }

   }

        public boolean onCreateOptionsMenu(Menu menu) {
            super.onCreateOptionsMenu(menu);
            getActionBar().setDisplayHomeAsUpEnabled(true);

            return true;
        }
     public boolean onOptionsItemSelected(MenuItem item) {
         switch (item.getItemId()) {
                case android.R.id.home:
                        // app icon in action bar clicked; go home
                    getFragmentManager().popBackStack();
                    finish();
                        return true;

            }
            return super.onOptionsItemSelected(item);


}
}
4

2 に答える 2

1

私は数日前に同じ問題に直面し、ListPreferenceこれを行うために拡張するカスタム設定クラスを実装しました。これは私が実装したクラスです:

public class LogCleanPreference extends ListPreference {
    private int mClickedDialogEntryIndex;
    
    private Context mContext;

    public LogCleanPreference(Context ctxt) {
        this(ctxt, null);
    }

    public LogCleanPreference(Context ctxt, AttributeSet attrs) {
        super(ctxt, attrs);
        
        mContext = ctxt;

        setNegativeButtonText(ctxt.getString(R.string.alert_cancel));
    }

    @Override
    protected void onPrepareDialogBuilder(Builder builder) {
        if (getEntries() == null || getEntryValues() == null) {
            throw new IllegalStateException(
                    "ListPreference requires an entries array and an entryValues array.");
        }

        mClickedDialogEntryIndex = findIndexOfValue(getValue());
        builder.setSingleChoiceItems(getEntries(), mClickedDialogEntryIndex, 
                new DialogInterface.OnClickListener() {
            public void onClick(final DialogInterface dialog, final int which) {
                // In my case I only show the AlertDialog if the user didn't select option number 2
                if(which != 2){
                    // Show AlertDialog
                }
                else{
                    // Save preference and close dialog
                    mClickedDialogEntryIndex = which;
    
                    LogCleanPreference.this.onClick(dialog, DialogInterface.BUTTON_POSITIVE);
                    dialog.dismiss();
                }
            }
        });

        builder.setPositiveButton(null, null);
    }

    @Override
    protected void onDialogClosed(boolean positiveResult) {

        CharSequence[] mEntryValues = getEntryValues();

        if (positiveResult && mClickedDialogEntryIndex >= 0 && mEntryValues != null) {
            String value = mEntryValues[mClickedDialogEntryIndex].toString();
            if (callChangeListener(value)) {
                setValue(value);
            }
        }
    }
}

これは、私の prefs.xml で設定を使用する方法です。

<com.timeondriver.tod.settings.LogCleanPreference
        android:defaultValue="0"
        android:dialogTitle="@string/dialog_title_log_clean"
        android:entries="@array/log_clean"
        android:entryValues="@array/log_clean_values"
        android:key="log_clean_preference"
        android:summary="@string/summary_log_clean_preference"
        android:title="@string/title_log_clean_preference" />
于 2013-10-02T07:37:38.393 に答える
0

まず、変更リスナーを作成します。

private static Preference.OnPreferenceChangeListener sBindPreferenceSummaryToValueListener = new Preference.OnPreferenceChangeListener() {
        @Override
        public boolean onPreferenceChange(Preference preference, Object value) {
            String stringValue = value.toString();

            if (preference instanceof ListPreference) {
                // For list preferences, look up the correct display value in
                // the preference's 'entries' list.
                ListPreference listPreference = (ListPreference) preference;
                int index = listPreference.findIndexOfValue(stringValue);

                // Set the summary to reflect the new value.
                preference
                        .setSummary(index >= 0 ? listPreference.getEntries()[index]
                                : null);

            }
            return true;
        }
    };

2番目、プリファレンスをその値にバインドします:

// Set the listener to watch for value changes.
        preference
                .setOnPreferenceChangeListener(sBindPreferenceSummaryToValueListener);

        // Trigger the listener immediately with the preference's
        // current value.
        sBindPreferenceSummaryToValueListener.onPreferenceChange(
                preference,
                PreferenceManager.getDefaultSharedPreferences(
                        preference.getContext()).getString(preference.getKey(),
                        ""));

3番目に、最初のステップで、if条件でダイアログを起動するコードを挿入できます。

于 2013-10-02T07:39:18.573 に答える