【问题标题】:Full Screen DialogFragment in AndroidAndroid中的全屏DialogFragment
【发布时间】:2011-08-25 11:59:43
【问题描述】:

我正在尝试显示几乎全屏的 DialogFragment。但不知怎的,我做不到。

我展示 Fragment 的方式直接来自 android 开发者文档

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

// Create and show the dialog.
DialogFragment newFragment = new DetailsDialogFragment();
newFragment.show(ft, "dialog");

我天真地尝试将片段中的 RelativeLayout 设置为 fill_parent 以及一些 minWidth 和 minHeight。

<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"  
    android:minWidth="1000px" 
    android:minHeight="600px"
    android:background="#ff0000">

我知道希望 DialogFragment 填满屏幕的大部分。但我似乎只在垂直方向调整大小,但只在水平方向调整到某个固定宽度。

我还尝试在代码中设置窗口属性,如下所示:http://groups.google.com/group/android-developers/browse_thread/thread/f0bb813f643604ec。但这也无济于事。

我可能对 Android 如何处理对话框有一些误解,因为我对它是全新的。我怎么能做这样的事情?有没有其他方法可以实现我的目标?


Android 设备:
华硕 EeePad 变压器
安卓3.0.1


更新: 我现在设法将其全屏显示,片段中包含以下代码

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setStyle(STYLE_NO_FRAME, android.R.style.Theme_Holo_Light);
}

不幸的是,这不是我想要的。我肯定需要在对话框周围有一个小的“填充”来显示背景。

有什么想法可以实现吗?

【问题讨论】:

标签: android android-dialogfragment


【解决方案1】:

全屏获取DialogFragment

像这样覆盖 DialogFragment 的 onStart

@Override
public void onStart()
{
    super.onStart();
    Dialog dialog = getDialog();
    if (dialog != null)
    {
        int width = ViewGroup.LayoutParams.MATCH_PARENT;
        int height = ViewGroup.LayoutParams.MATCH_PARENT;
        dialog.getWindow().setLayout(width, height);
    }
}

非常感谢这篇文章:The-mystery-of-androids-full-screen-dialog-fragments

【讨论】:

  • 这确实有效,但我尝试使用 Videoview,但它不起作用。状态栏仍然显示。所以这固定了我下面的代码: dialog.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
  • 终于整理出来了,感谢@David的建议
  • 这对我来说效果很好。我使用ViewGroup.LayoutParams.WRAP_CONTENT 作为高度。谢谢。
  • 这很干净而且没有 hacky
  • 这不适用于我的情况.. 它显示了来自各个角落的一些填充。有什么帮助吗?
【解决方案2】:
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    setStyle(DialogFragment.STYLE_NORMAL,
             android.R.style.Theme_Black_NoTitleBar_Fullscreen);
}

【讨论】:

  • 似乎对我有用的唯一解决方案。其他人有时工作,有时不工作。希望我也没有发现这个例外:)
  • 这也适用于我。如果你想让背景透明,你应该使用'''android.R.style.Theme_Translucent_NoTitleBar'''
  • 关键是通过 STYLE_NORMAL。这使得对话框像任何其他活动一样填满屏幕。我们可以使用任何主题。对于材料设计,您可以派生材料主题(例如 Theme.AppCompat.NoActionBar 保留系统装饰但删除操作栏)。
  • 呵呵,一启动就黑屏,我还以为是死机了。然后我将主题更改为 Theme_Light_NoTitleBar_Fullscreen。谢谢,对话框占据了整个屏幕(包括状态栏)。
  • Theme_DeviceDefault_Light_NoActionBar_Fullscreen fow 对话框,白色背景。
【解决方案3】:

尝试切换到LinearLayout 而不是RelativeLayout。测试时我的目标是 3.0 Honeycomb api。

public class FragmentDialog extends Activity {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    Button button = (Button) findViewById(R.id.show);
    button.setOnClickListener(new OnClickListener() {
        public void onClick(View v) {
            showDialog();
        }
    });
}

@Override
public void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);
}

