【问题标题】:the diff with onCreateView and onCreateDialog in DialogFragmentDialogFragment 中与 onCreateView 和 onCreateDialog 的区别
【发布时间】:2014-12-18 10:14:33
【问题描述】:

我有一个正在工作的 DialogFragment,它使用内部类对某些对象、设置菜单图标等做一堆事情。当我去 Android Studio 时,我意识到这是不正确的,我一直在尝试改变内部类是静态的。

在这样做时,我现在尝试使用 onCreateDialog,按照Google docs,“doPositiveClick”和“doNegativeClick”,以便调用 MainActivity 可以对这些对象执行工作,而不是片段执行它。

现在让我感到困惑的是,如何在片段中设置布局 - 我可以输入标题、消息和按钮:

return new AlertDialog.Builder(getActivity())
                .setTitle(R.string.alert_title)
                .setMessage(R.string.alert_message)

                .setPositiveButton(R.string.set,
                        new DialogInterface.OnClickListener() {
                            public void onClick(DialogInterface dialog, int whichButton) {
                                ((MainActivity)getActivity()).doPositiveClick();
                            }
                        }
                )
                .setNegativeButton(R.string.cancel,
                        new DialogInterface.OnClickListener() {
                            public void onClick(DialogInterface dialog, int whichButton) {
                                ((MainActivity)getActivity()).doNegativeClick();
                            }
                        }
                )

但之前我正在做这样的布局:

        final EditText input = new EditText(MainActivity.this);
        LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(20, 20);
        input.setText("5");
        input.setLayoutParams(lp);
        input.setRawInputType(Configuration.KEYBOARD_QWERTY);

问题是,这在 onCreateDialog 哪里? Google 文档展示了如何在对话框 textView 上设置文本,但它位于 onCreateView() 中。

我的困惑是谷歌文档没有同时做这两个,即它没有显示如何同时设置自定义元素,并在调用 MainActivity 中设置正/负点击 - 或者如果是这样,我很抱歉我现在看不到。

那么任何人都可以让我更清楚,使用上面的 onCreateDialog,我怎样才能拥有一个 editText 字段,其默认值接受用户输入,然后将该输入返回给 doPositiveClick() 进行处理。

【问题讨论】:

    标签: android android-dialogfragment


    【解决方案1】:

    DialogFragment 有两种使用方式:对话框或视图。

    case1: 使用DialogFragment 作为对话框。你必须实现onCreateDialog() 才能返回一个对话框。然后必须以下列方式显示对话框。看例子:

    public static class MyAlertDialogFragment extends DialogFragment {
    
    public static MyAlertDialogFragment newInstance(int title) {
        MyAlertDialogFragment frag = new MyAlertDialogFragment();
        Bundle args = new Bundle();
        args.putInt("title", title);
        frag.setArguments(args);
        return frag;
    }
    
    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {
        int title = getArguments().getInt("title");
    
        return new AlertDialog.Builder(getActivity())
                .setIcon(R.drawable.alert_dialog_icon)
                .setTitle(title)
                .setPositiveButton(R.string.alert_dialog_ok,
                    new DialogInterface.OnClickListener() {
                        public void onClick(DialogInterface dialog, int whichButton) {
                            ((FragmentAlertDialog)getActivity()).doPositiveClick();
                        }
                    }
                )
                .setNegativeButton(R.string.alert_dialog_cancel,
                    new DialogInterface.OnClickListener() {
                        public void onClick(DialogInterface dialog, int whichButton) {
                            ((FragmentAlertDialog)getActivity()).doNegativeClick();
                        }
                    }
                )
                .create();
    }
    

    }

    创建并必须按以下方式显示对话框。以这种方式显示不管onCreateView() 是否实现。

        // Create the fragment and show it as a dialog.
    DialogFragment newFragment = MyDialogFragment.newInstance();
    newFragment.show(getFragmentManager(), "dialog");
    

    case2: 用作视图(不是对话框的功能)。它只是视图。您必须实现onCreateView() 并按以下方式显示对话框:

    public static class MyDialogFragment extends DialogFragment {
    static MyDialogFragment newInstance() {
        return new MyDialogFragment();
    }
    
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
        View v = inflater.inflate(R.layout.hello_world, container, false);
        View tv = v.findViewById(R.id.text);
        ((TextView)tv).setText("This is an instance of MyDialogFragment");
        return v;
    }
    

    }

    并且必须显示如下视图。与使用 Fragment 类相同。以这种方式显示不管onCreateDialog() 是否实现。

    FragmentTransaction ft = getFragmentManager().beginTransaction();
    DialogFragment newFragment = MyDialogFragment.newInstance();
    ft.add(R.id.embedded, newFragment);
    ft.commit();
    

    总结: 在设计中,您可以一起实现onCreateView()onCreateDialog(),并在DialogFragment 生命周期中使用相同的源代码。如果屏幕很小,请使用DialogFragment 作为对话框。如果屏幕很大,使用DialogFragment 作为视图(相同的常见Fragment 类)。

    注意使用正确的方式显示DialogFragment以适应onCreateView()onCreateDialog()以防止异常。

    【讨论】:

      【解决方案2】:

      对不起,伙计们,我以为我已经用尽了搜索,但在我发布这个之后,我能够修复它,将文本字段/布局放在 Builder 之前的 onCreateDialog 中,然后对该输入执行 setView() :

              **LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(20, 20);
              final EditText input = new EditText(getActivity());
              input.setText("5");
              input.setLayoutParams(lp);
              input.setRawInputType(Configuration.KEYBOARD_QWERTY);**
      
              // Use the Builder class for convenient dialog construction
              return new AlertDialog.Builder(getActivity())
                      .setTitle(R.string.alert_title)
                      .setMessage(R.string.alert_message)
                      **.setView(input)**
                      .setPositiveButton(R.string.set,
                              new DialogInterface.OnClickListener() {
                                  public void onClick(DialogInterface dialog, int whichButton) {
                                      ((MainActivity)getActivity()).doPositiveClick();
                                  }
                              }
                      )
      

      现在唯一的问题是如何在用户输入后取回值?

      【讨论】:

        猜你喜欢
        • 2012-10-26
        • 1970-01-01
        • 2014-09-26
        • 1970-01-01
        • 2021-01-01
        • 1970-01-01
        • 2015-05-09
        • 1970-01-01
        相关资源
        最近更新 更多