首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >从DialogFragment回调片段

从DialogFragment回调片段
EN

Stack Overflow用户
提问于 2012-12-06 06:04:14
回答 7查看 161.6K关注 0票数 171

问:如何创建从一个DialogFragment到另一个片段的回调。在我的例子中,涉及的活动应该完全不知道DialogFragment。

考虑到我有

代码语言:javascript
复制
public class MyFragment extends Fragment implements OnClickListener

然后在某一时刻我可以做

代码语言:javascript
复制
DialogFragment dialogFrag = MyDialogFragment.newInstance(this);
dialogFrag.show(getFragmentManager, null);

MyDialogFragment看起来像什么

代码语言:javascript
复制
protected OnClickListener listener;
public static DialogFragment newInstance(OnClickListener listener) {
    DialogFragment fragment = new DialogFragment();
    fragment.listener = listener;
    return fragment;
}

但是,如果DialogFragment暂停并在其生命周期中重新开始,则不能保证侦听器会在附近。片段中唯一的保证是那些通过setArguments和getArguments通过包传递的保证。

如果活动应该是侦听器,则有一种方法可以引用该活动:

代码语言:javascript
复制
public Dialog onCreateDialog(Bundle bundle) {
    OnClickListener listener = (OnClickListener) getActivity();
    ....
    return new AlertDialog.Builder(getActivity())
        ........
        .setAdapter(adapter, listener)
        .create();
}

但我不想让活动监听事件,我需要一个片段。实际上,它可以是任何实现OnClickListener的Java对象。

考虑通过DialogFragment呈现AlertDialog的片段的具体示例。它有“是”/“否”按钮。如何将这些按钮按下发送回创建它的片段?

EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2012-12-06 06:46:54

涉及的活动完全不知道DialogFragment。

片段类:

代码语言:javascript
复制
public class MyFragment extends Fragment {
int mStackLevel = 0;
public static final int DIALOG_FRAGMENT = 1;

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

    if (savedInstanceState != null) {
        mStackLevel = savedInstanceState.getInt("level");
    }
}

@Override
public void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);
    outState.putInt("level", mStackLevel);
}

void showDialog(int type) {

    mStackLevel++;

    FragmentTransaction ft = getActivity().getFragmentManager().beginTransaction();
    Fragment prev = getActivity().getFragmentManager().findFragmentByTag("dialog");
    if (prev != null) {
        ft.remove(prev);
    }
    ft.addToBackStack(null);

    switch (type) {

        case DIALOG_FRAGMENT:

            DialogFragment dialogFrag = MyDialogFragment.newInstance(123);
            dialogFrag.setTargetFragment(this, DIALOG_FRAGMENT);
            dialogFrag.show(getFragmentManager().beginTransaction(), "dialog");

            break;
    }
}

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
        switch(requestCode) {
            case DIALOG_FRAGMENT:

                if (resultCode == Activity.RESULT_OK) {
                    // After Ok code.
                } else if (resultCode == Activity.RESULT_CANCELED){
                    // After Cancel code.
                }

                break;
        }
    }
}

}

DialogFragment类:

代码语言:javascript
复制
public class MyDialogFragment extends DialogFragment {

public static MyDialogFragment newInstance(int num){

    MyDialogFragment dialogFragment = new MyDialogFragment();
    Bundle bundle = new Bundle();
    bundle.putInt("num", num);
    dialogFragment.setArguments(bundle);

    return dialogFragment;

}

@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {

    return new AlertDialog.Builder(getActivity())
            .setTitle(R.string.ERROR)
            .setIcon(android.R.drawable.ic_dialog_alert)
            .setPositiveButton(R.string.ok_button,
                    new DialogInterface.OnClickListener() {
                        public void onClick(DialogInterface dialog, int whichButton) {
                            getTargetFragment().onActivityResult(getTargetRequestCode(), Activity.RESULT_OK, getActivity().getIntent());
                        }
                    }
            )
            .setNegativeButton(R.string.cancel_button, new DialogInterface.OnClickListener() {
                public void onClick(DialogInterface dialog, int whichButton) {
                    getTargetFragment().onActivityResult(getTargetRequestCode(), Activity.RESULT_CANCELED, getActivity().getIntent());
                }
            })
            .create();
}
}
票数 194
EN

Stack Overflow用户

发布于 2013-01-07 08:24:33

可能有点晚了,但可能会帮助其他人解决同样的问题,就像我一样。

在显示之前,您可以在Dialog上使用setTargetFragment,并且在对话框中,您可以调用getTargetFragment来获取引用。

票数 36
EN

Stack Overflow用户

发布于 2012-12-06 07:43:55

您应该在片段类中定义一个interface,并在其父活动中实现该接口。详细信息在此处http://developer.android.com/guide/components/fragments.html#EventCallbacks中概述。代码看起来类似于:

片段:

代码语言:javascript
复制
public static class FragmentA extends DialogFragment {

    OnArticleSelectedListener mListener;

    // Container Activity must implement this interface
    public interface OnArticleSelectedListener {
        public void onArticleSelected(Uri articleUri);
    }

    @Override
    public void onAttach(Activity activity) {
        super.onAttach(activity);
        try {
            mListener = (OnArticleSelectedListener) activity;
        } catch (ClassCastException e) {
            throw new ClassCastException(activity.toString() + " must implement OnArticleSelectedListener");
        }
    }
}

活动:

代码语言:javascript
复制
public class MyActivity extends Activity implements OnArticleSelectedListener{

    ...
    @Override
    public void onArticleSelected(Uri articleUri){

    }
    ...
}
票数 12
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13733304

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档