Android 获得自定义对话框的全宽度

在我的应用程序中,我创建的自定义对话框没有完整的高度,我不能改变和自定义它。例如,看到这个屏幕截图:

enter image description here 我的代码:

final Dialog contacts_dialog = new Dialog(ActivityGroup.this, R.style.theme_sms_receive_dialog);
contacts_dialog.setContentView(R.layout.dialog_schedule_date_time);
contacts_dialog.setCancelable(true);
contacts_dialog.setCanceledOnTouchOutside(true);
contacts_dialog.show();

布局:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/layoutRoot"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:background="@null"
android:orientation="vertical" >


<LinearLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:background="@drawable/shape_header_dialog_background"
android:orientation="horizontal"
android:padding="4dp" >


<TextView
android:id="@+id/TextView21"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout_marginRight="5dp"
android:layout_weight="2"
android:gravity="center_vertical|right"
android:text="@string/choose_schedule_time_date"
android:textColor="#ffffff"
android:textSize="14sp"
android:textStyle="bold" />


<ImageView
android:id="@+id/ImageView03"
android:layout_width="50dp"
android:layout_height="50dp"
android:layout_marginTop="0dp"
android:background="@drawable/icon_scudule_time" />
</LinearLayout>


</LinearLayout>

风格:

<style name="theme_sms_receive_dialog" parent="android:style/Theme.Dialog">
<item name="android:windowNoTitle">true</item>
<item name="android:background">@android:color/transparent</item>
<item name="android:windowBackground">@android:color/transparent</item>
<item name="numberPickerStyle">@style/NPWidget.Holo.Light.NumberPicker</item>
</style>
119236 次浏览

Two ways this can be done, first one in style.xml and second in code:

  1. Add as below in style.xml, alter the value(currently 90%) to meet your needs.
<style name="Theme_Dialog" parent="android:Theme.Holo.Dialog">
<item name="android:windowMinWidthMajor">90%</item>
<item name="android:windowMinWidthMinor">90%</item>
</style>
  1. Add setlayout to match_parent
 final Dialog contacts_dialog = new Dialog(ActivityGroup.this,
R.style.theme_sms_receive_dialog);
contacts_dialog.setContentView(R.layout.dialog_schedule_date_time);
getWindow().setLayout(ViewGroup.LayoutParams.MATCH_PARENT,ViewGroup.LayoutParams.MATCH_PARENT);


contacts_dialog.setCancelable(true);
contacts_dialog.setCanceledOnTouchOutside(true);
contacts_dialog.show();

For full width dialog you can create custom style for dialog. Code is given below for full width dialog:

<style name="Custom_Dialog" parent="ThemeOverlay.AppCompat.Light" >
<item name="windowMinWidthMajor">100%</item>
<item name="windowMinWidthMinor">65%</item>
</style>

To assign this style to the dialog's constructor, add this to onCreate() method right after setContentView():

getWindow()
.setLayout(
ViewGroup.LayoutParams.FILL_PARENT,
ViewGroup.LayoutParams.WRAP_CONTENT
);

You need to get the current Window and set it's LayoutParams like so:

Dialog d=new Dialog(mContext);
.........
.........
myDialog.show();
Window window = myDialog.getWindow();
window.setLayout(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT);

Alternative(if above solution does't works)

In case above code not works well you can use a workaround

styles.xml

<style name="mydialog"></style>

Java

Dialog d=new Dialog(mContext,R.style.mydialog);
.........
.........
myDialog.show();
Window window = myDialog.getWindow();
window.setLayout(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT);

In my case width of custom dialog shrinks in size(width) as the content inside dialog becomes smaller in width even though the the width property was set

android:layout_width="match_parent"

I just fixed that width to screen size and now its working according to my requirement

android:layout_width="320dp"
@Override public void onStart() {
super.onStart();
Dialog dialog = getDialog();
if (dialog != null) {
dialog.getWindow()
.setLayout((int) (getScreenWidth(getActivity()) * .9), (int)(getScreenHeight(getActivity()) * .6) );
}
}


public static int getScreenWidth(Activity activity) {
Point size = new Point();
activity.getWindowManager().getDefaultDisplay().getSize(size);
return size.x;
}


public static int getScreenHeight(Activity activity) {
Point size = new Point();
activity.getWindowManager().getDefaultDisplay().getSize(size);
return size.y;
}

example of 90% width and 60% height

In case anyone is wondering how to do it for a dialog shown using DialogFragment, you can override onCreateDialog to return a Dialog with custom style that has windowMinWidthMajor and minor set to 90%

@NonNull
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
return new Dialog(getActivity(), R.style.WideDialog);
}

