Android-如何设置对话框';外缘
我知道这个问题已经被问过好几次了,但我遇到的所有解决方案都不适合我,因此我提出了这个话题。正如标题所述-我想设置对话框的外部边距: PurchaseDetailsDialogFragmentAndroid-如何设置对话框';外缘,android,android-dialogfragment,Android,Android Dialogfragment,我知道这个问题已经被问过好几次了,但我遇到的所有解决方案都不适合我,因此我提出了这个话题。正如标题所述-我想设置对话框的外部边距: PurchaseDetailsDialogFragment public class PurchaseDetailsDialogFragment extends DialogFragment { private static final String MAX_AMOUNT = "maxAmount"; private static final S
public class PurchaseDetailsDialogFragment extends DialogFragment {
private static final String MAX_AMOUNT = "maxAmount";
private static final String UNIT_PRICE = "unitPrice";
private static final String PICKUP_TIME_FROM = "pickupTimeFrom";
private static final String PICKUP_TIME_TO = "pickupTimeTo";
public PurchaseDetailsDialogFragment() { }
public static PurchaseDetailsDialogFragment newInstance(int maxAmount, float unitPrice, String pickupTimeFrom, String pickupTimeTo) {
PurchaseDetailsDialogFragment fragment = new PurchaseDetailsDialogFragment();
Bundle args = new Bundle();
args.putInt(MAX_AMOUNT, maxAmount);
args.putFloat(UNIT_PRICE, unitPrice);
args.putString(PICKUP_TIME_FROM, pickupTimeFrom);
args.putString(PICKUP_TIME_TO, pickupTimeTo);
fragment.setArguments(args);
return fragment;
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (getArguments() != null) {
int maxAmount = getArguments().getInt(MAX_AMOUNT);
float unitPrice = getArguments().getFloat(UNIT_PRICE);
String pickupFrom = getArguments().getString(PICKUP_TIME_FROM);
String pickupTo = getArguments().getString(PICKUP_TIME_TO);
}
}
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
Context context = getContext();
FragmentPurchaseDetailsDialogBinding binding = DataBindingUtil.inflate(
LayoutInflater.from(context),
R.layout.fragment_purchase_details_dialog,
null,
false);
binding.setDataContext(new PurchaseDetailsViewModel(context));
AlertDialog dialog = new AlertDialog.Builder(getActivity(), R.style.DialogTheme)
.setView(binding.getRoot())
.create();
dialog.getWindow().setBackgroundDrawable(new ColorDrawable(android.graphics.Color.TRANSPARENT));
return dialog;
}
}
片段\u购买\u详细信息\u对话框
<layout
xmlns:android="http://schemas.android.com/apk/res/android"
android:background="@drawable/dialog">
<data>
<variable
name="dataContext"
type="com.myapp.viewModels.PurchaseDetailsViewModel" />
</data>
<RelativeLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content">
<FrameLayout
android:layout_width="wrap_content"
android:layout_height="80dp"
android:paddingTop="20dp"
android:layout_centerHorizontal="true"
android:background="@color/white">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/choose_amount"
style="@style/Widget.App.PurchaseTextViewTitle" />
</FrameLayout>
<LinearLayout
android:id="@+id/dialogCentralContent"
android:layout_width="match_parent"
android:layout_height="200dp"
android:orientation="vertical"
android:layout_marginTop="80dp"
android:background="@color/dirtyWhite">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="74" />
</LinearLayout>
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:layout_marginTop="46dp"
android:layout_centerHorizontal="true">
<Button
android:layout_width="44dp"
android:layout_height="44dp"
android:layout_marginTop="6dp"
android:background="@drawable/button_filled"
android:text="-"
style="@style/Widget.App.PurchaseIncDecButton" />
<FrameLayout
android:layout_width="60dp"
android:layout_height="60dp"
android:layout_marginLeft="8dp"
android:layout_marginRight="8dp"
android:background="@drawable/edittext_white_rounded">
<EditText
android:layout_width="30dp"
android:layout_height="match_parent"
android:layout_marginLeft="15dp"
android:gravity="center_horizontal"
android:maxLines="1"
style="@style/Widget.App.PurchaseAmountEditText" />
</FrameLayout>
<Button
android:layout_width="44dp"
android:layout_height="44dp"
android:layout_marginTop="6dp"
android:background="@drawable/button_filled"
android:text="+"
style="@style/Widget.App.PurchaseIncDecButton" />
</LinearLayout>
<Button
android:layout_width="match_parent"
android:layout_height="50dp"
android:layout_below="@+id/dialogCentralContent"
android:text="@string/buttonBuyText"
android:background="@drawable/button_submit"
style="@style/Widget.App.SubmitButton" />
</RelativeLayout>
</layout>
然后一些古怪的事情发生了。在API23上,一切看起来都很好,而在API19及以下版本(未检查19和23之间的API)上,对话框的宽度为100%,并与屏幕顶部对齐。如何使它按我所希望的方式工作?你试过这个吗
它建议您使用android.support.v7.app.AlertDialog
而不是android.app.AlertDialog
AlertDialog.Builder builder = new AlertDialog.Builder(getActivity(), R.style.DialogTheme)
.setView(binding.getRoot())
.create();
dialog.getWindow().setBackgroundDrawable(new ColorDrawable(android.graphics.Color.TRANSPARENT));
AppCompatDialog alert = builder.create();
alert.show();
因此,对于具有多个选项的对话框,请尝试AppCompactDialog
AlertDialog.Builder builder = new AlertDialog.Builder(getActivity(), R.style.DialogTheme)
.setView(binding.getRoot())
.create();
dialog.getWindow().setBackgroundDrawable(new ColorDrawable(android.graphics.Color.TRANSPARENT));
AppCompatDialog alert = builder.create();
alert.show();
我没有试过这个。让我知道这是否有效。你试过吗
它建议您使用android.support.v7.app.AlertDialog
而不是android.app.AlertDialog
AlertDialog.Builder builder = new AlertDialog.Builder(getActivity(), R.style.DialogTheme)
.setView(binding.getRoot())
.create();
dialog.getWindow().setBackgroundDrawable(new ColorDrawable(android.graphics.Color.TRANSPARENT));
AppCompatDialog alert = builder.create();
alert.show();
因此,对于具有多个选项的对话框,请尝试AppCompactDialog
AlertDialog.Builder builder = new AlertDialog.Builder(getActivity(), R.style.DialogTheme)
.setView(binding.getRoot())
.create();
dialog.getWindow().setBackgroundDrawable(new ColorDrawable(android.graphics.Color.TRANSPARENT));
AppCompatDialog alert = builder.create();
alert.show();
我没有试过这个。让我知道这是否有效。有一个非常简单的解决方案。只需将布局放在内部,例如
FrameLayout
,并在外部布局元素上设置适当的填充。那么所有API中的所有内容看起来都是一样的:
<FrameLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:paddingLeft="@dimen/defaultMargin"
android:paddingRight="@dimen/defaultMargin">
<RelativeLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content">
</RelativeLayout>
</FrameLayout>
有一个非常简单的解决方案。只需将布局放在内部,例如
FrameLayout
,并在外部布局元素上设置适当的填充。那么所有API中的所有内容看起来都是一样的:
<FrameLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:paddingLeft="@dimen/defaultMargin"
android:paddingRight="@dimen/defaultMargin">
<RelativeLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content">
</RelativeLayout>
</FrameLayout>
380dp
这将保持对话框的最小宽度为380dp,但如果设备宽度<380dp,则对话框将占用整个可用空间
如果您使用宽度较小的设备进行测试(如果设备具有较低的api,则很可能如此,例如Galaxy Nexus的宽度为360dp),那么它当然会占据整个宽度
最好将minWidth指定为百分比
对于您的特定情况,要实现预定义的边距(无需以编程方式修改窗口的布局属性),我们可以将最小宽度设置为100%
<item name="android:windowMinWidthMinor">100%</item>
100%
并使用嵌入式绘图作为windowBackground,如果您使用AppCompat,这种情况已经存在
<item name="android:windowBackground">@drawable/abc_dialog_material_background</item>
@drawable/abc\u dialog\u material\u后台
abc\u对话框\u材料\u背景:
<inset xmlns:android="http://schemas.android.com/apk/res/android"
android:insetLeft="16dp"
android:insetTop="16dp"
android:insetRight="16dp"
android:insetBottom="16dp">
<shape android:shape="rectangle">
<corners android:radius="@dimen/abc_dialog_corner_radius_material" />
<solid android:color="@android:color/white" />
</shape>
</inset>
380dp
这将保持对话框的最小宽度为380dp,但如果设备宽度<380dp,则对话框将占用整个可用空间
如果您使用宽度较小的设备进行测试(如果设备具有较低的api,则很可能如此,例如Galaxy Nexus的宽度为360dp),那么它当然会占据整个宽度
最好将minWidth指定为百分比
对于您的特定情况,要实现预定义的边距(无需以编程方式修改窗口的布局属性),我们可以将最小宽度设置为100%
<item name="android:windowMinWidthMinor">100%</item>
100%
并使用嵌入式绘图作为windowBackground,如果您使用AppCompat,这种情况已经存在
<item name="android:windowBackground">@drawable/abc_dialog_material_background</item>
@drawable/abc\u dialog\u material\u后台
abc\u对话框\u材料\u背景:
<inset xmlns:android="http://schemas.android.com/apk/res/android"
android:insetLeft="16dp"
android:insetTop="16dp"
android:insetRight="16dp"
android:insetBottom="16dp">
<shape android:shape="rectangle">
<corners android:radius="@dimen/abc_dialog_corner_radius_material" />
<solid android:color="@android:color/white" />
</shape>
</inset>
您可以尝试为低于19的api级别创建一个资源文件,以更改对话框的宽度。我意识到这一点,但也许有一些通用的解决方案可以在任何地方使用?还有-为什么它在API19上的行为类似?我不是100%确定,但我相信材质设计是在api级别21上添加的,因此它可能无法将Theme.material.Dialog.Alert定位为父级并使用通用的东西?或者什么都没有我刚才检查过了,你是对的。但是,我仍然不知道在所有api版本中使用哪个主题使对话框看起来相同-我的意思是api<21。您可以尝试为低于19的api级别创建一个资源文件来更改对话框的宽度,我知道,但是可能有一些通用的解决方案可以在任何地方都适用?还有-为什么它在API19上的行为类似?我不是100%确定,但我相信材质设计是在api级别21上添加的,因此它可能无法将Theme.material.Dialog.Alert定位为父级并使用通用的东西?或者什么都没有我刚才检查过了,你是对的。然而,我仍然不知道该使用哪个主题来让对话框在所有api版本中看起来都一样——我的意思是api<21。是的,我试过了。我没有在我的代码中发布导入,但我已经在使用android.support.v7.app.AlertDialog
。是的,我试过了。我没有在我的代码中发布导入,但我已经在使用android.support.v7.app.AlertDialog
。