0

新しい値を保存したい場合は、設定でユーザー入力を確認する必要があります。コードは正しいと思います...値をゆっくりと変更してもまったく問題はありません。変更が速すぎると、アプリがクラッシュします。

設定の編集に commit() を使用しています。これは遅すぎる方法ですか?

何をしようとしていますか?: ユーザーが空の文字列を指定した場合、警告ダイアログを表示し、インターンは、設定を古い値に戻します。コードは次のとおりです。

public class Preferences extends PreferenceActivity implements OnSharedPreferenceChangeListener {
//save settings
    static String SMStext;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);

            addPreferencesFromResource(R.xml.preferences);

            SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(this);

            //-- First get SMStext and save in Strings
            SMStext = sp.getString("SMSText", "0");

            //SharedPreferences.Editor prefEditor = sp.edit();
            sp.registerOnSharedPreferenceChangeListener(this);   

    }


  @Override
  public void onSharedPreferenceChanged(SharedPreferences sp, String key) {

    String smstriggerworderror = "String cannot be empty";

    if (key.equals("SMSText")) {

        if  sp.getString("SMSText", "0").equals(""){

            SharedPreferences.Editor prefEditor = sp.edit();

            prefEditor.putString("SMSText", SMStext);
            prefEditor.commit();
                //write current value back to value and refresh interface
            SMStext = sp.getString("SMSText", "0");
                //Show alert dialog
            showdialog(smstriggerworderror);
            //finish();

        }
        //write current value back to value
        SMStext = sp.getString("SMSText", "0");
    }


private void showdialog(String message) {
      //create alertbox
      AlertDialog.Builder alertbox = new AlertDialog.Builder(this);
      alertbox.setMessage(message);
      alertbox.setNeutralButton("Ok", new DialogInterface.OnClickListener() {
      // Click listener on the neutral button or alert box
          public void onClick(DialogInterface arg0, int arg1) {
              finish();
          }
      });

      // show the alert box
      alertbox.show();      
}
4

1 に答える 1

0

onSharedPreferenceChangedあなたの実行の中で、 prefEditor.commit();this はonSharedPreferenceChangedリスナーを呼び出します。リスナーは、スタックオーバーフローエラーが発生commit()するまで何度も呼び出します。

修理:

OnSharedPreferencesChanged リスナー内で SharedPreferences を変更しないでください。

于 2012-05-22T21:11:49.347 に答える