Style:

<style name="WideDialog" parent="Base.Theme.AppCompat.Dialog">
<item name="android:windowMinWidthMajor">90%</item>
<item name="android:windowMinWidthMinor">90%</item>
</style>
MyDialogFragment myDialogFragment =
new MyDialogFragment(activity,arraylist.get(position).getImage());
myDialogFragment.show();


Window window = myDialogFragment.getWindow();
window.setLayout(WindowManager.LayoutParams.MATCH_PARENT, WindowManager.LayoutParams.MATCH_PARENT);

Add code when you want to open dialog

       final Dialog mBottomSheetDialog = new Dialog(getActivity(), R.style.MaterialDialogSheet);


mBottomSheetDialog.setContentView(R.layout.dialog_mainscreen_filter); // your custom view.
mBottomSheetDialog.setCancelable(true);
mBottomSheetDialog.getWindow().setLayout(LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT);
mBottomSheetDialog.getWindow().setGravity(Gravity.BOTTOM);
mBottomSheetDialog.show();




ImageView img_cross = mBottomSheetDialog.findViewById(R.id.img_cross);
final ImageView img_new = mBottomSheetDialog.findViewById(R.id.img_new);
final ImageView img_Used = mBottomSheetDialog.findViewById(R.id.img_Used);




img_cross.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
mBottomSheetDialog.dismiss();
}
});




img_new.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
img_new.setImageResource(R.drawable.checkbox_tick);
img_Used.setImageResource(R.drawable.checkbox_tick_gray);
}
});
img_Used.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
img_Used.setImageResource(R.drawable.checkbox_tick);
img_new.setImageResource(R.drawable.checkbox_tick_gray);
}
});

dialog's xml

<?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:orientation="vertical"
>




<android.support.v7.widget.CardView 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="wrap_content"
app:cardBackgroundColor="@color/colorWhite"
app:cardCornerRadius="5dp"
app:cardElevation="@dimen/margin_10">


<LinearLayout xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:padding="@dimen/margin_10">


<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">


<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerVertical="true"
android:text="@string/filter"
android:textStyle="bold"
android:textColor="@color/colorGreen"
android:textSize="@dimen/font_large" />


<ImageView
android:id="@+id/img_cross"
android:layout_width="25dp"
android:layout_height="25dp"
android:layout_alignParentRight="true"
android:layout_centerVertical="true"
android:src="@drawable/cross" />
</RelativeLayout>


<View
android:layout_width="match_parent"
android:layout_height="1dp"
android:layout_marginTop="@dimen/margin_20"
android:background="@color/colorfaintGreen" />


<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/margin_20"
android:gravity="center_vertical"
android:orientation="horizontal">


<ImageView
android:id="@+id/img_new"
android:layout_width="25dp"
android:layout_height="25dp"
android:src="@drawable/checkbox_tick" />


<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="@dimen/margin_10"
android:text="@string/New"
android:textColor="@color/colorText"
android:textSize="@dimen/fontsize_normal"
android:textStyle="bold" />


<ImageView
android:id="@+id/img_Used"
android:layout_width="25dp"
android:layout_height="25dp"
android:layout_marginLeft="@dimen/margin_30"
android:src="@drawable/checkbox_tick_gray" />


