1

簡単な質問がありますが、しばらく検索しても答えが見つかりませんでした。DatePickerで、文字列ではなく整数として表示される月を変更することはできますか?例:{1,2,3 ..}ではなく{jan、feb、mar ...}

編集:

@kanedaのソリューションは機能しているように見えますが、Android 3.0では、少なくともメソッドと属性は同じではありません。私が使用しているコードは次のとおりです。

public DatePickerCustom(Context context, AttributeSet attrs) {
       super(context, attrs);
       Field[] fields = DatePicker.class.getDeclaredFields();
       try {
           for (Field field : fields) {
               field.setAccessible(true);
               if (TextUtils.equals(field.getName(), "mMonthSpinner")) {
                   Method m =     field.getType().getDeclaredMethod("setDisplayedValues", String[].class);
                   m.setAccessible(true);
                   String[] s = new String[]     {"01","02","03","04","05","06","07","08","09","10","11","12"};
                   Object[] params = new Object[1];
                   params[0] = s;
                   m.invoke(field.get(this), params);
                   break;
               }
           }
       }
       catch (Exception e) {
           System.out.println(e.getMessage());
           e.printStackTrace();
       }
    }

編集2:

最善の解決策は、カスタムDatePicker(@kanedaの最初のアドバイスに従う)を作成することです。これは、互換性の問題がなく、リフレクションを中継しない場合でも常に機能します。

androidのdate_picker.xmlと@kanedaによって投稿されたDatePicker.javaを使用しました。また、カスタムのNumberPickerを使用しました(DatePickerウィジェットが使用するものはAndroidの内部にあるため)。NumberPickerウィジェットについては、このリンクをたどりました。

CustomDatePickerで、関数にコメントを付けgetShortMonths()、月の範囲をに設定しましたmMonthPicker.setRange(1, NUMBER_OF_MONTHS);

4

1 に答える 1

3

ベストプラクティスに関することについては、独自のレイアウトを作成して独自のカスタムを作成する方が最も正確で簡単だと思います。DatePickerそのため、参考のためにソースコードを確認することをお勧めします。

Androidのソースコード

また

ここ

それは素晴らしい方法です。醜い方法、あなたはこれを行うことができます:

Androidバージョン<3.0

package my.pkg;
...
class MyDatePicker extends DatePicker {

    public MyDatePicker(Context context, AttributeSet attrs) {
        super(context, attrs);
        Field[] fields = DatePicker.class.getDeclaredFields();
        try {
            for (Field field : fields) {
                field.setAccessible(true);
                if (TextUtils.equals(field.getName(), "mMonthPicker")) {
                    Method m = field.getType().getDeclaredMethod("setRange", int.class, int.class, String[].class);
                    m.setAccessible(true);
                    String[] s = new String[] {"01","02","03","04","05","06","07","08","09","10","11","12"};
                    m.invoke(field.get(this), 1, 12, s);
                    break;
                }
            }
        }
        catch (Exception e) {
            System.out.println(e.getMessage());
            e.printStackTrace();
        }
    }

}

Androidバージョン>=3.0(コンストラクターのみ)

public MyDatePicker(Context context, AttributeSet attrs) {
    super(context, attrs);
    Field[] fields = DatePicker.class.getDeclaredFields();
    try {
        String[] s = new String[] {"01","02","03","04","05","06","07","08","09","10","11","12"};
        for (Field field : fields) {
            field.setAccessible(true);
            if (TextUtils.equals(field.getName(), "mMonthSpinner")) {
                NumberPicker monthPicker = (NumberPicker) field.get(this);
                monthPicker.setDisplayedValues(s);
            } 
            if (TextUtils.equals(field.getName(), "mShortMonths")) {
                field.set(this, s);
            }
        }
    }
    catch (Exception e) {
        System.out.println(e.getMessage());
        e.printStackTrace();
    }
}

次に、ボイラープレートxml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >

    <my.pkg.MyDatePicker
        android:layout_width="fill_parent"
        android:layout_height="wrap_content" />
</LinearLayout>

ここに画像の説明を入力してください

于 2012-05-09T04:49:02.373 に答える