void showDialog() {
    FragmentTransaction ft = getFragmentManager().beginTransaction();
    DialogFragment newFragment = MyDialogFragment.newInstance();
    newFragment.show(ft, "dialog");
}

public static class MyDialogFragment extends DialogFragment {

    static MyDialogFragment newInstance() {
        MyDialogFragment f = new MyDialogFragment();
        return f;
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {
        View v = inflater.inflate(R.layout.fragment_dialog, container, false);
        return v;
    }

}
}

布局fragment_dialog.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:minWidth="1000dp"  
    android:minHeight="1000dp"> 
 </LinearLayout> 

ma​​in.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent"
    android:background="#ffffff">
    <Button android:id="@+id/show"
        android:layout_width="wrap_content" 
        android:layout_height="wrap_content"
        android:layout_weight="0"
        android:text="show">
    </Button>
</LinearLayout>

【讨论】:

  • 对我来说,我需要使用RelativeLayout,但是对话框宽度没有根据内容正确调整,所以我将RelativeLayout嵌套在一个LinearLayout中,它唯一的孩子是RelativeLayout......这个触发了适当的宽度调整。
  • 我测试了所有内容,但我可以确认对我的 DialogFragment 唯一有效的方法是将我的整个布局包装在一个 LinearLayout 中。这样我就可以设置我的(现在包装的)原始布局的宽度和高度......浪费了几个小时
  • 将 minWidth 和 minHeight 设置为较大似乎是关键部分;但这是一个 hack 而不是一个干净的解决方案。下面@David 给出的答案 - 在他给出的链接中进一步解释 - 也有效并且很干净。
  • @tir38 我不认为这是真的,因为 onCreateDialog() 已经在超类中实现了。
  • 这应该是公认的答案。详细而清晰
【解决方案4】:

仅使用样式制作全屏DialogFragment

第一个解决方案

1.添加到您的style.xml

    <style name="FullScreenDialog" parent="Theme.AppCompat.Light.Dialog">
        <item name="android:backgroundDimEnabled">false</item>
        <item name="android:windowNoTitle">true</item>
        <item name="android:padding">0dp</item>
        <item name="android:windowIsFloating">false</item>
        <item name="android:windowBackground">@android:color/transparent</item>
        <item name="android:windowCloseOnTouchOutside">false</item>
    </style>

2。添加到您的 DialogFragment:

@Override
public int getTheme() {
    return R.style.FullScreenDialog;
}

替代解决方案

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)

    setStyle(DialogFragment.STYLE_NO_FRAME, R.style.FullScreenDialog)
}

【讨论】:

  • 这比 bradley4 的回答更优雅。
  • 完美的一条线解决方案
  • 两种解决方案都有效,但第一个导致剪贴板弹出错误。替代工作正常
【解决方案5】:

根据此链接DialogFragment fullscreen shows padding on sides 这将像一个魅力。

@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.TRANSPARENT));
    dialog.getWindow().setLayout(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);

    return dialog;
}

【讨论】:

  • 效果很好,即使是在 2018 年! (没有别的)谢谢。
  • 即使在 2018 年的 Android Studio 3.1+ 中,这也是完美的答案,比这里存在的其他答案更好。另一个答案会破坏 android UI,如 cardview、spinner 等。
  • 在 2020 年魅力四射!
  • 有效,但是如果你想在你的 XML 布局中定义边距,你必须用另一个布局包裹你的视图,否则边距将被忽略。
【解决方案6】:

就我而言,我使用了以下方法:

    @Override
    public void onStart() {
        super.onStart();
        getDialog().getWindow().setLayout(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT);
    }
}

加上 LinearLayout 来用内容填充所有空间。

但在某些 Lollipop+ 设备(例如 Nexus 9)上,对话框的左右边缘与屏幕边缘之间仍然存在小间隙

这不是很明显,但最后我发现要使其 全宽 跨越所有设备和平台 窗口背景 应该在 styles.xml 中指定 如下:

<style name="Dialog.NoTitle" parent="Theme.AppCompat.Dialog">
    <item name="android:windowNoTitle">true</item>
    <item name="android:padding">0dp</item>
    <item name="android:windowBackground">@color/window_bg</item>
