如何使对话框片段宽度填充_父

我工作在一个 Android 应用程序,我使用 DialogFragment显示对话框,但它的宽度非常小。我怎样才能使这个宽度到 fill_parent到它?

public class AddNoteDialogFragment extends DialogFragment {


public AddNoteDialogFragment() {
// Empty constructor required for DialogFragment
}


@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
getDialog().setTitle(getString(R.string.app_name));
View view = inflater.inflate(R.layout.fragment_add_note_dialog,
container);


return view;
}




@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
Dialog dialog = super.onCreateDialog(savedInstanceState);


// request a window without the title
dialog.getWindow().requestFeature(Window.FEATURE_NO_TITLE);


return dialog;
}
}

片段 _ add _ note _ Dialogue. 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:background="@android:color/white"
android:orientation="vertical"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin" >


<EditText
android:id="@+id/addNoteEditText"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="top"
android:hint="@string/clock_enter_add_note"
android:imeOptions="actionDone"
android:inputType="textCapSentences|textMultiLine"
android:lines="5" />


<Button
android:id="@+id/submit"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="10dp"
android:background="@drawable/login_button"
android:text="@string/submit_button"
android:textColor="@android:color/white" />


</LinearLayout>

90801 次浏览

你有没有试过用 如何使一个警报对话框填充90% 的屏幕大小的猫王的答案?

它是这样的:

dialog.getWindow().setLayout(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT);

更新:

Above code should be added inside onStart() method of the DialogFragment.

这是我想出来的解决办法:

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

编辑:

在返回膨胀视图之前,可以使用片段的 onCrateView方法中的以下代码。

getDialog().getWindow().requestFeature(Window.FEATURE_NO_TITLE);
getDialog().getWindow().setBackgroundDrawable(new ColorDrawable(android.graphics.Color.TRANSPARENT));

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

    @Override
public void onStart() {
super.onStart();
getDialog().getWindow().setLayout(LayoutParams.MATCH_PARENT, (int) getResources().getDimension(R.dimen.dialog_height));
}
}

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

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

And of course this style needs to be used when we create the dialog like the following:

    public static DialogFragment createNoTitleDlg() {
DialogFragment frag = new Some_Dialog_Frag();
frag.setStyle(DialogFragment.STYLE_NO_TITLE, R.style.Dialog_NoTitle);
return frag;
}
    <!-- A blank view to force the layout to be full-width -->
<View
android:layout_width="wrap_content"
android:layout_height="1dp"
android:layout_gravity="fill_horizontal" />

在我的对话框布局的顶部完成了这个技巧。

在 DialogFragment 的 onCreateView 方法中使用它

    Display display = getActivity().getWindowManager().getDefaultDisplay();
int width = display.getWidth();
int px = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, **220**, getResources().getDisplayMetrics());
getDialog().getWindow().setLayout(width,px);

220 是对话框片段高度,可以随意改变

This is worked for me

创建自定义样式:

   <style name="DialogStyle" parent="Base.Theme.AppCompat.Dialog">
<item name="android:windowMinWidthMajor">97%</item>
<item name="android:windowMinWidthMinor">97%</item>
</style>

You can also try use the right parent to match your other dialogs. for example parent="ThemeOverlay.AppCompat.Dialog" and so on.

在对话框中使用此样式

public class MessageDialog extends DialogFragment {


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


// your code
}

用户 AlertDialog.Builder 在您的 DialogFragment 中。像这样在 onCreateDialog方法中添加它。在 onCreateView中什么也不做。

public Dialog onCreateDialog(Bundle savedInstanceState)
{


AlertDialog.Builder builder = new AlertDialog.Builder(getContext());
View view = LayoutInflater.from(getContext()).inflate(R.layout.gf_confirm_order_timeout_dialog, null);
final Bundle args = getArguments();
String message = args.getString(GfConstant.EXTRA_DATA);
TextView txtMessage = (TextView) view.findViewById(R.id.txt_message);
txtMessage.setText(message);


view.findViewById(R.id.btn_confirm).setOnClickListener(new View.OnClickListener()
{
@Override
public void onClick(View v)
{
if (mListener != null)
{
mListener.onDialogConfirmOK();
}
}
});
builder.setView(view);
Dialog dialog = builder.create();
dialog.setCanceledOnTouchOutside(false);
dialog.getWindow().requestFeature(Window.FEATURE_NO_TITLE);
return dialog;
}

对我来说,当我使用 RelativeLayout 替换 onCreateView 中膨胀的布局的 LinearLayout 父元素时,它就起作用了。不需要其他代码更改。

public class FullWidthDialogFragment extends AppCompatDialogFragment {
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setStyle(DialogFragment.STYLE_NORMAL, R.style.Theme_AppCompat_Light_Dialog_Alert);
}
}

如果您想要更多的灵活性,可以扩展 AppCompat _ Dialog _ Alert 和自定义属性

在 style.xml 文件中创建一个自定义样式