<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="@dimen/margin_10"
android:text="@string/Used"
android:textColor="@color/colorText"
android:textSize="@dimen/fontsize_normal"
android:textStyle="bold" />


</LinearLayout>


<View
android:layout_width="match_parent"
android:layout_height="1dp"
android:layout_marginTop="@dimen/margin_20"
android:background="@color/colorfaintGreen" />


<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/margin_20"
android:orientation="horizontal">


<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_weight="1"
android:gravity="center"
android:orientation="vertical">


<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="00"
android:textColor="@color/colorTextGray"
android:textSize="@dimen/fontsize_medium"
android:textStyle="bold" />


<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="|"
android:textColor="@color/colorTextGray"
android:textSize="@dimen/fontsize_normal"
android:textStyle="bold" />
</LinearLayout>


<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_weight="1"
android:gravity="center"
android:orientation="vertical">


<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="50"
android:textColor="@color/colorTextGray"
android:textSize="@dimen/fontsize_medium"
android:textStyle="bold" />


<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="|"
android:textColor="@color/colorTextGray"
android:textSize="@dimen/fontsize_normal"
android:textStyle="bold" />
</LinearLayout>


<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_weight="1"
android:gravity="center"
android:orientation="vertical">


<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="100"
android:textColor="@color/colorTextGray"
android:textSize="@dimen/fontsize_medium"
android:textStyle="bold" />


<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="|"
android:textColor="@color/colorTextGray"
android:textSize="@dimen/fontsize_normal"
android:textStyle="bold" />
</LinearLayout>


<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_weight="1"
android:gravity="center"
android:orientation="vertical">


<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="200"
android:textColor="@color/colorTextGray"
android:textSize="@dimen/fontsize_medium"
android:textStyle="bold" />


<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="|"
android:textColor="@color/colorTextGray"
android:textSize="@dimen/fontsize_normal"
android:textStyle="bold" />
</LinearLayout>


<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_weight="1"
android:gravity="center"
android:orientation="vertical">


<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="200+"
android:textColor="@color/colorTextGray"
android:textSize="@dimen/fontsize_medium"
android:textStyle="bold" />


<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="|"
android:textColor="@color/colorTextGray"
android:textSize="@dimen/fontsize_normal"
android:textStyle="bold" />
</LinearLayout>




</LinearLayout>


<RelativeLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content">


<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerVertical="true"
android:layout_marginLeft="22dp"
android:layout_marginTop="@dimen/margin_20"
android:src="@drawable/filled_green" />


<SeekBar
android:id="@+id/seekbar"
style="@style/SeekBarWithoutSteps"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginLeft="22dp"
android:layout_marginRight="22dp"
android:layout_marginTop="@dimen/margin_10"
android:max="4"
android:maxHeight="@dimen/margin_5"
android:minHeight="@dimen/margin_5"
android:paddingLeft="@dimen/margin_10"
android:paddingRight="@dimen/margin_10"
android:progressBackgroundTint="@color/colorGray"
android:progressTint="@color/colorGreen"
android:theme="@style/Widget.AppCompat.SeekBar.Discrete"
android:thumb="@drawable/filled_green"
android:thumbOffset="15dp" />




</RelativeLayout>


<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:text="@string/search_near_me_in_km"
android:textColor="@color/colorTextGray"
android:textSize="@dimen/fontsize_normal"
android:textStyle="bold" />




<Button
android:id="@+id/btn_register"
android:layout_width="match_parent"
android:layout_height="@dimen/btn_height"
android:layout_marginBottom="@dimen/margin_10"
android:layout_marginTop="@dimen/margin_10"
android:background="@drawable/btn_bg_green_rounded"
android:text="@string/submit"
android:textColor="@color/colorWhite"
android:textSize="@dimen/fontsize_medium" />


</LinearLayout>




</android.support.v7.widget.CardView>
</LinearLayout>

Style.xml ------------------------------------------

     <style name="MaterialDialogSheet" parent="@android:style/Theme.Dialog">
