三星Galaxy S7 Edge忽略datePickerMode

时间:2017-06-06 13:19:46

标签: android datepicker android-styles

我将样式文件中的datePickerMode设置为spinner,如下所示:

<style name="AppBaseTheme" parent="Theme.AppCompat.Light.NoActionBar">
    <item name="android:dialogTheme">@style/MyDialogTheme</item>
    <item name="android:datePickerStyle">@style/MyDatePicker</item>
</style>

<style name="ItvDialogTheme" parent="android:Theme.Material.Light.Dialog">
    <item name="android:datePickerStyle">@style/MyDatePicker</item>
</style>

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

然后创建一个DatePicker

DatePickerDialog.OnDateSetListener onDateSetListener = new DatePickerDialog.OnDateSetListener() {
    @Override
    public void onDateSet(final DatePicker view, final int year, final int monthOfYear, final int dayOfMonth) {
        //handle result
        }
    };

DatePickerDialog dialog = new DatePickerDialog(this, onDateSetListener, dob.getYear(), dob.getMonth() - 1,
            dob.getDay());

dialog.show();

这在很多设备上运行良好,包括Android 6上的三星Galaxy S7 Edge,但自从将设备更新到Android 7后,它会忽略模式spinner并显示日历。

微调器在Android 7.1.1上的One Plus 3上运行良好 有什么想法吗?

3 个答案:

答案 0 :(得分:2)

您可能遇到过这个问题(#37120178)datepicker dialog can't switch to spinner on Android 7.0 device。如果是这样,那么该页面上会记录一个解决方法。 我没有尝试过这种方法,但它可能值得一试。(请参阅下面的实施方法。)

顺便说一句,我有一台运行7.0的三星S7(不是边缘)。如果我用XML定义它,我可以得到一个DatePicker微调器,所以另一个解决方法是用XML定义DatePicker微调器并在对话框中使用它。

这是gist of this solution

奇怪,但错误报告中的那些修复似乎是时间选择器,尽管该报告是针对日期选择器的。我挖了一下,发现Use DatePicker spinners in API 24 是一个潜在的修复。 同样,我没有尝试过这个。

这种反射逻辑似乎确实有效。它显示了日历视图旁边的旋转器。如果您只想要微调器,则需要在样式中添加以下内容:

<item name="android:calendarViewShown">false</item>

(此解决方案可归功于lognatureljeffdgr8)。

以下是我的自定义DatePickerDialog与反射逻辑的对比:

public class MyReflectionDatePickerDialog extends DatePickerDialog {

    private DatePicker mDatePicker;

    @RequiresApi(api = Build.VERSION_CODES.N)
    public MyReflectionDatePickerDialog(@NonNull Context context, @Nullable OnDateSetListener listener,
                                        int year, int month, int dayOfMonth) {
        super(context, listener, year, month, dayOfMonth);
        fixSpinner(context, year, month, dayOfMonth);

    }

    // include gist here from:
    // https://gist.github.com/lognaturel/232395ee1079ff9e4b1b8e7096c3afaf
}

您将实例化此自定义视图,如下所示:

        DatePickerDialog dialog;
        if (Build.VERSION.SDK_INT == Build.VERSION_CODES.N) {
            dialog = new MyDatePickerDialog(this, onDateSetListener, dob.getYear(), 
                dob.getMonth() - 1, dob.getDay());
        } else {
            dialog = new DatePickerDialog(this, onDateSetListener, dob.getYear(), 
                dob.getMonth() - 1, dob.getDay());
        }

答案 1 :(得分:-1)

你可以试试这个。

datePicker.setCalendarViewShown(假);

答案 2 :(得分:-1)

  

你应该尝试提高   因为android 7.0

,targetSdkVersion为24