<style name="CustomDialog" parent="@android:style/Theme.Holo.Light" >
<item name="android:windowBackground">@null</item>
<item name="android:windowIsFloating">true</item>
</style>

然后在 DialogFragment 的 createDialog 方法中,通过代码创建对话框对象

 dialog = new Dialog(getActivity(), R.style.CustomDialog);

这对我很有用,希望对你也有帮助

在布局根目录中,将 android: minWidth 设置为一个非常大的值 例如:

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


...


</LinearLayout>

我想澄清这一点。这两种方式是正确的,但使用不同的对话框片段

使用 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);
}

在其他解决方案的基础上,我创建了自己的解决方案。

<style name="AppTheme.Dialog.Custom" parent="Theme.AppCompat.Light.Dialog.Alert">
<item name="android:windowNoTitle">true</item>
<item name="android:windowMinWidthMajor">100%</item>
<item name="android:windowMinWidthMinor">100%</item>
</style>
abstract class BaseDialogFragment : DialogFragment() {


override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setStyle(DialogFragment.STYLE_NO_TITLE, R.style.AppTheme_Dialog_Custom)
}
}

这就是我解决问题的方法,试试这个。

在您的对话框片段的 onActivityCreated 中,根据您的需要添加此代码..。

 @Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
myview=inflater.inflate(R.layout.fragment_insurance_detail, container, false);
intitviews();
return myview;
}
@Override
public void onActivityCreated(Bundle arg0) {
super.onActivityCreated(arg0);
getDialog().getWindow().getAttributes().windowAnimations = R.style.DialogAnimation;
getDialog().getWindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
getDialog().getWindow().setLayout(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);
getDialog().getWindow().setGravity(Gravity.CENTER);
}

这对我来说再合适不过了。

android:minWidth="300dp"

通过这个你可以给对话框片段赋予宽度。

我尝试了上面列出的多个答案; 它们对我不起作用。 这就是我问题的解决方案:

In DialogFragment(), add the codes below:

override fun onResume() {
super.onResume()
if (showsDialog) {
val width = ViewGroup.LayoutParams.MATCH_PARENT
val height = ViewGroup.LayoutParams.WRAP_CONTENT
dialog?.window?.apply {
setBackgroundDrawable(ColorDrawable(Color.WHITE))
attributes.gravity = Gravity.BOTTOM
setLayout(width, height)
}
}
}

选项1. 在活动中的 oncreate 中添加以下代码

 getDialog().getWindow()
.setLayout(WindowManager.LayoutParams.MATCH_PARENT, WindowManager.LayoutParams.MATCH_PARENT);

或者可以为“对话框”创建自定义样式

<style name="CustomDialog" parent="AppTheme" >
<item name="android:windowNoTitle">true</item>
<item name="android:windowFullscreen">true</item>
<item name="android:windowIsFloating">true</item>
<item name="android:windowCloseOnTouchOutside">true</item>
</style>
then use that style in dialog fragment
@Override public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setStyle(DialogFragment.STYLE_NORMAL, R.style.CustomDialog);
}


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


SampleDialogFragment sampleDialogFragment = new SampleDialogFragment();
SampleDialogFragment.show(getActivity().getSupportFragmentManager(), "sometag");

OR you try the following code in style will help you

<item name="android:windowBackground">@null</item>

Solution 2: dialog.window.setLayout

class TestDialog : DialogFragment() {


override fun onStart() {
super.onStart()


dialog?.window?.setLayout(LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.MATCH_PARENT)
}


}

如果使用 ConstraintLayout作为根布局,不需要任何额外的代码,那么它就是全宽的。

<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">


</androidx.constraintlayout.widget.ConstraintLayout>

一个更清晰、更灵活的方法是设置屏幕宽度的一个百分比。可以做同样的高度,很容易改变。

override fun onResume() {
super.onResume()
dialog?.window?.let { window ->
val params: ViewGroup.LayoutParams = window.attributes
params.width = context?.getScreenSize(false)?.x?.times(0.9)?.toInt()
?: ViewGroup.LayoutParams.MATCH_PARENT
params.height = ViewGroup.LayoutParams.WRAP_CONTENT
window.attributes = params as WindowManager.LayoutParams
}
}

I end up with a decent solution for this issue.

基于@- answer。

首先,你需要在 AppTheme 为主主题的地方创建 Theme 叠加,这样它就会像下面这样在你的主主题中应用相同的属性:

  <style name="AppTheme.DialogOverlay" parent="ThemeOverlay.AppCompat.Dialog.Alert">
<item name="android:windowNoTitle">true</item>
<item name="android:windowBackground">@color/transparent</item>
<item name="android:windowMinWidthMajor">50%</item>
<item name="android:windowMinWidthMinor">90%</item>
</style>

然后在 DialogFragment类中重写 OnCreate

  override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setStyle(STYLE_NORMAL, R.style.AppTheme_DialogOverlay)
}