2014-11-01 92 views
0

我想要求用户确认我的应用程序设置中的CheckBoxPreference更改。我试图在OnPreferenceClickListener和OnSharedPreferenceChangeListener中放置一个AlertDialog,但是在单击首选项后,我没有成功取消CheckBoxPreference更改。 感谢您的帮助。如何使用YES/NO确认对话框取消CheckBoxPreference


弥敦道,我尝试了以下2个观点:

1)PreferenceActivity这样实现OnPreferenceClickListener:

@Override 
public boolean onPreferenceClick(Preference preference) { 
     new AlertDialog.Builder(this) 
     .setTitle("Move Data to SD card") 
     .setMessage("This will ...... Are you sure?") 
     .setIcon(android.R.drawable.ic_dialog_alert) 
     .setPositiveButton("Yes", new DialogInterface.OnClickListener() { 
      public void onClick(DialogInterface dialog, int which) {  
      } 
     }) 
     .setNegativeButton("No", new DialogInterface.OnClickListener() { 
      public void onClick(DialogInterface dialog, int id) { 
       CheckBoxPreference checkBoxPref = (CheckBoxPreference)findPreference(getString(R.string.prefSDEpisodes_key)); 
       checkBoxPref.setChecked(!checkBoxPref.isChecked()); 
      } 
     }) 
     .show(); 
    return false; 
} 

其实它的工作原理,但我不满意这个解决方案,因为用户在对话框后面的背景中看到CheckBoxPrefence的状态发生变化。这只是一个解决方法,包括交换框。这根本不干净。我需要在改变之前获得控制权。

2)在实施PreferenceActivity与OnSharedPreferenceChangeListener在 onSharedPreferenceChanged(类似的代码),但在这种情况下,交换回setNegativeButton框值的()编程连连触发偏好改变事件。摆脱确认对话框的唯一方法是选择YES。

如果没有简单的解决方案,我已经准备好扩展CheckBoxPrefence,但是如何?我应该重写哪种方法?

+0

待办事项你有你试过的代码吗? – 2014-11-01 04:27:52

回答

0

我设法那样做(顺便说一句我的代码只显示确认对话框时,复选框被取消选中,所以我不得不改变)

 final CheckBoxPreference myPref = (CheckBoxPreference) findPreference("myPref"); 
     if (myPref != null) { 
      myPref.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() { 
       @Override 
       public boolean onPreferenceChange(Preference preference, Object newValue) { 
        if (newValue instanceof Boolean && ((Boolean) newValue) != PreferencesHelper.getMyPref()) { 
         final boolean isEnabled = (Boolean) newValue; 
         if (!isEnabled) { 

          new AlertDialog.Builder(PreferencesActivity.this) 
          .setTitle("Confirm") 
          .setIcon(R.drawable.alert) 
          .setNegativeButton(getString(R.string.cancel), new DialogInterface.OnClickListener() { 
           @Override 
           public void onClick(DialogInterface dialog, int whichButton) { 
            // do nothing 
           } 
          }) 
          .setPositiveButton(getString(R.string.ok), new DialogInterface.OnClickListener() { 
           @Override 
           public void onClick(DialogInterface dialog, int whichButton) { 
            // OK has been pressed => force the new value and update the checkbox display 
            PreferencesHelper.setMyPref(false); 
            myPref.setChecked(false); 
           } 
          }).create().show(); 

          // by default ignore the pref change, which can only be validated when OK is pressed 
          return false; 

         } 
        } 
        return true; 
       } 
      }); 
     } 

=> PreferencesHelper代码

public static boolean getMyPref() { 
    return getSharedPreferences().getBoolean("myPref", true); 
} 

public static void setMyPref(boolean newValue) { 
    Editor edit = getEditor(); 
    edit.putBoolean("myPref", newValue); 
    edit.apply(); 
}