Android 中的全屏对话框片段

我试图显示一个几乎全屏的对话框片段,但是不知道为什么我不能这样做。

我展示这个片段的方式直接来自 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 _ father 以及一些 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">

我知道预计对话框片段将填满屏幕的大部分。但我似乎只调整垂直大小,但只到一些固定宽度水平。

我还尝试在代码中设置窗口属性,就像这里建议的那样: http://groups.google.com/group/android-developers/browse_thread/thread/f0bb813f643604ec

我可能对 Android 处理对话框的方式有些误解,因为我对它还是个新手。我怎么能做这种事?有没有其他方法可以达到我的目标?


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


更新: 我现在设法使它进入全屏幕,片段中包含以下代码

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

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

有什么办法吗?

201060 次浏览

尝试切换到 LinearLayout而不是 RelativeLayout

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;
}


}
}

以及 布局: 片段 _ 对话框. 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>

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>

如果其他人遇到这个问题,我也有过类似的经历,但问题是我忘记从 onCreateView 返回膨胀视图(而是返回默认的 super.onCreateView)。我只是返回了正确的膨胀视图,这就解决了问题。

尝试在 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;
}

或者只是重写 onCreate ()和 setStyle 的代码。

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


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

Chirag Nagariya 是正确的,除了’_ Fullscreen’添加。它可以解决任何基础样式,而不是从对话样式派生。机器人 R 风格。主题 _ Black _ NoTitleBar’也可以使用。

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

@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);
}

我以前在使用全屏对话框片段时遇到过这个问题: 在设置全屏时总是有一个填充。在 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);
}
}

根据这个链接 对话框片段全屏显示边上的填充这将像一个魅力。

@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;
}

获取全屏对话框片段

像这样覆盖对话框片段的 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);
}
}

非常感谢这篇文章: 机器人之谜全屏对话框碎片

这就是我解决这个问题的方法:

@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));
}
}

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){}

至于 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);
}

希望能有帮助。

在我的案例中,我使用了以下方法:

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

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

但是在一些棒棒糖 + 设备(例如 Nexus9)上,对话框的左右边缘和屏幕边缘之间有 还是有些小差距

这并不明显,但最后我发现,为了使 全宽度跨越所有的设备和平台,窗户背景应该像下面这样在 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;
}
@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。

试试这个多用途的公共片段对话框。 希望这个对你有帮助

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();
}
}

下面是您需要设置为片段的内容:

/* 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 (当没有明确说明的时候)将使用它的内部样式来包装自定义布局(没有全屏等)。

布局呢? 不需要粗糙的方式,这个工作得很好:

<?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>

好好享受吧

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

我已经在我的项目中使用了这个代码,它的工作在较低的版本以及较高的版本。

像这样在 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();
}

机器人 R 风格。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>

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

下面的方法将工作,即使你是在一个相对的布局工作。 按照以下步骤:

  1. 转到主题编辑器 (可在工具-> Android-> 主题编辑器下使用)
  2. 选择显示所有主题。选择一个与 AppCompat 对话框
  3. 如果您希望选项 android 窗口背景为任何特定的彩色背景或透明背景,请选择该选项。
  4. 选择颜色并点击 OK。选择新主题的名称。
  5. 转到 Xml,然后在刚刚添加的主题下, 添加以下两个属性:

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

My theme setting for the dialog is as under:

<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>

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

  1. 进入对话框片段类,在 OnCreate ()方法中,将对话框的样式设置为:

    @ 重写 Public void onCreate (@Nullable Bundle savedInstanceState){ OnCreate (savedInstanceState) ; SetStyle (DialogFragment.STYLE _ NORMAL,R.style. DialogTheme) ; }

仅使用样式创建全屏对话框片段

第一个办法

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. 添加到对话框碎片:

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

另一种解决方案

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


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

在 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>

然后在对话框片段中设置样式

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

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

使用以下代码为 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);
}
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);
}

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

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

使用新的 ConstraintLayout的解决方案是将 ConstraintLayout包装在具有 minHeight 和 minWidth 固定值的 LinearLayout中。如果不进行包装,ConstraintLayout 将无法获得对话框的正确大小。

<?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>

还有 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)
}
}

在 Kotlin 为我工作,

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


dialog?.window?.setLayout(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT)


}

下面的解决方案为我工作,其他解决方案给我一些空间的两侧,即不是全屏幕

您需要在 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));
}




   

要做到这一点,最简单的方法是:

将以下主题添加到 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

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

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);
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)


}


}

这是一个运行全屏对话框的富有成效的发现:

AlertDialog.Builder(activity, R.style.Theme_AppName_PopupOverlay)

相应的主题:

<!--night\theme-->
<style name="Theme.AppName.PopupOverlay" parent="ThemeOverlay.AppCompat.Light">
<!--text-->
<item name="colorPrimary">@color/white</item>
<!--title-->
<item name="android:textColor">@color/white</item>
<!--window color-->
<item name="android:backgroundTint">@color/grey_dark</item>
</style>

Alert 对话框生成器还需要参考 PopupOverlay 的当天主题,所以我只需要:

<style name="Theme.AppName.PopupOverlay" parent="ThemeOverlay.AppCompat.Light" />