Java 自定义首选项对话框

Java 自定义首选项对话框,java,android,android-preferences,Java,Android,Android Preferences,我正在努力实现我自己的目标。我想检查用户是否在文本字段中输入IP地址。如果不是这样,用户应该无法验证对话框。我已经成功地显示了我的自定义,但我不能再保存文本值了 public class SettingsActivity extends AppCompatActivity { public static final String PREF_IP_KEY = "ipDs1242_2"; @Override public void onCreate(@Nullable Bundle saved

我正在努力实现我自己的目标。我想检查用户是否在文本字段中输入IP地址。如果不是这样,用户应该无法验证对话框。我已经成功地显示了我的自定义,但我不能再保存文本值了

public class SettingsActivity extends AppCompatActivity {


public static final String PREF_IP_KEY = "ipDs1242_2";

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

    /*
        ...
    */

    getSupportFragmentManager().beginTransaction().replace(android.R.id.content, new Preferences()).commit();


}





//A Fragment needs to be a public static class
public static class Preferences extends PreferenceFragmentCompat {

    private EditTextPreference mIpModulePref;


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

        Log.e(getClass().getSimpleName(), "onCreate() frag Prefrences");
    }


    @Override
    public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {


        addPreferencesFromResource(R.xml.preferences_app);

        Log.e(getClass().getSimpleName(), "onCreateFragment()");

        mIpModulePref = findPreference(PREF_IP_KEY);
        mIpModulePref.setSummary("Addresse IP : " + mIpModulePref.getText());
        mIpModulePref.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {
            @Override
            public boolean onPreferenceChange(Preference preference, Object newValue) {
                Log.e(getClass().getSimpleName(), "new pref saved"); //never called...
                return true;
            }
        });
        mIpModulePref.setOnBindEditTextListener(this);


    }


    //shows my custom dialog
    @Override
    public void onDisplayPreferenceDialog(Preference preference) {

        if (getFragmentManager().findFragmentByTag(DialogPreferenceFragment.TAG) != null) {
            return;
        }

        if (preference instanceof EditTextPreference && preference.getKey().equals(PREF_IP_KEY)) {

            DialogPreferenceFragment dialogPreferenceFragment = DialogPreferenceFragment.newInstance(PREF_IP_KEY);
            dialogPreferenceFragment.setTargetFragment(this, DialogPreferenceFragment.REQUEST_CODE);
            dialogPreferenceFragment.show(getFragmentManager(), DialogPreferenceFragment.TAG);

        } else {
            super.onDisplayPreferenceDialog(preference);
        }
    }




}




//the custom dialog to show

public static class DialogPreferenceFragment extends EditTextPreferenceDialogFragmentCompat {

    public static final int REQUEST_CODE = 0;
    public static final String TAG = "DialogPreferenceFragment_tag";

    private Context mContext;
    private EditTextPreference mEditTextPreference;
    private SharedPreferences prefs;


    public static DialogPreferenceFragment newInstance(String key){

        Bundle bundle = new Bundle();
        bundle.putString(ARG_KEY, key);

        DialogPreferenceFragment dialogPreferenceFragment = new DialogPreferenceFragment();
        dialogPreferenceFragment.setArguments(bundle);

        return dialogPreferenceFragment;
    }



    @Override
    public void onAttach(@NonNull Context context) {
        super.onAttach(context);
        mContext = context;
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
            prefs = PreferenceManager.getDefaultSharedPreferences(mContext);

    }

    @Override
    protected void onBindDialogView(View view) {
        super.onBindDialogView(view);

        Log.e(getClass().getSimpleName(), "restore pref IP");


        mEditTextPreference = ((EditTextPreference) getPreference());

        String txtValue = prefs.getString(mEditTextPreference.getKey(), ""); //reads the right value
        mEditTextPreference.setText(txtValue);

    }



    @Override
    protected void onPrepareDialogBuilder(AlertDialog.Builder builder) {
        super.onPrepareDialogBuilder(builder);
        builder.setMessage("Enter the IP address");

    }




    @Override
    public void onDialogClosed(boolean positiveResult) {

        if(positiveResult){

            Log.e(getClass().getSimpleName(), "save pref IP");

            SharedPreferences.Editor editor = PreferenceManager.getDefaultSharedPreferences(mContext).edit();
            editor.putString(mEditTextPreference.getKey(), mEditTextPreference.getText());
            editor.commit();

            String value =  prefs.getString(mEditTextPreference.getKey(), ""); //DOESN'T SAVE THE VALUE !

            Log.e(getClass().getSimpleName(), value);
        }

     }
   }

}
我可以在onBindDialogView()函数中读取正确的值,但无法保存我的值

你知道我错过了什么吗?
谢谢你的帮助。

你能解决这个问题吗?你能解决这个问题吗?