在listpreference-android中单击项目时显示警告对话框

时间:2013-10-02 07:07:39

标签: android

大家好我不熟悉android development.i想要在用户在首选项activity.i中搜索列表首选项中的任何主题时打开一个警告对话框。但是在google中找不到任何合适的答案。这是我的PrefenceActivity。 / p>

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


}
}

2 个答案:

答案 0 :(得分: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 || getEntries() == 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" />

答案 1 :(得分:0)

1,创建一个更改监听器:

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

第二,将偏好绑定到其值:

// 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步,在第1步中,您可以插入代码以使用if条件启动对话框。