对话框关闭:保持视图更改



这是我的对话框:

@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中进行更改时,都将数据保存在LiveDataFlow中。观察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中,这样您就可以保存用户正在键入的消息。

最新更新