Issue 222208が、私はそれらのバグレポートで参照this workaround by Jeff Lockhartの修飾型を使用:これは何 private static final class FixedHoloDatePickerDialog extends DatePickerDialog {
private FixedHoloDatePickerDialog(Context context, OnDateSetListener callBack,
int year, int monthOfYear, int dayOfMonth) {
super(context, callBack, year, monthOfYear, dayOfMonth);
// Force spinners on Android 7.0 only (SDK 24).
// Note: I'm using a naked SDK value of 24 here, because I'm
// targeting SDK 23, and Build.VERSION_CODES.N is not available yet.
// But if you target SDK >= 24, you should have it.
if (Build.VERSION.SDK_INT == 24) {
try {
final Field field = this.findField(
DatePickerDialog.class,
DatePicker.class,
"mDatePicker"
);
final DatePicker datePicker = (DatePicker) field.get(this);
final Class<?> delegateClass = Class.forName(
"android.widget.DatePicker$DatePickerDelegate"
);
final Field delegateField = this.findField(
DatePicker.class,
delegateClass,
"mDelegate"
);
final Object delegate = delegateField.get(datePicker);
final Class<?> spinnerDelegateClass = Class.forName(
"android.widget.DatePickerSpinnerDelegate"
);
if (delegate.getClass() != spinnerDelegateClass) {
delegateField.set(datePicker, null);
datePicker.removeAllViews();
final Constructor spinnerDelegateConstructor =
spinnerDelegateClass.getDeclaredConstructor(
DatePicker.class,
Context.class,
AttributeSet.class,
int.class,
int.class
);
spinnerDelegateConstructor.setAccessible(true);
final Object spinnerDelegate = spinnerDelegateConstructor.newInstance(
datePicker,
context,
null,
android.R.attr.datePickerStyle,
0
);
delegateField.set(datePicker, spinnerDelegate);
datePicker.init(year, monthOfYear, dayOfMonth, this);
datePicker.setCalendarViewShown(false);
datePicker.setSpinnersShown(true);
}
} catch (Exception e) { /* Do nothing */ }
}
}
/**
* Find Field with expectedName in objectClass. If not found, find first occurrence of
* target fieldClass in objectClass.
*/
private Field findField(Class objectClass, Class fieldClass, String expectedName) {
try {
final Field field = objectClass.getDeclaredField(expectedName);
field.setAccessible(true);
return field;
} catch (NoSuchFieldException e) { /* Ignore */ }
// Search for it if it wasn't found under the expectedName.
for (final Field field : objectClass.getDeclaredFields()) {
if (field.getType() == fieldClass) {
field.setAccessible(true);
return field;
}
}
return null;
}
}
は次のとおりです。
- このダイアログ
- に属するプライベート
DatePicker mDatePicker
フィールドは、デリゲートはDatePickerSpinnerDelegate
のインスタンス(私たちが望むデリゲートの種類)
- すべて削除が既にないことを、このダイアログ
- チェックに属するプライベート
DatePickerDelegate mDelegate
フィールドをゲットDatePicker
からの眺め、彼らは素材のカレンダーウィジェットですので、
- は
DatePickerSpinnerDelegate
の新しいインスタンスを作成し、このダイアログ
- 再初期化の
mDatePicker
のmDelegate
フィールドに代入しますそれは、この回避策を使用するにはスピナー
を膨らませるために取得するには、カレンダーの情報といくつかのparamsでmDatePicker
をialize、私は私がこの場合はホロには、テーマを設定することができます私のContext
周りContextThemeWrapper
を作成します。
final Context themedContext = new ContextThemeWrapper(
this.getContext(),
android.R.style.Theme_Holo_Light_Dialog
);
final DatePickerDialog dialog = new FixedHoloDatePickerDialog(
themedContext,
datePickerListener,
calender.get(Calendar.YEAR),
calendar.get(Calendar.MONTH),
calendar.get(Calendar.DAY_OF_MONTH)
);
ノート:
- これは、リフレクションを使用してプライベートフィールドにアクセスします。一般的に、これは強固なアプローチではなく、あなたはそれを信じることができません。私は、1)これを1つのSDKバージョンv24に制限することで、リスクを軽減しています。 2)リフレクションコードのビット全体を
try {...} catch (Exception e) {/* NOP */}
ブロックにラッピングするので、リフレクションのいずれかが失敗した場合は何も起こらず、(悲しい壊れた)デフォルトのマテリアルフォールバックが使用されます。
- 上記のバグレポートは、この問題がAndroid 7.1(SDK 25)で修正されたと主張しています。私はこれをテストしていない。
- original workaround codeは、同様の問題が発生した
TimePickerDialog
であった。私は代わりにDatePickerDialog
と動作するように修正しました。また、ソリューションをより一般的でなくなるように簡略化しました。しかし、より完全なオリジナルバージョンを使用して、の代わりにDate
のために調整することができます。
サポートライブラリを更新しましたか? – Shuddh
@Shuddhは既に試しましたが、それでも同じです:)私は'24 .2.1 'を試しましたhttps://developer.android.com/topic/libraries/support-library/revisions.html –
私はこの問題にも取り組んでいます。誰にでも解決策がありますか? – FinalFive