<item name="android:windowIsTranslucent">true</item>
<item name="android:windowBackground">@android:color/white</item>
<item name="android:windowContentOverlay">@null</item>
<item name="android:windowNoTitle">true</item>
<item name="android:backgroundDimEnabled">true</item>
<item name="android:windowIsFloating">false</item>
<item name="android:windowAnimationStyle">@style/MaterialDialogSheetAnimation</item>
</style>




<style name="MaterialDialogSheetAnimation">
<item name="android:windowEnterAnimation">@anim/popup_show</item>
<item name="android:windowExitAnimation">@anim/popup_hide</item>
</style>

Add Animations in res folder: anim/popup_show.xml

      <?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<translate
android:duration="300"
android:fromYDelta="100%p"
android:interpolator="@android:anim/accelerate_decelerate_interpolator"
android:toYDelta="0" />
</set>

anim/popup_hide.xml

        <?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<translate
android:duration="300"
android:fromYDelta="0"
android:interpolator="@android:anim/accelerate_decelerate_interpolator"
android:toYDelta="100%p" />
</set>

You don't need to add any style for that just try below one

  Dialog dialog = new Dialog(context);
dialog.setContentView(R.layout.your_layout_here);
dialog.getWindow().setLayout(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);
dialog.show();

Note: using empty style is memory time consuming inside the processor. Instead directly use dailog.getWindow().setLayout(width,height).

Use Relative Layout instead of Linear layout to get full width of Custom Dialog.

Dialog dialog = new Dialog(BASE_CONTEXT, R.style.Theme_Dialog);
dialog.getWindow().requestFeature(Window.FEATURE_NO_TITLE);
dialog.setContentView(R.layout.your_layout);
dialog.getWindow().setLayout(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);

This can be considered as a simple hack to set your layout width for example 1000dp and height wrap content like :

<LinearLayout
android:layout_width="1000dp"
android:gravity="center"
android:padding="10dp"
android:background="@color/colorAccent"
android:orientation="vertical"
android:layout_height="wrap_content">

Instead of using custom dialog , use activity class for this. In manifest file specify the style attribute as below

android:theme="@style/AppThemeDialog"

And add AppThemeDialog in style as below

<style name="AppThemeDialog" parent="Theme.AppCompat">

<item name="colorBackgroundFloating">#ff424242</item> <item name="listPreferredItemPaddingLeft">0dp</item> <item name="android:windowIsFloating">true</item> <item name="listPreferredItemPaddingRight">0dp</item> </style>

Using com.google.android.material.dialog.MaterialAlertDialogBuilder makes everything fun. Here my code

MaterialAlertDialogBuilder(requireContext()).apply {
setView(layoutInflater.inflate(R.layout.filter_view, null))
show()
}

And Result

enter image description here

You can programatically set a dialog width and height.

dialog = new Dialog(this);
dialog.setContentView(R.layout.dialog_create_subcategory);
dialog.getWindow().setLayout(width, height);

Just try to wrap your dialog layout in a RelativeLayout

For me I have tried this way and it worked for me.

 @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
binding = DialogPromotionsBinding.inflate(getLayoutInflater());
    

// Sizing the Dialog
Rect displayRectangle = new Rect();
getWindow().getDecorView().getWindowVisibleDisplayFrame(displayRectangle);
binding.getRoot().setMinWidth((int) (displayRectangle.width() * 0.9f)); // width
binding.getRoot().setMinHeight((int) (displayRectangle.height() * 0.9f)); // Height
    

   

setContentView(binding.getRoot());

The nice thing about it is that you can retrieve the percentage from the res files instead of hardcoding them, and set different values based on the device size.

For kotlin users

    val layoutParams = dialog.window!!.attributes
layoutParams.width = WindowManager.LayoutParams.MATCH_PARENT
dialog.window!!.attributes = layoutParams

Or

    val width = resources.displayMetrics.widthPixels
val height = dialog.window!!.attributes.height
dailog.window!!.setLayout(width, height)