【问题标题】:use material dialog in fragment在片段中使用材质对话框
【发布时间】:2025-12-20 01:05:07
【问题描述】:

我正在使用material-dialogs library https://github.com/afollestad/material-dialogs
我的问题是我不能使用片段中的库

 @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        layout=inflater.inflate(R.layout.fragment_option, null);
        new MaterialDialog.Builder(this) //the problem is this line
           .title("test")
           .content("test")
           .show();
        return layout;
    }

我尝试了以下方法,但都失败了

 new MaterialDialog.Builder(getActivity())
 new MaterialDialog.Builder(this.getActivity())
 new MaterialDialog.Builder(MainActivity.this) //MainActivity is the parent activity

感谢您提供的任何帮助

【问题讨论】:

  • 你试过getSupportActivity()吗?
  • 我认为不是!你能解释得更详细些吗?那是什么?
  • this link 可以帮到你
  • getSupportActivity()课堂上有Fragment,看我的回答)

标签: android android-fragments material-design


【解决方案1】:

您无法在FragmentonCreateView() 方法中获取context,因为片段未添加到Activity

唯一的方法是在FragmentonAttach(Activity activity)(或Fragments lifecicle的后续方法)方法中获取Context

所以你可以这样显示对话框:

@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
Context ctx=this.getActivity();
new MaterialDialog.Builder(ctx)
       .title("test")
       .content("test")
       .show();
}

UPD_0:

确保您在自己的应用中使用 23.0.1 版的 Google 库(AppCompat、支持库等)。 (link)

UPD_1:

由于 onAttach(Activity activity) 已弃用,请使用 onAttach(Context context)

【讨论】:

  • @Johnny 你得到什么样的错误 logCat?还可以尝试更新答案中的代码;
  • java.lang.NoSuchMethodError: 类 Landroid/support/v4/content/ContextCompat 中没有静态方法 getColor(Landroid/content/Context;I)I;或其超类('android.support.v4.content.ContextCompat' 的声明出现在 /data/app/com.test.app-1/base.apk 中)在 com.afollestad.materialdialogs.MaterialDialog$Builder.(MaterialDialog.java:478) 在 com.test.app.FragmentOption.onAttach(FragmentOption.java:32)
  • 在我的应用程序中,我正在使用带有 PagerTabStrip 的 ViewPager,如果使用 23.0.1,PagerTabStrip 不显示标题,首先...! link
  • @Johnny 我相信你可以用没有错误的设计库中的android.support.design.widget.TabLayout 替换PagerTabStrip
  • 嘿@mohax 现在不推荐使用 onAttach 方法我如何在我尝试使用上下文但仍然显示错误的片段中执行此操作。
【解决方案2】:

您无法在片段的“onCreateView”中显示,因为尚未创建视图。在“onAttach”方法中执行此操作也不起作用,因为未创建视图。我建议您查看片段的生命周期以获取更多详细信息。当片段附加到活动时,“onAttach”方法在“onCreateView”之前被调用。 在“onAttach(Context context)”中,您可以初始化片段的回调。

要显示对话框,您可以在“onStart”方法内或在创建视图后调用的每个生命周期方法中执行此操作,将片段附加到活动并设置上下文。我认为“onViewCreated”方法也可以。

我个人更喜欢使用 DialogFragment 而不是 MaterialDialog;我通常只将 MaterialDialog 用于提示消息(例如 AlertDialog)。对于确认对话框、列表对话框、过滤器对话框等其他内容,我更喜欢构建一个扩展 DialogFragment 的对话框类,因为这样我可以轻松地重用该基本对话框。 此外,我通常在活动中实现所有“对话逻辑”,只有当片段可以完成所有工作而没有活动交互时,我才将其放在片段中(因此,例如,如果我的片段包含我需要的所有功能而不是仅可视化部分)。

我认为 MaterialDialog 是显示对话框的快速方法,因为您可以仅使用 builder 方法将其实例化并显示它,因此您不必担心使用 DialogFragment 显示和管理 DialogFragment 的所有逻辑片段管理器。 无论如何,“快速方式”并不总是做某事的“更好方式”。

希望这对您有所帮助,再见,编码很好(:

【讨论】: