Android中的全屏DialogFragment

Eri*_*ric 148 android android-dialogfragment

我正在尝试显示几乎全屏的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");
Run Code Online (Sandbox Code Playgroud)

我知道天真地尝试将片段中的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">
Run Code Online (Sandbox Code Playgroud)

我知道期望DialogFragment填满屏幕的大部分.但我似乎只是垂直调整大小,但只是水平固定宽度.

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

我可能误解了Android处理Dialogs的方式,因为我对它不熟悉.我怎么能这样做?有没有其他方法可以实现我的目标?


Android设备:
华硕EeePad Transformer
Android 3.0.1


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

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

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

任何想法如何实现?

Dav*_*vid 157

要全屏显示DialogFragment

onStart像这样覆盖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);
    }
}
Run Code Online (Sandbox Code Playgroud)

非常感谢这篇文章:- 机器人 - 全屏 - 对话 - 碎片的神秘面纱

  • 确实这是有效的,但我尝试使用Videoview,它不适用于此.StatusBar仍然显示.所以这解决了我下面的代码:dialog.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,WindowManager.LayoutParams.FLAG_FULLSCREEN); (6认同)
  • 这对我的情况不起作用..它显示了来自各个角落的一些填充.任何帮助? (6认同)
  • 对我来说,它显示水平边距,但是在`onCreateDialog`方法中添加以下几行解决了我的问题`final Dialogdialog = new Dialog(requireContext()); dialog.getWindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));` (3认同)

Chi*_*iya 135

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    setStyle(DialogFragment.STYLE_NORMAL,
             android.R.style.Theme_Black_NoTitleBar_Fullscreen);
}
Run Code Online (Sandbox Code Playgroud)

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

bra*_*ey4 72

尝试切换到a 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;
    }

}
}
Run Code Online (Sandbox Code Playgroud)

布局: 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> 
Run Code Online (Sandbox Code Playgroud)

main.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>
Run Code Online (Sandbox Code Playgroud)

  • 将minWidth和minHeight设置为较大似乎是关键部分; 但这是一个黑客而不是一个干净的解决方案.@David在下面给出的答案 - 在他给出的链接中进一步解释 - 也有效且干净. (6认同)

Aym*_*oub 39

根据这个链接,DialogFragment全屏显示两侧的填充,这将像一个魅力.

@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;
}
Run Code Online (Sandbox Code Playgroud)

  • 即使在2018年,工作也很棒!(没有别的)谢谢. (4认同)
  • 即使在2018年的Android Studio 3.1+中,这也是完美的答案,优于此处的其他答案.另一个答案将破坏Android UI,如cardview,微调器等. (2认同)

vov*_*ost 20

仅使用样式制作全屏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>
    </style>
Run Code Online (Sandbox Code Playgroud)

2.添加到DialogFragment:

@Override
public int getTheme() {
    return R.style.FullScreenDialog;
}
Run Code Online (Sandbox Code Playgroud)

替代方案

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

    setStyle(DialogFragment.STYLE_NO_FRAME, R.style.AppTheme)
}
Run Code Online (Sandbox Code Playgroud)

AppTheme您在样式中定义的主题在哪里.


goR*_*Gon 17

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

    @Override
    public void onStart() {
        super.onStart();
        getDialog().getWindow().setLayout(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT);
    }
}
Run Code Online (Sandbox Code Playgroud)

加上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>
Run Code Online (Sandbox Code Playgroud)

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

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

  • 我在这个帖子上尝试了大部分答案,有些工作,但我丢失了所有app compat主题样式.我希望这个作为父主题是AppCompat.它几乎起作用了.对我来说,我不得不添加2个额外的样式:`<item name ="android:windowFullscreen"> true </ item> <item name ="android:windowIsFloating"> false </ item>`来源:[TechRepublic](http ://www.techrepublic.com/article/pro-tip-unravel-the-mystery-of-androids-full-screen-dialog-fragments/) (2认同)

rui*_*dge 15

我在使用全屏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);
    }
}
Run Code Online (Sandbox Code Playgroud)


and*_*ldi 11

对于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();
Run Code Online (Sandbox Code Playgroud)

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

this.mFragmentToShow.show(this.mFragmentManager, LOGTAG);
Run Code Online (Sandbox Code Playgroud)

希望能帮助到你.

编辑

请注意我给出的解决方案有效,但有一个弱点,有时可能会很麻烦.将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);
}
Run Code Online (Sandbox Code Playgroud)

希望能帮助到你.


Bol*_*aul 10

还有 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)
    }
}
Run Code Online (Sandbox Code Playgroud)


Jay*_*ker 9

尝试在onCreate中使用setStyle()并覆盖onCreateDialog make对话框,不带标题

@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;
}
Run Code Online (Sandbox Code Playgroud)

或者只是覆盖onCreate()和setStyle的代码.

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


cod*_*zzi 8

它确实取决于布局的定义方式.但是为了确保对话框获得所需的大小,最好的解决方案是在显示对话框后提供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);
    }
}
Run Code Online (Sandbox Code Playgroud)

要提供主题或样式,如NO_TITLE样式,最佳位置在onCreate方法上:

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


Khe*_*raj 7

注意:即使是一个人也可以在这里找到正确的答案。但我想澄清一个困惑。

使用下面的代码 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);
    }
}
Run Code Online (Sandbox Code Playgroud)

使用下面的代码 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);
}
Run Code Online (Sandbox Code Playgroud)


Anu*_*hav 6

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

将以下主题添加到你的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>
Run Code Online (Sandbox Code Playgroud)

并在您的类中扩展 DialogFragment,覆盖

@Override
public int getTheme() {
    return R.style.DialogTheme;
}
Run Code Online (Sandbox Code Playgroud)

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

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