</style>

当然,当我们创建如下对话框时需要使用这种样式:

    public static DialogFragment createNoTitleDlg() {
        DialogFragment frag = new Some_Dialog_Frag();
        frag.setStyle(DialogFragment.STYLE_NO_TITLE, R.style.Dialog_NoTitle);
        return frag;
}

【讨论】:

  • 这就是答案。效果很好。
  • 我在这个线程上尝试了大部分答案,有些有效,但我失去了所有应用程序兼容主题样式。我希望这个可以作为父主题是 AppCompat。它几乎奏效了。对我来说,我必须添加 2 个额外的样式:&lt;item name="android:windowFullscreen"&gt;true&lt;/item&gt; &lt;item name="android:windowIsFloating"&gt;false&lt;/item&gt; 来源:TechRepublic
【解决方案7】:

我之前在使用全屏 dialogFragment 时遇到过这个问题:设置全屏时总是有填充。在 dialogFragment 的 onActivityCreated() 方法中试试这段代码:

public void onActivityCreated(Bundle savedInstanceState)
{   
    super.onActivityCreated(savedInstanceState);
    Window window = getDialog().getWindow();
    LayoutParams attributes = window.getAttributes();
    //must setBackgroundDrawable(TRANSPARENT) in onActivityCreated()
    window.setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
    if (needFullScreen)
    {
        window.setLayout(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT);
    }
}

【讨论】:

  • 它有效,其他解决方案改变了按钮的主题和片段的其他元素。
【解决方案8】:

就 Android API 的更新而言,显示全屏对话框的建议方法如下:

FragmentTransaction transaction = this.mFragmentManager.beginTransaction();
// For a little polish, specify a transition animation
transaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
// To make it fullscreen, use the 'content' root view as the container
// for the fragment, which is always the root view for the activity
transaction.add(android.R.id.content, this.mFragmentToShow).commit();

否则,如果您不希望它全屏显示,您可以这样做:

this.mFragmentToShow.show(this.mFragmentManager, LOGTAG);

希望对你有帮助。

编辑

请注意,我提供的解决方案有效,但有一个弱点,有时可能会很麻烦。将 DialogFragment 添加到 android.R.id.content 容器将不允许您正确处理 DialogFragment#setCancelable() 功能,并且在将 DialogFragment 本身添加到后台堆栈时也可能导致意外行为。

所以我建议您在 onCreate 方法中简单地更改 DialogFragment 的样式,如下所示:

@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setStyle(DialogFragment.STYLE_NORMAL, android.R.style.Theme_Translucent_NoTitleBar);
}

希望对你有帮助。

【讨论】:

  • 我同意。以下是来自 Android 开发者指南的完整解释:link
【解决方案9】:

还有 kotlin 版本!

override fun onStart() {
    super.onStart()
    dialog?.let {
        val width = ViewGroup.LayoutParams.MATCH_PARENT
        val height = ViewGroup.LayoutParams.MATCH_PARENT
        it.window?.setLayout(width, height)
    }
}

【讨论】:

  • 真的好用!另外我想补充一点,开发者应该用透明的FrameLayout包装对话框内容,以避免内容变形。
【解决方案10】:

尝试在 onCreate 中使用 setStyle() 并覆盖 onCreateDialog 制作没有标题的对话框

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);    
    setStyle(DialogFragment.STYLE_NORMAL, android.R.style.Theme);        
}

@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
    Dialog dialog = super.onCreateDialog(savedInstanceState);
    dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);        
    return dialog;
}

或者直接覆盖 onCreate() 和 setStyle 代码。

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);    
    setStyle(DialogFragment.STYLE_NO_TITLE, android.R.style.Theme);        
}

