この種のバグは黒魔術のようなものです:
https://github.com/SimonVT/android-timepickerを移植してHoloスタイルを完成させようとしています(デフォルトではICSタイムピッカーウィジェットのみがあり、ダイアログはHoneycombより前のままです)。
Timepickerの特別な属性を使用してTheme.Sherlockを拡張し、それをアプリケーション全体に適用しました。ダイアログはデフォルト(上記)と同じように見えます。その後、プロジェクトにHoloEverywhere libを追加しました...黒魔術が登場します!Timepickerウィジェットは、青い線やダイアログ内の位置の変更など、一部のビューを何らかの形で失いました。私はまだこのグリッチの理由について疑問に思っています。
注:私のプロジェクト(コード)とTimePicker libには、HoloEverywhereに関してまったく何もありません。
注:HoloEverywhereの属性と競合しているため、timepickerの一部の属性も変更しました(「...属性はすでに宣言されています」エラーのため)
コード:
public class DialogSample extends SherlockFragmentActivity implements OnTimeSetListener {
private TextView mTimeDisplay;
private int mHour;
private int mMinute;
static final int TIME_DIALOG_ID = 0;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_dialog);
final Calendar c = Calendar.getInstance();
mHour = c.get(Calendar.HOUR_OF_DAY);
mMinute = c.get(Calendar.MINUTE);
mTimeDisplay = (TextView) findViewById(R.id.timeDisplay);
findViewById(R.id.btnDialog).setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
DialogFragment newFragment = new TimePickerFragment();
newFragment.show(getSupportFragmentManager(), "timePicker");
}
});
updateDisplay();
}
// updates the time we display in the TextView
private void updateDisplay() {
mTimeDisplay.setText(
new StringBuilder()
.append(pad(mHour)).append(":")
.append(pad(mMinute)));
}
private static String pad(int c) {
if (c >= 10) {
return String.valueOf(c);
} else {
return "0" + String.valueOf(c);
}
}
static public class TimePickerFragment extends SherlockDialogFragment {
@Override
public TimePickerDialog onCreateDialog(Bundle savedInstanceState) {
// Use the current date as the default date in the picker
final Calendar c = Calendar.getInstance();
int hour = c.get(Calendar.HOUR_OF_DAY);
int minute = c.get(Calendar.MINUTE);
return new TimePickerDialog(getSherlockActivity(), (DialogSample)getSherlockActivity(), hour, minute, true);
}
public TimePickerFragment() {
}
}
@Override
public void onTimeSet(TimePicker view, int hourOfDay, int minute) {
mHour = hourOfDay;
mMinute = minute;
updateDisplay();
}
}