14

我将尽可能简短地解释我的问题。

我有一个名为 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 被解除onResume()之后 FragmentA 中的方法永远不会被调用并且 FragmentA 被显示并且您可以毫无问题地与之交互。

public class FragmentA extends Fragment implements OnClickListener {

    ...

    @Override
    public void onResume() {
        super.onResume();
        resumeFragmentA();
    }
}

所以,为了解决这个问题,我所做的是在方法的末尾复制 FragmentA 的一个实例,并在用户关闭对话框时onActivityCreated()调用该方法。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();
    }

    ...

}
4

3 回答 3

4

如果您只想调用 FragmentA 的 onResume,请在 DialogFragment 中调用 startActivityForResult,然后启动 FragmentActivity。这将调用 onResume。

public void dismissDialog() {
   getActivity().startActivityForResult(getActivity().getIntent(), 10);
   dismiss()
}
于 2013-12-02T13:38:02.993 回答
4

现在谷歌已经发布了 Android 架构组件库,最好的解决方案是在两个 Fragment 之间使用一个共享的 ViewModel,你的 Activity 作为实现 LifecycleRegistryOwner 的一个。

这样做,我们将避免刷新 UI 调用 onResume 并且我们不需要编写任何棘手的解决方案。

解决方案可能如下:

public MyActivity extends AppCompatActivity {

    ...

}

public class FragmentA extends Fragment implements OnClickListener {

    ...

    private SharedViewModel mSharedViewModel;

    @Override
    public void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        mSharedViewModel = ViewModelProviders.of(getActivity()).get(SharedViewModel.class);

        mSharedViewModel.getData().observe(this, value -> {
            updateUIValue(value);
        });

    }

    @Override
    public void OnClick(View v) {
        if (v == dialogButton) {
            showDialog();
        }
    }

    @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 {

    ...

    private SharedViewModel mSharedViewModel;

    @Override
    public void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        mSharedViewModel = ViewModelProviders.of(getActivity()).get(SharedViewModel.class);

        mSharedViewModel.getData().observe(this, value -> {
            updateUIValue(value);
        });

    }

    @Override
    public void onClick(View view) {
        if (view == acceptButton) {
            ...

            mSharedViewModel.setValue(newValue);
        }
        else if (view == cancelButton) {
            dismiss();
        }
    }
}


public class SharedViewModel extends ViewModel {

    final MutableLiveData<Resource<Value>> data = new MutableLiveData<>();

    public MutableLiveData<Value> getData() {
        return data;
    }

    public void setValue(Value newValue) {
        this.data.setValue(newValue)
    }
}
于 2017-09-16T15:52:13.300 回答
0

另一种方法是实现一个接口。创建一个接口并让活动/片段(您需要哪个)实现它,然后将自身作为接口对象传递给您的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())。

于 2016-06-23T06:14:23.717 回答