Android自定义对话框,无论指定的宽度都保持不变
Posted
技术标签:
【中文标题】Android自定义对话框,无论指定的宽度都保持不变【英文标题】:Android Custom Dialog, no matter the width specified it stays the same 【发布时间】:2021-06-22 01:09:51 【问题描述】:我有一个自定义对话框,我会对其进行充气和使用。现在我想要圆角,这被证明是相当困难的。并且似乎其中一个黑客做到了,所以无论宽度是 WrapContent、10dp、20dp、200dp 还是 300dp,我的对话框都不会改变大小。它在布局编辑器中发生了变化,但当我实际启动应用程序时它保持不变。
编辑器
应用内
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_
android:layout_
android:background="@drawable/dialog_background"
android:gravity="center"
android:orientation="vertical"
android:padding="10dp">
<TextView
android:layout_
android:layout_
android:layout_marginBottom="15dp"
android:text="Do you want to reset progress?"
android:textColor="@color/black"
android:textSize="18sp" />
<LinearLayout
android:layout_
android:layout_
android:gravity="center"
android:orientation="horizontal">
<androidx.appcompat.widget.AppCompatButton
android:id="@+id/cancel_button"
style="@style/basicButton"
android:layout_
android:layout_
android:layout_marginEnd="10dp"
android:backgroundTint="@color/delete_red"
android:padding="10dp"
android:text="Cancel"
android:textColor="@color/white"
android:textSize="20sp" />
<androidx.appcompat.widget.AppCompatButton
android:id="@+id/confirm_button"
style="@style/basicButton"
android:layout_
android:layout_
android:padding="10dp"
android:text="Yes"
android:textSize="20sp" />
<nearLayout>
</LinearLayout>nearLayout>
</LinearLayout>
这就是我构建它的地方(注意 cmets 中的链接,我认为这是导致问题的原因,设置窗口的背景)。
val builder = AlertDialog.Builder(requireContext())
val dialogBinding = ResetProgressDialogBinding.inflate(layoutInflater)
builder.setView(dialogBinding.root)
val dialog = builder.create()
dialog.window?.setBackgroundDrawable(ColorDrawable(Color.TRANSPARENT)); // https://***.com/questions/28937106/how-to-make-custom-dialog-with-rounded-corners-in-android
dialogBinding.root.clipToOutline = true // https://issuetracker.google.com/issues/37036728
还有我的形状
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<solid
android:color="@color/white"/>
<corners
android:radius="10dp" />
<padding
android:left="0dp"
android:top="0dp"
android:right="0dp"
android:bottom="0dp" />
</shape>
【问题讨论】:
【参考方案1】:我正在使用 PopupHelper 类,您可以使用此代码:
public class PopUpHelper
static Dialog dialog;
public static void showDialog(Activity activity, PINConfirmButtonClickListener action)
if (dialog != null && dialog.isShowing())
boolean isShowing = dialog.isShowing();
return;
dialog = new Dialog(activity, R.style.MyAlertDialogStyle);
dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
dialog.setContentView(R.layout.(your_dialog_layout);
dialog.setCanceledOnTouchOutside(true);
dialog.setCancelable(true);
dialog.show();
dialog.findViewById(R.id.cancel_button).setOnClickListener(new View.OnClickListener()
@Override
public void onClick(View view)
action.onPositiveClicked()
"YOUR_ACTION_HERE"
);
dialog.findViewById(R.id.cancel_button).setOnClickListener(new View.OnClickListener()
@Override
public void onClick(View view)
action.onNegative()
"YOUR_ACTION_HERE"
);
dialog.findViewById(R.id.close_dialog_rl).setOnClickListener(view -> action.onCloseButtonClicked(dialog));
dialog.findViewById(R.id.resend_code_tv).setOnClickListener(view -> action.onResendCodeClicked());
public interface TwoButtonClickListener
void onPositiveClicked(Dialog dialog);
void onNegativeClicked(Dialog dialog);
MyDialogStyle: (添加到styles.xml)
<!-- Alert Dialog Style-->
<style name="MyAlertDialogStyle" parent="Theme.AppCompat.Light.Dialog.Alert">
<item name="android:windowNoTitle">true</item>
<item name="android:windowBackground">@android:color/transparent</item>
<!-- Used for the border radius -->
<item name="android:bottomLeftRadius">5dp</item>
<item name="android:bottomRightRadius">5dp</item>
<item name="android:topRightRadius">5dp</item>
<item name="android:topLeftRadius">5dp</item>
<item name="android:autofilledHighlight" tools:targetApi="o">@color/transparent</item>
</style>
并在调用 Popup 的活动中:
PopUpHelper.showDialog(this, new PopUpHelper.TwoButtonClickListener()
@Override
public void onPositiveClicked(Dialog dialog)
dialog.dismiss();
startHomeActivity();
@Override
public void onNegativeClicked(Dialog dialog)
dialog.dismiss();
);
如果背景透明不起作用将“android:background="@android:color/transparent" 设置为对话框布局
以我的布局为例,但您可以删除字体和某些字段:
<?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_
android:layout_
android:layout_gravity="center"
android:background="@android:color/transparent"
android:gravity="center"
android:orientation="vertical">
<RelativeLayout
android:layout_
android:layout_
android:gravity="center">
<RelativeLayout
android:id="@+id/relativeLayout"
android:layout_
android:layout_
android:layout_marginHorizontal="12dp">
<androidx.cardview.widget.CardView
android:id="@+id/card_view"
android:layout_
android:layout_
android:layout_marginTop="32.5dp">
<LinearLayout
android:layout_
android:layout_
android:orientation="vertical"
android:paddingHorizontal="25dp"
android:paddingVertical="20dp">
<LinearLayout
android:layout_
android:layout_
android:layout_marginTop="70dp"
android:orientation="vertical"
android:paddingTop="15dp">
<TextView
android:layout_
android:layout_
android:fontFamily="@font/bold"
android:gravity="center"
android:lineSpacingExtra="4dp"
android:text="@string/add_to_cart"
android:textColor="@color/color_secondary"
android:textSize="18sp"/>
<TextView
android:layout_
android:layout_
android:layout_marginTop="15dp"
android:fontFamily="@font/medium"
android:lineSpacingExtra="4dp"
android:gravity="center"
android:text="@string/product_added_to_cart"
android:textColor="@color/color_secondary_60"
android:textSize="14sp"/>
</LinearLayout>
<LinearLayout
android:layout_marginTop="40dp"
android:layout_
android:layout_
android:orientation="vertical">
<TextView
android:id="@+id/action_button"
android:layout_
android:layout_
android:background="@color/orange_light"
android:ellipsize="end"
android:fontFamily="@font/medium"
android:foreground="?selectableItemBackground"
android:gravity="center"
android:letterSpacing="0.05"
android:singleLine="true"
android:text="@string/add_to_cart"
android:textColor="@color/white"
android:textSize="16sp"/>
<TextView
android:layout_marginTop="10dp"
android:layout_gravity="center_horizontal"
android:id="@+id/cancel_button"
android:layout_
android:layout_
android:ellipsize="end"
android:fontFamily="@font/medium"
android:foreground="?selectableItemBackground"
android:gravity="center"
android:letterSpacing="0.05"
android:singleLine="true"
android:text="@string/cancel"
android:textColor="@color/color_secondary_60"
android:textSize="13sp"/>
</LinearLayout>
</LinearLayout>
</androidx.cardview.widget.CardView>
<RelativeLayout
android:id="@+id/close_dialog_rl"
android:layout_
android:layout_
android:layout_below="@id/card_view"
android:layout_centerHorizontal="true"
android:layout_marginTop="22dp"
android:background="@drawable/shape_circle_white">
<ImageView
android:layout_
android:layout_
android:layout_centerInParent="true"
android:src="@drawable/ic_close"
app:tint="@color/white"/>
</RelativeLayout>
</RelativeLayout>
<ImageView
android:id="@+id/confetti_v"
android:layout_
android:layout_
android:layout_alignParentTop="true"
android:layout_centerHorizontal="true"
android:background="@drawable/shape_circle_orange"
android:padding="16dp"
android:src="@drawable/ic_check_white"
app:tint="@color/white"/>
</RelativeLayout>
</LinearLayout>
【讨论】:
您也可以在您的 XML 中进行编辑吗?我的背景是完全透明的。 @Nikola-Milovic 我添加了我的布局,您可以查看。 谢谢。我得进一步检查一下,我仍然得到相同的结果,透明背景。以上是关于Android自定义对话框,无论指定的宽度都保持不变的主要内容,如果未能解决你的问题,请参考以下文章
android将activity设置成自定义的Dialog怎么调整大小
Android的HorizontalScrollView控件里面的自控件无论怎么设置,宽度都无法填满屏幕