Android сохранить состояние для диалога

#android #dialog #radio-button #save #state

#Android #диалог #переключатель #Сохранить #состояние

Вопрос:

Как сохранить состояние диалога в Android? У меня есть следующее диалоговое окно с переключателями, но я не могу понять, как сохранить состояние диалога. Спасибо за любую помощь

 final CharSequence[] items = {"Item 1", "Item 2", "Item 3"};
AlertDialog.Builder builder = new AlertDialog.Builder(Tweaks.this);
builder.setTitle("Pick an item");
builder.setSingleChoiceItems(items, -1, new DialogInterface.OnClickListener() {
    public void onClick(DialogInterface dialog, int item) {
        Toast.makeText(getApplicationContext(), items[item], Toast.LENGTH_SHORT).show();
    }
}).show();
  

Ответ №1:

Вы должны сохранять положение выбранного элемента при нажатии пользователем. Затем вы ищете ранее сохраненный индекс при отображении списка. Если ранее не сохраненное значение, вы возвращаете -1.

У меня есть вспомогательный класс настроек приложения…

 public class AppPreferences {
     private static final String APP_SHARED_PREFS = "myApp_preferences"; //  Name of the file -.xml
     private SharedPreferences appSharedPrefs;
     private Editor prefsEditor;

     public AppPreferences(Context context)
     {
         this.appSharedPrefs = context.getSharedPreferences(APP_SHARED_PREFS, Activity.MODE_PRIVATE);
         this.prefsEditor = appSharedPrefs.edit();
     }

     public int getItemIndex() {
         return appSharedPrefs.getInt("itemIndex", -1);
     }

     public void saveItemIndex(int i) {
         prefsEditor.putInt("itemIndex", i);
         prefsEditor.commit();
     }
}
  

Затем в моем коде я создаю переменную field …

 protected AppPreferences appPrefs;
  

И создать его экземпляр внутри Activity onCreate() …

 appPrefs = new AppPreferences(getApplicationContext());
  

Затем замените ваше «-1» на …

 builder.setSingleChoiceItems(items, appPrefs.getItemIndex(), new DialogInterface.OnClickListener() {
  

И в вашем onClick () убедитесь, что вы …

 appPrefs.saveItemIndex(item);
  

Ответ №2:

Я сохранил состояние в переменных-членах в DialogFragment. Следующий код сохраняет состояние при закрытии диалога, но не при закрытии приложения.

 public class MyDialogFragment extends DialogFragment {

    //this is the default value, set when the dialog is created
    private String myValue = "any initial String"; 
    private TextEdit myTextEdit;

    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {

        //construct the dialog
        AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
        LayoutInflater inflater = getActivity().getLayoutInflater();
        ViewGroup myView = (ViewGroup)inflater.inflate(R.layout.my_view, null);
        builder.setView(myView);

        //find the view and set the value
        myTextEdit = (TextView)myView.findViewById(R.id.my_text_edit);
        myTextEdit.setText(myValue);

        return builder.create();
    }

    @Override
    public void onDismiss(DialogInterface dialog) {
        super.onDismiss(dialog);

        //when the dialog is dismissed, save the users input and overwrite the initial value
        myValue = myTextEdit.getText();

    }
}
  

Комментарии:

1. взгляните на мой ответ, это то, что вам нужно 🙂

Ответ №3:

Вы можете использовать предпочтения, но я бы рекомендовал использовать новый шаблон проектирования androidx. В принципе, сохранение состояния диалога не должно сохраняться при закрытии приложения. Это то, что мы хотим (поэтому нам не нужны настройки или что-то в этом роде).

Для выполнения этой работы вы можете использовать модель представления Android и сохраненное состояние.

Вот ссылка, чтобы показать зависимости и версии для использования с gradle (https://developer.android.com/jetpack/androidx/releases/lifecycle )

 implementation 'androidx.lifecycle:lifecycle-viewmodel-savedstate:1.0.0-rc01'
  

Вы можете сделать вот так.

 public class HelloAndroidViewModel extends AndroidViewModel{
    private SavedStateHandle mState;

    public HelloAndroidViewModel(SavedStateHandle savedStateHandle) {
            mState = savedStateHandle;
    }

    public void saveParam(int param){
        mState.set("key", param);
    }

    public int getParam(){
        Integer param = mState.get("key");
        if(param != null){
            return param.intValue();
        }
        // default value
        else {
            return -1;
        }
    }
}

public class HelloAndroid extends Activity {

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

    viewModel = ViewModelProviders.of(this, new SavedStateViewModelFactory(getApplication(), this).get(AndroidViewModel.class);

 }
  

Затем вы можете использовать значение для извлечения и сохранения в вашем диалоговом окне.

 final CharSequence[] items = {"Item 1", "Item 2", "Item 3"};
AlertDialog.Builder builder = new AlertDialog.Builder(Tweaks.this);
builder.setTitle("Pick an item");
builder.setSingleChoiceItems(items, viewModel.getParam(), new DialogInterface.OnClickListener() {
    public void onClick(DialogInterface dialog, int item) {
        // save ui state
        viewModel.setParam(item);
        Toast.makeText(getApplicationContext(), items[item], Toast.LENGTH_SHORT).show();
    }
}).show();