2017-06-06 55 views
1

我设置在我的风格datePickerMode文件到spinner这样的:三星Galaxy S7边缘忽略datePickerMode

<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上正常工作。
任何想法?

回答

1

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

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

这是gist of this solution


有点奇怪,但那些bug报告中的修复似乎是针对时间选择器,虽然报告是针对日期选择器的。我挖了一下,发现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()); 
     } 

+0

谢谢,这个作品很棒! – Altoyyr

-1

你可以试试这个。

datePicker.setCalendarViewShown(false);

+1

此方法已与评论'不支持Material风格{@code日历}模式' – Altoyyr

-1

你应该尽量提高 targetSdkVersion到24,因为在Android 7.0

+1

为什么?他想支持旧版本......任何其他随机想法? – Selvin