【问题标题】:Full screen DialogFragment全屏DialogFragment
【发布时间】:2017-08-04 07:19:31
【问题描述】:

我正在尝试创建一个宽度为 MATCH_PARENT 的 DialogFragment,因此对话框几乎是全屏的(在边缘周围留有填充以实现浮动外观)。我已经看到了这个解决方案Full Screen DialogFragment in Android,但我试图避免将宽度设置为 1000dp 的黑客行为。对于我当前的布局,无论我使用 FILL_PARENT 还是 MATCH_PARENT,它似乎都将宽度和高度设置为 WRAP_CONTENT。

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

我已将此解决方案用于 Dialog(不是 DialogFragment),它按预期工作:

getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);

【问题讨论】:

  • 我已将 android:minWidth="1000dp" 添加到上述布局中,它给了我想要的结果,但我仍在寻找更优雅的解决方案(如果有的话)。

标签: android android-dialogfragment


【解决方案1】:

这对我来说是完美的。当扩展 DialogFragment 覆盖onCreateView()... 实现所有逻辑

对话框让它全屏只是覆盖这个方法

 @Override
public Dialog onCreateDialog(final Bundle savedInstanceState) {

    // the content
    final RelativeLayout root = new RelativeLayout(getActivity());
    root.setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT));

    // creating the fullscreen dialog
    final Dialog dialog = new Dialog(getActivity());
    dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
    dialog.setContentView(root);
    dialog.getWindow().setBackgroundDrawable(new ColorDrawable(Color.YELLOW));
    dialog.getWindow().setLayout(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);

    return dialog;
}

【讨论】:

  • 很好,但如何也可以删除状态栏?我想要全屏只是我的布局!
  • 只需将此行代码添加为全屏,不带状态栏:dialog.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,WindowManager.LayoutParams.FLAG_FULLSCREEN);
  • 在您的 DialogFragment 的 onCreateView() 上添加以下 getDialog().getWindow().requestFeature(Window.FEATURE_NO_TITL); 对我有效
  • 来源是andraskindler.com/blog/2013/…。代替 Color.YELLOW 你可以写 Color.TRANSPARENT。是必填行,如果去掉,对话框周围会出现边框。
  • @AmirHosseinGhasemi,将getDialog().getWindow().requestFeature(Window.FEATURE_NO_TITLE); 添加到onCreateView() 的任何部分都会导致异常:requestFeature() must be called before adding content
【解决方案2】:

尝试切换到 RelativeLayout 而不是 LinearLayout。它在我的情况下有效

【讨论】:

    【解决方案3】:
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setStyle(DialogFragment.STYLE_NO_TITLE,android.R.style.Theme_Holo_Light);
    }
    

    【讨论】:

      【解决方案4】:

      这个答案对我有帮助 How to set DialogFragment's width and height?

      int width = activity.getResources().getDisplayMetrics().widthPixels;
      int height = activity.getResources().getDisplayMetrics().heightPixels;
      content.setLayoutParams(new LinearLayout.LayoutParams(width, height));
      

      【讨论】:

        【解决方案5】:

        我找到的最佳解决方案是将宽度或 minWidth 设置为任意大的值,以确保它填满屏幕。我不喜欢这个解决方案,但我没有看到更好的解决方案。

        【讨论】:

          【解决方案6】:

          在我的代码中,我想要一个全屏对话框,但仍然在屏幕顶部显示通知栏,所以我正在使用:

          setStyle(DialogFragment.STYLE_NORMAL, android.R.style.Theme_Black_NoTitleBar);
          

          这使它成为全屏,但我没有使用全屏样式,因此我保留了通知栏。

          希望它对某人有所帮助!

          【讨论】:

            【解决方案7】:

            你也可以做类似的事情-

            @Override
              public void onCreate(@Nullable final Bundle savedInstanceState) {
                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
                  setStyle(STYLE_NO_TITLE, android.R.style.Theme_Material_Light_NoActionBar_Fullscreen);
                } else {
                  setStyle(STYLE_NO_TITLE, android.R.style.Theme_DeviceDefault_Light_NoActionBar);
                }
                super.onCreate(savedInstanceState);
            
              }
            

            这样您还可以看到为版本着色的状态栏 >= lollipop

            【讨论】:

            • 正确答案!但不需要检查 Build.Version,只需使用您默认的 AppTheme。
            【解决方案8】:

            关于 DialogFragment 的以下作品。在onCreateView() 中添加以下内容

            getDialog().getWindow().requestFeature(Window.FEATURE_NO_TITLE); 
            

            @Override
            public View onCreateView(LayoutInflater inflater, ViewGroup container,
                                     Bundle savedInstanceState) {
                //…
                getDialog().getWindow().requestFeature(Window.FEATURE_NO_TITLE);
                //…
                return view;
            }
            

            【讨论】:

              【解决方案9】:

              我已经解释了这个问题,这是最短和有效的方法。请查看In this thread

              希望这会有所帮助:)

              【讨论】:

                【解决方案10】:

                要拥有全屏对话框,您需要使用

                public class CustomDialogFragment extends DialogFragment {
                
                    @Override
                    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                        Bundle savedInstanceState) {
                        // Inflate the layout to use as dialog or embedded fragment
                        return inflater.inflate(R.layout.purchase_items, container, false);
                    }
                
                
                    @Override
                    public Dialog onCreateDialog(Bundle savedInstanceState) {
                        Dialog dialog = super.onCreateDialog(savedInstanceState);
                        dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
                        return dialog;
                    }
                }
                

                并显示此对话框:

                CustomDialogFragment newFragment = new CustomDialogFragment();
                FragmentManager fragmentManager = getSupportFragmentManager();
                // To make it fullscreen, use the 'content' root view as the container
                // for the fragment, which is always the root view for the activity
                fragmentManager.beginTransaction().add(android.R.id.content, newFragment).commit();
                

                注意:您不能使用以下代码显示对话框,否则对话框将显示在屏幕中心,而不是全屏。

                //don't show dialog like this
                newFragment.show(fragmentManager, "dialog");
                

                【讨论】:

                • 错误答案!因为您启动的是简单片段而不是对话模式!
                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 2016-07-04
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2015-04-01
                • 1970-01-01
                相关资源
                最近更新 更多