我将尽可能简短地解释我的问题。
我有一个名为FragmentA的片段,它在点击特定按钮后会显示一个DialogFragment。
public class FragmentA extends Fragment implements OnClickListener {
...
@Override
public void OnClick(View v) {
if (v == dialogButton) {
showDialog();
}
}
public void showDialog() {
String diagName = getResources().getString(R.string.dialog_title);
MyDialog myDialog = MyDialog.newInstance(getFragmentAValue());
myDialog.show(getFragmentManager(), diagName);
}
}
public class MyDialog extends DialogFragment implements OnClickListener {
...
@Override
public void onClick(View view) {
if (view == acceptButton) {
...
}
else if (view == cancelButton) {
...
}
}
}
显示对话框没有任何问题。但是我的问题在于myDialog被解雇之后,FragmentA中的onResume()
方法从未被调用,并且显示了FragmentA,你可以毫无问题地与它进行交互。
public class FragmentA extends Fragment implements OnClickListener {
...
@Override
public void onResume() {
super.onResume();
resumeFragmentA();
}
}
因此,我为解决此问题所做的工作是在onActivityCreated()
方法的末尾复制FragmentA的实例,并在用户关闭对话框时调用方法resumeFragmentA()
。
public class FragmentA extends Fragment implements OnClickListener {
FragmentA fragmentA = null;
...
@Override
public void onResume() {
super.onResume();
resumeFragmentA();
}
@Override
public void onActivityCreated(Bundle savedInstanceState) {
...
fragmentA = this;
}
...
}
public class MyDialog extends DialogFragment implements OnClickListener {
...
@Override
public void onClick(View view) {
if (view == acceptButton) {
storeData();
dismissDialog();
}
else if (view == cancelButton) {
dismissDialog();
}
}
public void dismissDialog() {
FragmentA.fragmentA.resumeFragmentA();
dismiss();
}
}
我知道这个解决方案很棘手,但我不知道以更精彩的方式解决。你知道吗?任何的想法? 提前谢谢!
为了更好地阅读我的代码,请在此处获取完整代码:
public class FragmentA extends Fragment implements OnClickListener {
...
FragmentA fragmentA = null;
...
@Override
public void OnClick(View v) {
if (v == dialogButton) {
showDialog();
}
}
public void showDialog() {
String diagName = getResources().getString(R.string.dialog_title);
MyDialog myDialog = MyDialog.newInstance(getFragmentAValue());
myDialog.show(getFragmentManager(), diagName);
}
@Override
public void onResume() {
super.onResume();
resumeFragmentA();
}
@Override
public void onActivityCreated(Bundle savedInstanceState) {
...
fragmentA = this;
}
...
}
public class MyDialog extends DialogFragment implements OnClickListener {
...
static MyDialog newInstance(int value) {
MyDialog fragment = new MyDialog ();
Bundle args = new Bundle();
args.putInt("value", value);
fragment.setArguments(args);
return fragment;
}
@Override
public void onClick(View view) {
if (view == acceptButton) {
storeData();
dismissDialog();
}
else if (view == cancelButton) {
dismissDialog();
}
}
public void dismissDialog() {
FragmentA.fragmentA.resumeFragmentA();
dismiss();
}
...
}
答案 0 :(得分:2)
如果您只想调用FragmentA的onResume,请在DialogFragment中调用startActivityForResult,然后启动FragmentActivity。这将调用onResume。
public void dismissDialog() {
getActivity().startActivityForResult(getActivity().getIntent(), 10);
dismiss()
}
答案 1 :(得分:2)
现在Google发布了Android架构组件库,最好的解决方案是在两个片段之间使用共享的ViewModel,将Activity作为实现LifecycleRegistryOwner的片段。
这样做,我们将避免刷新UI调用onResume,我们不需要编写任何棘手的解决方案。
解决方案可能是以下一个:
{{1}}
答案 2 :(得分:0)
另一种方法是实现一个接口。创建一个接口,让activity / fragment(你需要的那个)实现它,然后将自己作为接口对象传递给DialogFragment
。
CustomDialogFragment df = new CustomDialogFragment();
Bundle b = new Bundle();
b.putSerializable(KEY, this); // current activity/fragment that implements the interface
df.setArguments(b);
df.show(getFragmentManager(), TAG);
然后在你的DialogFragment
中获取听众,并在需要时调用听众的方法(在这种情况下,在你调用dismiss()
之后/之前)。