Custom PreferenceDialogFragment Android - PullRequest
0 голосов
/ 30 марта 2020

Я пытаюсь реализовать свой собственный EditTextPreferenceDialogFragmentCompat . Я хотел бы проверить, вводит ли пользователь IP-адрес в текстовое поле. Если это не так, пользователь не сможет проверить диалог. Я успешно показал свой пользовательский PreferenceDialogFragmentCompat , но больше не могу сохранить текстовое значение!

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 (), но не могу сохранить свое значение.

У вас есть представление о том, что я пропустил? Спасибо за вашу помощь.

...