Koncepcyjnie możesz to zrobić tak. Powinieneś móc osiągnąć to, co chcesz. Do nauki wystarczy, ale niestety taki kod ma ogromny problem. Nie da się go łatwo przetestować, a to znaczy, że wartość tego kodu jest bliska 0.
public final class MainActivity extends AppCompatActivity {
@Override protected void onCreate(Bundle inState) {
super.onCreate(inState);
setContentView(R.layout.activity_main);
FragmentManager manager = getSupportFragmentManager();
findViewById(R.id.showFirstDialog).setOnClickListener(new MyDialogFragmentDisplayer(1, manager));
findViewById(R.id.showSecondDialog).setOnClickListener(new MyDialogFragmentDisplayer(2, manager));
}
private static final class MyDialogFragmentDisplayer implements View.OnClickListener {
private final long id;
private final FragmentManager manager;
MyDialogFragmentShower(long id, FragmentManager manager) {
this.id = id;
this.manager = manager;
}
@Override public void onClick(View view) {
FragmentTransaction transaction = manager.beginTransaction();
Fragment fragment = manager.findFragmentByTag(tag);
if (fragment != null) {
transaction.remove(fragment);
}
transaction.addToBackStack(null);
MyDialogFragment.create(id).show(transaction, tag);
}
private static final String tag = "MyDialogFragment";
}
}
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
>
<Button
android:id="@+id/showFirstDialog"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Show dialog"
/>
<Button
android:id="@+id/showSecondDialog"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Show dialog"
/>
</LinearLayout>
public final class MyDialogFragment extends DialogFragment {
private UiModelStore store;
private UiModel uiModel;
public static MyDialogFragment create(long id) {
MyDialogFragment fragment = new MyDialogFragment();
Bundle arguments = new Bundle();
arguments.putLong(idKey, id);
fragment.setArguments(arguments);
return fragment;
}
@Override public void onCreate(@Nullable Bundle inState) {
super.onCreate(inState);
long id = extractId(getArguments());
SharedPreferences preferences = requireContext().getSharedPreferences(
"UiModelPreferences",
MODE_PRIVATE
);
store = new UiModelStore(preferences);
uiModel = store.read(id);
}
@NonNull @Override public View onCreateView(
@NonNull LayoutInflater inflater,
@Nullable ViewGroup container,
@Nullable Bundle inState
) {
View view = inflater.inflate(R.layout.my_dialog_fragment, container, false);
EditText name = view.findViewById(R.id.name);
name.setText(uiModel.name);
name.addTextChangedListener(new AfterTextChangedWatcher() {
@Override public void afterTextChanged(Editable editable) {
uiModel = uiModel.withName(editable.toString());
}
});
EditText description = view.findViewById(R.id.description);
description.setText(uiModel.description);
description.addTextChangedListener(new AfterTextChangedWatcher() {
@Override public void afterTextChanged(Editable editable) {
uiModel = uiModel.withDescription(editable.toString());
}
});
view.findViewById(R.id.cancel).setOnClickListener(new View.OnClickListener() {
@Override public void onClick(View view) {
dismiss();
}
});
view.findViewById(R.id.save).setOnClickListener(new View.OnClickListener() {
@Override public void onClick(View view) {
store.save(uiModel);
dismiss();
}
});
return view;
}
private long extractId(Bundle arguments) {
Objects.requireNonNull(arguments, "Missing input arguments.");
if (!arguments.containsKey(idKey)) {
throw new IllegalArgumentException("Input arguments must contain ID.");
}
return arguments.getLong(idKey);
}
private static final String idKey = "MyDialogFragment.Id";
private static abstract class AfterTextChangedWatcher implements TextWatcher {
@Override public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {
// No-op
}
@Override public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {
// No-op
}
}
}
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
>
<EditText
android:id="@+id/name"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="Name"
/>
<EditText
android:id="@+id/description"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="Description"
/>
<Button
android:id="@+id/cancel"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Cancel"
/>
<Button
android:id="@+id/save"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Save"
/>
</LinearLayout>
public final class UiModel {
public final long id;
public final String name;
public final String description;
public UiModel(long id, String name, String description) {
this.id = id;
this.name = name;
this.description = description;
}
public UiModel withName(String name) {
return new UiModel(id, name, description);
}
public UiModel withDescription(String description) {
return new UiModel(id, name, description);
}
}
public final class UiModelStore {
private final SharedPreferences preferences;
public UiModelStore(SharedPreferences preferences) {
this.preferences = preferences;
}
public UiModel read(long id) {
long modelId = preferences.getLong(idKey(id), id);
String modelName = preferences.getString(nameKey(id), "");
String modelDescription = preferences.getString(descriptionKey(id), "");
return new UiModel(modelId, modelName, modelDescription);
}
public UiModel save(UiModel uiModel) {
preferences.edit()
.putLong(idKey(uiModel.id), uiModel.id)
.putString(nameKey(uiModel.id), uiModel.name)
.putString(descriptionKey(uiModel.id), uiModel.description)
.apply();
return uiModel;
}
private static String idKey(long id) {
return "UiModel.Id." + id;
}
private static String nameKey(long id) {
return "UiModel.Name." + id;
}
private static String descriptionKey(long id) {
return "UiModel.Description." + id;
}
}