我有一个针对 API 25 的Xamarin.Android项目,并且 API 19 作为最低SDK,在触摸按钮时的其中一项活动{{ 3}}出现:
如您所见,我定义了一个带圆角的自定义drawable,并在DatePickerDialog中使用它。 问题是,在Android 4.4.4设备(API 19)上运行我的应用程序时,我无法摆脱具有阴影边框的默认背景。
在Android N设备(API 25)上,一切似乎都正常,这是一个截图:
我想知道如何删除Android 4.4.4设备中的默认背景,是否有任何有用的xml样式属性?或者也许是程序化的解决方案?我找不到任何讨论这个问题的资源。
DatePickerFragment
实现:public class DatePickerFragment : Android.Support.V4.App.DialogFragment,
Android.App.DatePickerDialog.IOnDateSetListener
{
public static readonly string TAG = "X:" + typeof(DatePickerFragment).Name.ToUpper();
Action<DateTime> _dateSelectedHandler = delegate { };
public static DatePickerFragment NewInstance(Action<DateTime> onDateSelected)
{
DatePickerFragment frag = new DatePickerFragment();
frag._dateSelectedHandler = onDateSelected;
return frag;
}
public override Dialog OnCreateDialog(Bundle savedInstanceState)
{
DateTime currently = DateTime.Now;
DatePickerDialog dialog = new DatePickerDialog(Activity,
Resource.Style.MyDialogTheme,
this,
currently.Year,
currently.Month,
currently.Day);
dialog.SetTitle("");
return dialog;
}
public void OnDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth)
{
DateTime selectedDate = new DateTime(year, monthOfYear + 1, dayOfMonth);
_dateSelectedHandler(selectedDate);
}
}
<style name="MyDialogTheme" parent="Theme.AppCompat.Light.Dialog">
<item name="android:windowFrame">@null</item>
<item name="android:windowIsFloating">true</item>
<item name="android:windowContentOverlay">@null</item>
<item name="android:windowBackground">@color/transparent</item>
<item name="android:windowFrame">@color/transparent</item>
<item name="android:colorBackgroundCacheHint">@null</item>
<item name="android:background">@drawable/dialog_background</item>
<item name="android:datePickerStyle">@style/MyDatePicker</item>
<item name="android:backgroundDimEnabled">true</item>
</style>
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android" >
<stroke android:width="3dp"
android:color="@color/white" />
<corners android:radius="10dp" />
<solid android:color="@color/white" />
</shape>
<style name="MyDatePicker" parent="android:Widget.Material.DatePicker">
<item name="android:datePickerMode">spinner</item>
</style>
答案 0 :(得分:1)
问题是,在Android 4.4.4设备(API 19)上运行我的应用程序时,我无法摆脱具有阴影边框的默认背景。
在Android N设备(API 25)上,一切似乎都正常。
似乎在您的values\styles.xml
文件中,素材设计支持库中的Theme.AppCompat.Light.Dialog
主题与DatePickerDialog
无法正常工作。
您的MyDialogTheme
父主题为Theme.AppCompat.Light.Dialog
,
也许这个主题不适用于所有Android版本,它适用于Lollipop
及更高版本,但不适用于KitKat
。
要使它适用于这两个版本,您可以这样做:
为values-v21
创建一个不同的文件夹,将MyDialogTheme
样式复制到values-v21\styles.xml
文件,然后它将在Android API 21 +上正常运行。
在values\styles.xml
文件中,定义对话框的正确父级,以确保其在Android API 19上正常运行。如果将MyDialogTheme
样式复制到values-v21\styles.xml
文件,删除MyDialogTheme
中的values\styles.xml
样式,影响Android {@ {{}}的Android API 19,也许这就是您想要实现的效果。
答案 1 :(得分:0)
我能够通过实现自定义对话框解决此问题。
通过对Dialog
类进行子类化,我们可以创建自定义对话框来加载任意axml
布局文件。
这要求您创建axml
布局并定义一个类,这显然更有效。
这是我创建的日期选择器对话框类:
public class CustomDatePickerDialog : Dialog
{
private AltRegisterFormActivity _owner;
public CustomDatePickerDialog(Context context, int styleId, DateTime birthDate) : base(context, styleId)
{
_owner = context as AltRegisterFormActivity;
SetTitle("");
SetContentView(Resource.Layout.DatePickerDialog);
FindViewById<DatePicker>(Resource.Id.DialogDatePicker).MaxDate = _getTimeStamp(DateTime.UtcNow.Year - 3);
FindViewById<DatePicker>(Resource.Id.DialogDatePicker).MinDate = _getTimeStamp(1920);
FindViewById<DatePicker>(Resource.Id.DialogDatePicker).DateTime = birthDate;
FindViewById<Button>(Resource.Id.DialogOkButton).Click += (_, __) =>
{
_owner.UISyncContext.Send((state) =>
{
_owner.SetDate(FindViewById<DatePicker>(Resource.Id.DialogDatePicker).DateTime);
Hide();
}, null);
};
FindViewById<Button>(Resource.Id.DialogCancelButton).Click += (_, __) =>
{
_owner.UISyncContext.Send((state) =>
{
Hide();
}, null);
};
}
private long _getTimeStamp(int year)
{
return Convert.ToInt64(new DateTime(year, 1, 1).Subtract(new DateTime(1970, 1, 1)).TotalMilliseconds);
}
}
CustomDatePickerDialog
的构造函数采用styleId
参数,允许传递所需的样式ID。
这是Resource.Layout.DatePickerDialog
布局文件:
<?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="wrap_content"
android:padding="@dimen/date_picker_dialog_padding">
<DatePicker
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/DialogDatePicker"
android:datePickerMode="spinner"
android:calendarViewShown="false" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:padding="0dp">
<View
android:layout_width="1dp"
android:layout_height="0dp"
android:layout_weight="1" />
<Button
android:text="CANCEL"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/DialogCancelButton"
android:background="@null"
android:fontFamily="sans-serif-regular"
android:textSize="13dp"
android:textStyle="bold" />
<Button
android:text="OK"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/DialogOkButton"
android:background="@null"
android:fontFamily="sans-serif-regular"
android:textSize="13dp"
android:textStyle="bold" />
</LinearLayout>
</LinearLayout>
以前的自定义对话框具有几乎相同的外观,无论它是显示在Kitkat还是Lollipop +设备中。