#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();