这是我的对话框:
@SuppressLint("ValidFragment")
public class Popup extends DialogFragment {
private final int _layout;
@SuppressLint("ValidFragment")
public Popup(int layout) {
_layout = layout;
}
@SuppressLint({"ClickableViewAccessibility", "ResourceType"})
@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
@Nullable
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, Bundle savedInstanceState) {
final View view = inflater.inflate(_layout, container, false);
return view;
}
这就是我调用它的方式:
public class MainActivity extends AppCompatActivity implements View.OnClickListener, Popup.ICustomTts, Popup.ITarget, Popup.IDialog, Popup.IControl {
private final Popup mPopupTurbine = new Popup(R.layout.fragment_turbine);
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button turbineBtn = findViewById(R.id.turbine);
turbineBtn.setOnClickListener(view -> {
mPopupTurbine.show(getSupportFragmentManager(), "Speak");
});
当我在该对话框之外单击时,它将关闭。问题是,我在该对话框中做了一些更改(例如,在TextView中键入文本(,然后关闭了该对话框。当我想再次显示它时,所有的更改都将丢失。那么,我如何才能隐藏对话框,以便在重新显示对话框时更改仍然存在呢?
我想在MainActivity中我可以添加mPopupTurbine.getDialog().hide();
,但我该在哪里添加这行代码?
您可以使用在活动的整个生命周期中存在的ViewModel
,并记住您的Popup
片段存在于活动中。
每次在Popup中进行更改时,都将数据保存在LiveData
或Flow
中。观察Popup中的LiveData
并更新您的UI。
您可以将输入的数据返回到MainActivity:
@SuppressLint("ValidFragment")
public class Popup extends DialogFragment {
public Popup() {
// fragment constructor must be empty
}
private static final String LAYOUT_ID_KEY = "LAYOUT_ID_KEY";
private static final String PARAM1_KEY = "PARAM1_KEY";
public static Popup newInstance(int layoutId, String initialParam1) {
Popup popup = new Popup();
Bundle bundle = new Bundle();
bundle.putInt(LAYOUT_ID_KEY, layoutId);
bundle.putString(PARAM1_KEY, initialParam1);
popup.setArguments(bundle);
return popup;
}
private PopupCallback popupCallback;
@Override
public void onAttach(@NonNull Context context) {
super.onAttach(context);
popupCallback = (PopupCallback) context;
}
@Nullable
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, Bundle savedInstanceState) {
int layoutId = getArguments().getInt(LAYOUT_ID_KEY);
final View view = inflater.inflate(layoutId, container, false);
EditText editText = view.findViewById(R.id.edittext);
// set latest value of param1
editText.setText(getArguments().getString(PARAM1_KEY));
return view;
}
@Override
public void onDismiss(@NonNull DialogInterface dialog) {
EditText v = getView().findViewById(R.id.edittext);
// post back the param1
popupCallback.onDismissPopup(v.getText().toString());
super.onDismiss(dialog);
}
interface PopupCallback {
void onDismissPopup(String param1);
}
}
并接收并保存在MainActivity:中
public class MainActivity extends AppCompatActivity implements Popup.PopupCallback {
private String param1Backup;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button turbineBtn = findViewById(R.id.turbine);
turbineBtn.setOnClickListener(view -> {
Popup.newInstance(R.layout.fragment_turbine, param1Backup).show(getSupportFragmentManager(), "Speak");
});
}
@Override
public void onDismissPopup(String param1) {
param1Backup = param1;
}
}
使用viewModel
保存当前值,并将viewModel
的生命周期与您的活动附加在一起以保存当前状态。viewModel
的目的是在应用程序中的配置更改中幸存下来。
您可以使用Singleton类临时保存这些数据,并在调用它时检查是否在其中保存了任何数据并将其放回对话框中。
public class SingletonClass{
public boolean isDialogDone;
public string dialogTitle, dialogMsg;
public static SingletonClass getInstance(){
if (instance == null) {
synchronized(SingletonClass.class) {
if (instance == null) {
instance = new SingletonClass();
}
}
}
return instance;
}
}
然后,在调用您的对话框时,您可以简单地检查
if(!SingletonClass.getInstance().isDialogDone){
editText.setText(SingletonClass.getInstance().dialogMsg);
}
Ofc您还需要将监听器添加到您的EditText中,这样您就可以保存用户正在键入的消息。