如何摆脱Android 4.4.4中Android DatePickerDialog的默认背景?

时间:2017-08-03 22:53:09

标签: android android-layout xamarin.android

我有一个针对 API 25 的Xamarin.Android项目,并且 API 19 作为最低SDK,在触摸按钮时的其中一项活动{{ 3}}出现:

DatePickerDialog

如您所见,我定义了一个带圆角的自定义drawable,并在DatePickerDialog中使用它。 问题是,在Android 4.4.4设备(API 19)上运行我的应用程序时,我无法摆脱具有阴影边框的默认背景。

在Android N设备(API 25)上,一切似乎都正常,这是一个截图:

enter image description here

我想知道如何删除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);
    }
}

应用于DatePickerDialog

的样式
<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>

dialog_background drawable

<?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>

MyDatePicker样式定义

<style name="MyDatePicker" parent="android:Widget.Material.DatePicker">
    <item name="android:datePickerMode">spinner</item>
</style>

2 个答案:

答案 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 +设备中。