【讨论】:

    【解决方案11】:

    这确实取决于布局的定义方式。但是为了确保对话框获得所需的大小,最好的解决方案是在显示对话框后(而不是在创建时)提供 LayoutParams。 在 DialogFragment 上,对话框显示在 onStart 方法上,因此获得全宽的有效方法是:

    @Override public void onStart() {
        super.onStart();
        Dialog d = getDialog();
        if (d!=null){
            d.getWindow().setLayout(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);
        }
    }
    

    要同时提供主题或样式,例如 NO_TITLE 样式,最好的位置是在 onCreate 方法上:

    @Override public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setStyle(STYLE_NO_TITLE, android.R.style.Theme_Holo_Light_Dialog);
    }
    

    【讨论】:

      【解决方案12】:

      注意:甚至可以在这里找到正确的答案。但我想澄清一个困惑。

      使用下面的代码android.app.DialogFragment

      @Override
      public void onStart()
      {
          super.onStart();
          Dialog dialog = getDialog();
          if (dialog != null)
          {
              int width = ViewGroup.LayoutParams.MATCH_PARENT;
              int height = ViewGroup.LayoutParams.MATCH_PARENT;
              dialog.getWindow().setLayout(width, height);
          }
      }
      

      使用下面的代码android.support.v4.app.DialogFragment

      @Override
      public void onCreate(Bundle savedInstanceState) {
          super.onCreate(savedInstanceState);
          setStyle(DialogFragment.STYLE_NORMAL, android.R.style.Theme_Black_NoTitleBar_Fullscreen);
      }
      

      【讨论】:

        【解决方案13】:

        实现这一目标的最简单方法是:

        将以下主题添加到您的styles.xml

        <style name="DialogTheme" parent="AppTheme">
            <item name="android:windowNoTitle">true</item>
            <item name="android:windowFullscreen">false</item>
            <item name="android:windowIsFloating">false</item>
        </style>
        

        在你的类中扩展 DialogFragment,覆盖

        @Override
        public int getTheme() {
            return R.style.DialogTheme;
        }
        

        这也适用于 Android OS 11(R)。

        https://anubhav-arora.medium.com/android-full-screen-dialogfragment-1410dbd96d37

        【讨论】:

          【解决方案14】:

          这是我如何解决这个问题的解决方案:

          @Override
          public Dialog onCreateDialog(Bundle savedInstanceState) {
              Dialog dialog = super.onCreateDialog(savedInstanceState);    
              dialog.getWindow().requestFeature(Window.FEATURE_NO_TITLE);   
          
              return dialog;
          }
          
          @Override
          public void onStart() {
              super.onStart();
              Dialog dialog = getDialog();
              if (dialog != null) {
                      dialog.getWindow().setLayout(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);
                      dialog.getWindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
              }
          }
          

          【讨论】:

            【解决方案15】:

            在您的 style.xml 中创建以下主题:

            <style name="DialogTheme" parent="Theme.AppCompat.Light.DarkActionBar">
               <item name="android:paddingRight">0dp</item>
               <item name="android:paddingLeft">0dp</item>
               <item name="android:layout_width">match_parent</item>
               <item name="android:windowNoTitle">true</item>
            </style>
            

            然后在DialogFragment中设置样式

            @Override
            public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setStyle(DialogFragment.STYLE_NO_TITLE, R.style.DialogTheme);
            }
            

            【讨论】:

              【解决方案16】:

              Chirag Nagariya 是对的,只是添加了“_Fullscreen”。它可以使用任何不是从对话框样式派生的基本样式来解决。 'android.R.style.Theme_Black_NoTitleBar' 也可以使用。

              【讨论】:

                【解决方案17】:

                即使您正在处理相对布局,以下方式也将起作用。 请按照以下步骤操作:

                1. 转到主题编辑器(在工具-> Android -> 主题编辑器下可用)
                2. 选择显示所有主题。选择带有 AppCompat.Dialog 的那个
                3. 如果您希望它具有任何特定的彩色背景或透明背景,请选择 android 窗口背景选项。
                4. 选择颜色并点击确定。选择新主题的名称。
                5. 进入styles.xml,然后在刚刚添加的主题下, 添加这两个属性:

                  <item name="android:windowNoTitle">true</item>
                  <item name="android:windowIsFloating">false</item>
                  

                我的对话框主题设置如下:

                <style name="DialogTheme" parent="Theme.AppCompat.Dialog" >
                    <item name="android:layout_width">match_parent</item>
                    <item name="android:layout_height">match_parent</item>
                    <item name="android:windowBackground">@android:color/transparent</item>
                    <item name="android:windowNoTitle">true</item>
                    <item name="android:windowIsFloating">false</item>
                

                确保主题的父主题为 Theme.AppCompat.Dialog 另一种方法是在 styles.xml 中创建一个新样式并按照上面的代码进行更改。

                1. 转到您的 Dialog Fragment 类并在 onCreate() 方法中,将 Dialog 的样式设置为:

                  @覆盖 public void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); setStyle(DialogFragment.STYLE_NORMAL,R.style.DialogTheme); }

                【讨论】:

                  【解决方案18】:

                  万一其他人遇到这种情况,我也有类似的经历,但事实证明问题是我忘记从 onCreateView 返回膨胀的视图(而不是返回默认的 super.onCreateView)。我只是返回了正确的膨胀视图并解决了问题。

                  【讨论】:

                    【解决方案19】:
                    @Override
                    public Dialog onCreateDialog(Bundle savedInstanceState) {
                        Dialog dialog = new Dialog(getActivity(), android.R.style.Theme_Holo_Light);
                        dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
                    
                        return dialog;
                    }
                    

                    此方案在对话框上应用全屏主题,类似于 Chirag 在 onCreate 中的 setStyle。一个缺点是没有使用 savedInstanceState。

                    【讨论】:

                      【解决方案20】:

                      试试这个用于多种用途的通用片段对话框。 希望这对您投注有帮助

                      public class DialogFragment extends DialogFragment {
                      
                          @Override
                          public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
                              View rootView = inflater.inflate(R.layout.fragment_visit_history_main, container, false);
                      
                              getDialog().getWindow().requestFeature(Window.FEATURE_NO_TITLE);
                              getDialog().getWindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
                              initializeUI(rootView);
                              return rootView;
                          }
                      
                          @Override
                          public void onStart() {
                              super.onStart();
                              Dialog dialog = getDialog();
                              if (dialog != null) {
                                  int width = ViewGroup.LayoutParams.MATCH_PARENT;
                                  int height = ViewGroup.LayoutParams.MATCH_PARENT;
                                  dialog.getWindow().setLayout(width, height);
                              }
                          }
                          private void initializeUI(View rootView) {
                          //getChildFragmentManager().beginTransaction().replace(R.id.fv_container,FragmentVisitHistory.getInstance(), AppConstant.FRAGMENT_VISIT_HISTORY).commit();
                          }
                      }
                      

                      【讨论】:

                      【解决方案21】:

                      这是你需要设置的片段:

                      /* theme is optional, I am using leanback... */
                      setStyle(STYLE_NORMAL, R.style.AppTheme_Leanback);
                      

                      在你的情况下:

                      DialogFragment newFragment = new DetailsDialogFragment();
                      newFragment.setStyle(STYLE_NORMAL, R.style.AppTheme_Leanback);
                      newFragment.show(ft, "dialog");
                      

                      为什么?因为 DialogFragment(当没有明确告知时)将使用其内部样式,将您的自定义布局包装在其中(无全屏等)。

                      还有布局?不需要 hacky 方式,这工作得很好:

                      <?xml version="1.0" encoding="utf-8"?>
                      <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
                                  android:layout_width="match_parent"
                                  android:layout_height="match_parent">
                          ...
                      </RelativeLayout>
                      

                      享受

                      【讨论】:

                        【解决方案22】:

                        我回答这个问题很晚了,我仍然想分享这个答案,以便将来任何人都可以使用它。

                        我在我的项目中使用了这个代码,它可以在低版本和高版本中使用。

                        只需像这样在 onCreateDialog() 中使用这个主题:

                        @Override
                        public Dialog onCreateDialog(Bundle savedInstanceState) {
                        
                            View view = getActivity().getLayoutInflater().inflate(R.layout.dialog_pump_details, null);
                        
                            AlertDialog.Builder builder = new AlertDialog.Builder(getActivity(), android.R.style.Theme_Black_NoTitleBar_Fullscreen);
                            return builder.create();
                        }
                        

                        android.R.style.Theme_Black_NoTitleBar_Fullscreen - 这是这个主题的源代码,你可以看到只有这个主题足以让DialogFragment全屏显示。

                        <!-- Variant of {@link #Theme_Black} that has no title bar and
                             no status bar.  This theme
                             sets {@link android.R.attr#windowFullscreen} to true.  -->
                        <style name="Theme.Black.NoTitleBar.Fullscreen">
                            <item name="windowFullscreen">true</item>
                            <item name="windowContentOverlay">@null</item>
                        </style>
                        

                        如果有人遇到任何问题,请告诉我。 希望这会有所帮助。谢谢:)

                        【讨论】:

                        • 对话框进入全屏模式,但除了一个按钮外,一切都变黑了。有什么想法吗??
                        【解决方案23】:

                        以全屏对话框的样式添加以下行。

                        <item name="android:windowNoTitle">true</item>
                            <item name="android:windowFullscreen">true</item>
                            <item name="android:windowIsFloating">false</item>
                        

                        【讨论】:

                        • 或:覆盖 fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setStyle(DialogFragment.STYLE_NORMAL, R.style.BottomSheetDialogThemeNoFloating)
                        【解决方案24】:

                        window.setLayout 对于旧设备来说是不够的。

                        这是我的工作:

                        try {
                            ViewGroup parent = (ViewGroup) view;
                            do {
                                parent = (ViewGroup) parent.getParent();
                                if (parent == null)
                                    break;
                        
                                parent.getLayoutParams().height = ViewGroup.LayoutParams.MATCH_PARENT;
                                parent.getLayoutParams().width = ViewGroup.LayoutParams.MATCH_PARENT;
                                parent.requestLayout();
                            } while (true);
                        } catch (Exception e){}
                        

                        【讨论】:

                          【解决方案25】:
                          This below answer works for me in fragment dialog.  
                          
                          
                            Dialog dialog = getDialog();
                                  if (dialog != null)
                                  {
                                      int width = ViewGroup.LayoutParams.MATCH_PARENT;
                                      int height = ViewGroup.LayoutParams.MATCH_PARENT;
                                      dialog.getWindow().setLayout(width, height);
                                  }
                          

                          【讨论】:

                            【解决方案26】:

                            使用新的ConstraintLayout 的解决方案是将ConstraintLayout 包装在LinearLayout 中,并固定minHeight 和minWidth。如果没有包装,ConstraintLayout 就无法获得适合 Dialog 的大小。

                            <?xml version="1.0" encoding="utf-8"?>
                            <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
                                xmlns:app="http://schemas.android.com/apk/res-auto"
                                android:layout_width="match_parent"
                                android:layout_height="match_parent"
                                android:minWidth="1000dp"
                                android:minHeight="1000dp"
                                android:orientation="vertical">
                            
                                <androidx.constraintlayout.widget.ConstraintLayout
                                    android:layout_width="match_parent"
                                    android:layout_height="match_parent"
                                    android:background="@color/background_color"
                                    android:orientation="vertical">
                                    <!-- some constrained views -->
                                </androidx.constraintlayout.widget.ConstraintLayout>
                            
                            </LinearLayout>
                            

                            【讨论】:

                              【解决方案27】:

                              在 Kotlin 为我工作,

                               override fun onActivityCreated(savedInstanceState: Bundle?) {
                                  super.onActivityCreated(savedInstanceState)
                              
                                  dialog?.window?.setLayout(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT)
                              
                              }
                              

                              【讨论】:

                                【解决方案28】:

                                以下解决方案对我有用,其他解决方案在侧面给了我一些空间,即不是全屏

                                你需要对 onStart 和 onCreate 方法进行修改

                                @Override
                                public void onStart() {
                                    super.onStart();
                                    Dialog dialog = getDialog();
                                    if (dialog != null)
                                    {
                                        int width = ViewGroup.LayoutParams.MATCH_PARENT;
                                        int height = ViewGroup.LayoutParams.MATCH_PARENT;
                                        dialog.getWindow().setLayout(width, height);
                                    }
                                }
                                
                                
                                 public Dialog onCreateDialog(@Nullable Bundle savedInstanceState) {
                                    final Dialog dialog = new Dialog(requireContext());
                                    dialog.getWindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
                                 }
                                
                                
                                   
                                

                                【讨论】:

                                  【解决方案29】:

                                  没有更多需要更复杂代码的样式..带有状态栏..

                                  public static void ShowFullScreenDialog(Context context, View contentView, string header)
                                          {
                                  
                                              using (Android.Support.V7.App.AlertDialog.Builder builder = new Android.Support.V7.App.AlertDialog.Builder(context, Android.Resource.Style.ThemeBlackNoTitleBarFullScreen))
                                              {
                                                  var view = UIHelper.InflaterView(context, Resource.Layout.dialog_full_screen);
                                                  builder.SetView(view);
                                                  Dialog dialog = builder.Create();
                                                  dialog.Window.SetBackgroundDrawableResource(ThemeHelper.GetMainActivityThemeDrawable());
                                                  dialog.Window.SetLayout(context.Resources.DisplayMetrics.WidthPixels, context.Resources.DisplayMetrics.HeightPixels);
                                                  dialog.Window.DecorView.SystemUiVisibility = StatusBarVisibility.Visible;
                                                  
                                                  //fullLinear
                                                  var headtxt = view.FindViewById<TextView>(Resource.Id.headertxt);
                                                  headtxt.SetTextColor(Color.White);
                                                  headtxt.Text = header;
                                                  var fullLinear = view.FindViewById<LinearLayout>(Resource.Id.fullLinear);
                                                  var closeBttn = view.FindViewById<ImageButton>(Resource.Id.closeBttn);
                                                  closeBttn.ImageTintList = ColorHelper.ConvertColorToStateList(Color.White);
                                                  closeBttn.Click += delegate
                                                  {
                                                      dialog.Hide();
                                                  };
                                                  if (contentView.Parent != null)
                                                      ((ViewGroup)contentView.Parent).RemoveView(contentView); // <- fix
                                                  fullLinear.AddView(contentView);
                                                  
                                                  dialog.Show();
                                              }
                                              
                                          }
                                  

                                  重要

                                  dialog.Window.SetLayout(context.Resources.DisplayMetrics.WidthPixels, context.Resources.DisplayMetrics.HeightPixels);
                                  

                                  【讨论】:

                                    【解决方案30】:
                                    class NameDialog : DialogFragment(){
                                    lateinit  var mDataBinding:NameYourLayoutBinding
                                    
                                        override fun onCreateView(
                                            inflater: LayoutInflater,
                                            container: ViewGroup?,
                                            savedInstanceState: Bundle?
                                        ): View {
                                             super.onCreateView(inflater, container, savedInstanceState)
                                            mDataBinding=DataBindingUtil.inflate(
                                                LayoutInflater.from(getContext()),
                                                R.layout.YOUR.LAYOUT.NAME,
                                                null,
                                                false
                                            )
                                            dialog?.let {
                                                it.window?.requestFeature(Window.FEATURE_NO_TITLE)
                                                it.window?.setBackgroundDrawable(ColorDrawable(Color.TRANSPARENT))
                                            }
                                            return mDataBinding.root
                                        }
                                    
                                    
                                    
                                        override fun onStart() {
                                            super.onStart()
                                            dialog?:return
                                                val width = ViewGroup.LayoutParams.MATCH_PARENT
                                                val height = ViewGroup.LayoutParams.MATCH_PARENT
                                                dialog?.window?.setLayout(width, height)
                                    
                                        }
                                    
                                    }
                                    

                                    【讨论】:

                                      猜你喜欢
                                      • 1970-01-01
                                      • 1970-01-01
                                      • 1970-01-01
                                      • 1970-01-01
                                      • 1970-01-01
                                      • 1970-01-01
                                      • 2016-07-04
                                      • 1970-01-01
                                      • 1970-01-01
                                      相关资源
                                      最近更新 更多