web-dev-qa-db-ja.com

Androidで日付スピナーを作成する方法

日付ピッカーダイアログを開くAndroidスピナーを作成するにはどうすればよいですか?

下のスクリーンショットに示すように、カレンダーアプリのようなスピナーが必要です。

Screenshot of Android calendar app, with the desired GUI element highlighted

私がすでに試したこと:

レイアウトXMLでスピナーを作成し、onclick属性を設定してダイアログを表示するメソッドを呼び出そうとしました。 「クリック」でメソッド名を入力すると、「次のクラスが見つかりませんでした:-スピナー(Android.widget.Spinnerに変更、ビルドパスを修正、XMLを編集)」というエラーが表示されました。

<Spinner
    Android:id="@+id/spinner1"
    Android:layout_width="match_parent"
    Android:layout_height="wrap_content"
    Android:onClick="showDatePickerDialog" />

showDatePickerDialogは適切なクラスにあります。

public void showDatePickerDialog(View v) {
    DialogFragment newFragment = new DatePickerFragment();
    newFragment.show(getFragmentManager(), "Date");
}

そして、これはDatePickerFragmentです(別のウェブサイトからコピー):

import Java.util.Calendar;

import Android.app.DatePickerDialog;
import Android.app.Dialog;
import Android.app.DialogFragment;
import Android.os.Bundle;
import Android.widget.DatePicker;

public class DatePickerFragment extends DialogFragment
                        implements DatePickerDialog.OnDateSetListener {

    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {

        // Use the current date as the default date in the picker
        final Calendar c = Calendar.getInstance();
        int year = c.get(Calendar.YEAR);
        int month = c.get(Calendar.MONTH);
        int day = c.get(Calendar.DAY_OF_MONTH);

        // Create a new instance of DatePickerDialog and return it
        return new DatePickerDialog(getActivity(), this, year, month, day);
    }

    public void onDateSet(DatePicker view, int year, int month, int day) {
        // Do something with the date chosen by the user
    }
}

解決:

別の質問 で解決策を見つけました。

レイアウトファイルで通常のスピナーを使用してから、アクティビティクラスで次のコードを使用します。

dateSpinner = (Spinner)findViewById(R.id.spinner_date);

View.OnTouchListener Spinner_OnTouch = new View.OnTouchListener() {
    public boolean onTouch(View v, MotionEvent event) {
        if (event.getAction() == MotionEvent.ACTION_UP) {
            showDatePickerDialog(v);
        }
        return true;
    }
};

View.OnKeyListener Spinner_OnKey = new View.OnKeyListener() {
    public boolean onKey(View v, int keyCode, KeyEvent event) {
        if (keyCode == KeyEvent.KEYCODE_DPAD_CENTER) {
            showDatePickerDialog(v);
            return true;
        }
        else {
            return false;
        }
    }
};

dateSpinner.setOnTouchListener(Spinner_OnTouch);
dateSpinner.setOnKeyListener(Spinner_OnKey);

少しハッキングされたようですが、動作します。誰かがそれを行うためのよりクリーンな方法を知っていますか?スピナーでsetOnClickListener()またはsetOnItemClickListener()を使用できません。

19

一般的にこの場合、人々はボタンを使用してそれをスピナーのようにスタイルします( ここでのアプローチ私はより良いアプローチだと思います 、主にスタイルを設定するだけです) Android.R.attr.spinnerStyle)、またはスピナーを使用しますが、クリックアクションをオーバーロードしてダイアログを作成します。

もちろん、そこに難しいのは、ニースの月/日/年のスピン(つまり、スピナーではありません...スロットマシンのようなもの)を含むカスタムダイアログを作成することです!

あなたがそれをすることができるいくつかの方法があります、ここにいくつかのグーグルドキュメントがあります、そしてあなたはいつでも Androidソースコード を持ち上げることができます(明らかに欠点がありますが)。

12
xbakesx

とても簡単に達成できました。カレンダーアプリとまったく同じように見えます。

TextViewを使用して、それにスピナースタイルを与えます。

<TextView
   Android:layout_width="wrap_content"
   Android:layout_height="wrap_content"
   style="@Android:style/Widget.Holo.Spinner" />

HoloテーマなしのAPI 10以下の場合は、次を使用します。

style="@Android:style/Widget.Spinner"
11
Olumide Oyetoke

ボタンが最善の方法です。ボタンのスタイルを変更するだけです。デフォルトのAndroid=スピナースタイルをボタンに設定しようとしましたが、正しく機能しません。そのため、独自のスタイルを作成しました(これはデフォルトのスピナースタイルのコピーです)。ここにあります。 :

    `<selector xmlns:Android="http://schemas.Android.com/apk/res/Android">
        <item Android:state_enabled="false"
              Android:drawable="@drawable/spinner_disabled_holo_light" />
        <item Android:state_pressed="true"
              Android:drawable="@drawable/spinner_pressed_holo_light" />
        <item Android:state_pressed="false" Android:state_focused="true"
              Android:drawable="@drawable/spinner_focused_holo_light" />
        <item Android:drawable="@drawable/spinner_default_holo_light" />
    </selector>

`

..\sdk\platforms\Android-%%\data\res\drawableにある画像。

これは私にとってはうまくいきます。これは、Googleカレンダーのスピナーのように、ボタンスピナースタイルを作成する簡単な方法です。

2