我正在尝试显示几乎全屏的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处理Dialogs的方式,因为我对它不熟悉。我怎么能这样做?有没有其他方法可以实现我的目标?
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);
}
不幸的是,这并不是我想要的。我肯定需要在对话框周围显示一个小“填充”来显示背景。
任何想法如何实现?
答案 0 :(得分:142)
全屏显示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
答案 1 :(得分:121)
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setStyle(DialogFragment.STYLE_NORMAL,
android.R.style.Theme_Black_NoTitleBar_Fullscreen);
}
答案 2 :(得分:74)
尝试切换为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>
<强> 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>
答案 3 :(得分:37)
根据此链接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;
}
答案 4 :(得分:17)
就我而言,我使用了以下方法:
@Override
public void onStart() {
super.onStart();
getDialog().getWindow().setLayout(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT);
}
}
Plus LinearLayout用内容填充所有空间。
但是对话框的左右边缘与某些Lollipop +设备(例如Nexus 9)的屏幕边缘之间存在仍然很小的间隙。
这一点并不明显,但最后我发现要在所有设备和平台上实现全宽 window background 应在 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;
}
答案 5 :(得分: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);
}
}
答案 6 :(得分:15)
<强> 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>
<强> 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.AppTheme)
}
其中AppTheme
是您在样式中定义的主题。
答案 7 :(得分:10)
就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);
}
希望它有所帮助。
答案 8 :(得分:9)
尝试在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);
}
答案 9 :(得分: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);
}
}
要提供主题或样式,例如NO_TITLE样式,最佳位置在 onCreate 方法上:
@Override public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setStyle(STYLE_NO_TITLE, android.R.style.Theme_Holo_Light_Dialog);
}
答案 10 :(得分:4)
这是解决这个问题的方法:
@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));
}
}
答案 11 :(得分:2)
Chirag Nagariya是正确的,除了'_Fullscreen'之外。它可以使用任何不是从Dialog风格派生的基本样式来解决。也可以使用'android.R.style.Theme_Black_NoTitleBar'。
答案 12 :(得分:2)
最简单的方法是:
在您的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)上运行。
答案 13 :(得分:2)
在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);
}
答案 14 :(得分:1)
如果有其他人遇到这个,我有类似的经验,但事实证明问题是我忘记从onCreateView返回膨胀的视图(而是返回默认的super.onCreateView)。我只是返回了正确的膨胀视图,这解决了问题。
答案 15 :(得分:1)
还有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)
}
}
答案 16 :(得分:1)
注意:甚至有人都可以在这里找到正确的答案。但是我想澄清一个混乱。
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);
}
答案 17 :(得分:1)
即使您正在处理相对布局,以下方式也会起作用。 请按照以下步骤操作:
转到 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中创建一个新样式,并根据上面的代码进行更改。
转到Dialog Fragment类并在 onCreate()方法中,将对话框的样式设置为:
@覆盖 public void onCreate(@Nullable Bundle savedInstanceState){ super.onCreate(savedInstanceState); 的setStyle(DialogFragment.STYLE_NORMAL,R.style.DialogTheme); }
答案 18 :(得分:1)
我回答这个问题的时间已经很晚了我还想分享这个答案,以便以后任何人都可以使用它。
我在我的项目中使用过此代码,它可以在较低版本和较高版本中使用。
只需在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>
如果有人遇到任何问题,请告诉我。 希望这是有帮助的。谢谢:)
答案 19 :(得分:1)
这是您需要设置为片段的内容:
/* 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>
享受
答案 20 :(得分:1)
尝试使用此常用片段对话框以进行多种用途。 希望这会帮助你下注
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 :(得分:1)
@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;
}
此解决方案在对话框上应用全屏主题,类似于onCreate中的Chirag的setStyle。缺点是不使用savedInstanceState。
答案 22 :(得分:0)
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);
}
答案 23 :(得分:0)
将其添加到全屏对话框样式的下面。
<item name="android:windowNoTitle">true</item>
<item name="android:windowFullscreen">true</item>
<item name="android:windowIsFloating">false</item>
答案 24 :(得分:0)
使用新的ConstraintLayout
的解决方案是将ConstraintLayout
包装在LinearLayout
中,并固定minHeight和minWidth。没有包装,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>
答案 25 :(得分:0)
在科特林为我工作,
override fun onActivityCreated(savedInstanceState: Bundle?) {
super.onActivityCreated(savedInstanceState)
dialog?.window?.setLayout(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT)
}
答案 26 :(得分:0)
以下解决方案对我有用,其他解决方案在侧面给了我一些空间,即不是全屏显示
您需要在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));
}
答案 27 :(得分:0)
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){}
答案 28 :(得分:0)
没有更多需要更复杂代码的样式..带有状态栏..
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);
答案 29 :(得分:0)
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)
}
}