【问题标题】:How to display AlertDialog in a Fragment?如何在片段中显示 AlertDialog?
【发布时间】:2012-04-29 17:39:18
【问题描述】:

我想在我的应用程序中显示一个警报对话框。我正在使用片段。我尝试了下面的代码来做到这一点:

 AlertDialog ad = new AlertDialog.Builder(context)
            .create();
    ad.setCancelable(false);
    ad.setTitle(title);
    ad.setMessage(message);
    ad.setButton(context.getString(R.string.ok_text), new DialogInterface.OnClickListener() {

        public void onClick(DialogInterface dialog, int which) {
            dialog.dismiss();
        }
    });
ad.show();

但它崩溃了,logcat 中的错误是:

04-18 15:23:01.770: E/AndroidRuntime(9424): android.view.WindowManager$BadTokenException: 无法添加窗口 -- 令牌 null 不适用于应用程序

从互联网上我了解到崩溃是由于上下文问题造成的。我已经给出了上下文

context = this.getActivity().getApplicationContext();

我不知道这有什么问题。有谁能够帮我?

【问题讨论】:

    标签: java android fragment android-alertdialog android-context


    【解决方案1】:

    context 替换为getActivity()

    ApplicationContext 不应用于创建对话框等任务。当您在片段中时,您可以通过调用 Fragments getActivity() 方法来获取 Activity-Context。

    【讨论】:

    • getActivity()为空怎么办?
    • @SujithPt 当getActivity() 返回 null 时,表示该 Fragment 未附加到 Activity,您不应显示任何对话框。
    • @SujithThankachan 你可以等到 getActivity() 不为空。不过我还没试过。
    • requireActivity() 在february 2018 中添加了新方法,如果它返回 null,则会引发异常。如果您确定此方法不会返回 null,因为您在 onAttach 和 onDetach 之间使用,您可以使用它来避免 getActivity() 可能返回 null 的警告。
    【解决方案2】:

    有关此问题的更多信息(片段中的 AlertDialog,在事件中管理):

    如果您在 onClick(View v) 或 onLongClick(View v) 等事件中调用 AlertDialog,您可以使用

    public boolean onClick(View v) {
        ...
        AlertDialog.Builder alertBuilder = new AlertDialog.Builder(v.getContext());
        ...
    }
    

    【讨论】:

      【解决方案3】:

      尝试使用DialogFragment,使用Fragments时DialogFragment更好

      【讨论】:

      【解决方案4】:

      我遇到过类似的问题,我试图从片段创建 AlertDialog。 NullPointerException 从中产生。最初我是这样做的:

      AlertDialog alertDialog = new AlertDialog.Builder(getActivity()).create();
      

      NullPointerException 专门在稍后在代码中调用 alertDialog.show() 时出现。 但是在搜索AlertDialog.Builder()的文档之后,似乎还有另一种方法来初始化它[AlertDialog.Builder Doc],即包含一个主题/resId,如下所示:

      AlertDialog alertDialog = new AlertDialog.Builder(getActivity(), R.style.Theme_AppCompat_Dialog_Alert).create();
      

      这解决了手头的NullPointerException。希望这对您也有帮助!

      【讨论】:

        【解决方案5】:

        我在 listView 内的适配器中使用它,因此我无法使用 getActivity()。为了使它工作,我使用getActivity() 作为片段中适配器实例化的上下文:

        this.adapter = new myAdapter(getActivity(), factory);
        

        后来在另一个类(适配器的类)中,我能够使用getContext()并且它起作用了。

        【讨论】:

          【解决方案6】:

          AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());

          【讨论】:

          • 对已接受的答案重复答案
          【解决方案7】:
                                 AlertDialog alert= null;
                                  AlertDialog.Builder build= new AlertDialog.Builder(getActivity());
                                  build.setTitle("title");
                                  build.setItems(stringarrayname, new DialogInterface.OnClickListener() {
          
                                      @Override
                                      public void onClick(DialogInterface dialog, int which) {
                                          // TODO Auto-generated method stub
                                      //Toast.makeText(getActivity(), "hi", Toast.LENGTH_SHORT).show();   
          
                                      }
                                  });
                                  build.create().show();
          

          【讨论】:

          • 我通过在片段中使用此代码得到了警报对话框
          • 这段代码是错误的,你应该使用 alert= build.create(); alert.show();
          【解决方案8】:

          你可以试试这个或者使用DialogFragment

          private void showAlert(final int position) {
                  new AlertDialog.Builder(getActivity().getApplicationContext())
                          .setTitle("Delete entry")
                          .setMessage("Are you sure you want to delete this entry?")
                          .setPositiveButton(android.R.string.yes, new DialogInterface.OnClickListener() {
                              public void onClick(DialogInterface dialog, int which) {
                                //  deleteSuggestions(position);
                              }
                          })
                          .setNegativeButton(android.R.string.no, new DialogInterface.OnClickListener() {
                              public void onClick(DialogInterface dialog, int which) {
                                  // do nothing
                              }
                          })
                          .setIcon(android.R.drawable.ic_dialog_alert)
                          .show();
              }
          

          【讨论】:

            【解决方案9】:

            解决办法是用getActivity()替换

            AlertDialog.Builder alert = new AlertDialog.Builder(getActivity(),R.style.MaDialog);
            

            【讨论】:

              猜你喜欢
              • 2011-09-29
              • 2019-06-25
              • 1970-01-01
              • 1970-01-01
              • 2021-01-31
              • 2016-11-06
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多