web-dev-qa-db-ja.com

Android DatePicker?

基本的なDatePickerを使用しており、DatePickerDialogのYearフィールドを非表示にして、月と日のみが表示されるようにする方法を理解しようとしています。その年の基礎となるコードがまだそこにあることを気にしません。ダイアログの年フィールドを非表示にしたいだけです。あなたは次のようなことで知っています:

((View) myYear).setVisibility(View.GONE);

myYearはビューではなくintであるため、機能しないことがわかっていますが、これらの線に沿ったものです。出来ますか?

14
kirktoon1882

DatePickerを実装するために私が見つけた非常に簡単な方法は、xmlで呼び出すことです。

    <DatePicker
    Android:id="@+id/thePicker"
    Android:layout_width="wrap_content"
    Android:layout_height="wrap_content"/>

次に、Javaで必要なフィールド(この場合は年)を非表示にします。

    picker = (DatePicker) findViewById(R.id.thePicker);
    try {
        Field f[] = picker.getClass().getDeclaredFields();
        for (Field field : f) {
            if (field.getName().equals("mYearPicker")) {
                field.setAccessible(true);
                Object yearPicker = new Object();
                yearPicker = field.get(picker);
                ((View) yearPicker).setVisibility(View.GONE);
            }
        }
    } 
    catch (SecurityException e) {
        Log.d("ERROR", e.getMessage());
    } 
    catch (IllegalArgumentException e) {
        Log.d("ERROR", e.getMessage());
    } 
    catch (IllegalAccessException e) {
        Log.d("ERROR", e.getMessage());
    }
22
kirktoon1882

この解決策には本当に注意してください。反射を使用してフィールドにアクセスし、可視性を変更しています。これはAndroid 5.0では機能しません!GoogleはTimePickerとDatePickerの実装を変更し、クラスはデリゲートからのフィールドappartを公開しなくなりました。

Android 5.0+の解決策はまだわかりません。何か面白いものが見つかったら、すぐにお知らせします。

アイデアとして、Build.VERSION.SDK_INTを使用してAndroidバージョンを確認してから、反射を使用してDatePickerSpinnerDelegateにアクセスし、必要なフィールドを設定することができます。

繰り返しますが、Googleはこれを何度も自由に変更できるため、これは理想的なソリューションではありません...

8
rontho

日付ピッカーの年フィールドを無効にする簡単な方法

DatePicker dp = findDatePicker((ViewGroup) dialog.getWindow().getDecorView());

if(dp != null) 
{
    ((ViewGroup) ((ViewGroup) dp.getChildAt(0)).getChildAt(0)).getChildAt(2).setEnabled(false);
    ((ViewGroup) ((ViewGroup) dp.getChildAt(0)).getChildAt(0)).getChildAt(2).setAlpha(0.4f);
}

年フィールドを削除したい場合は、結果ビューの可視性をView.GONEに設定するだけです。

dp.getChildAt(0)).getChildAt(0)).getChildAt(2).setVisibility(View.GONE)



private DatePicker findDatePicker(ViewGroup group) {
    if (group != null) {
        for (int i = 0, j = group.getChildCount(); i < j; i++) {
            View child = group.getChildAt(i);
            if (child instanceof DatePicker) {
                return (DatePicker) child;
            } else if (child instanceof ViewGroup) {
                DatePicker result = findDatePicker((ViewGroup) child);
                if (result != null)
                    return result;
            }
        }
    }
    return null;

}

以下のリンクを参照しました DatePickerDialogから年を削除します

0
Suresh Vemuri