14

私はAndroidプラットフォームにまったく慣れておらず、開発プロセスを学びながらアプリケーションを構築してきました。

現在、2つの日付ピッカーを展開する必要があるアクティビティに取り組んでいます。1つは「開始日」で、もう1つは「終了日」です。私はここのAndroid開発者ページでDatePickerチュートリアルに従っています:http://developer.android.com/resources/tutorials/views/hello-datepicker.html

1つのDatePickerに対して、それは問題なく機能します。

ここでの私の問題は、2番目の日付ピッカーのプロセス全体を複製すると、エミュレーターと受話器で問題なく表示されることです。ただし、どのボタンを押して日付を選択しても、最初のTextViewのみが更新され、2番目のTextViewは現在の日付を表示し続けます。

コードは次のとおりです。

package com.datepicker;

import java.util.Calendar;

import android.app.Activity;
import android.app.DatePickerDialog;
import android.app.Dialog;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.DatePicker;
import android.widget.TextView;

public class datepicker extends Activity {

private TextView mDateDisplay;
private TextView endDateDisplay;
private Button mPickDate;
private Button endPickDate;
private int mYear;
private int mMonth;
private int mDay;

static final int START_DATE_DIALOG_ID = 0;
static final int END_DATE_DIALOG_ID = 0;


/** Called when the activity is first created. */
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    /*  capture our View elements for the start date function   */
    mDateDisplay = (TextView) findViewById(R.id.startdateDisplay);
    mPickDate = (Button) findViewById(R.id.startpickDate);

    /* add a click listener to the button   */
    mPickDate.setOnClickListener(new View.OnClickListener() {
        public void onClick(View v) {
            showDialog(START_DATE_DIALOG_ID);
        }
    });

    /* get the current date */
    final Calendar c = Calendar.getInstance();
    mYear = c.get(Calendar.YEAR);
    mMonth = c.get(Calendar.MONTH);
    mDay = c.get(Calendar.DAY_OF_MONTH);

    /* display the current date (this method is below)  */
    updateStartDisplay();


 /* capture our View elements for the end date function */
    endDateDisplay = (TextView) findViewById(R.id.enddateDisplay);
    endPickDate = (Button) findViewById(R.id.endpickDate);

    /* add a click listener to the button   */
    endPickDate.setOnClickListener(new View.OnClickListener() {
        public void onClick(View v) {
            showDialog(END_DATE_DIALOG_ID);
        }
    });

    /* get the current date */
    final Calendar c1 = Calendar.getInstance();
    mYear = c1.get(Calendar.YEAR);
    mMonth = c1.get(Calendar.MONTH);
    mDay = c1.get(Calendar.DAY_OF_MONTH);

    /* display the current date (this method is below)  */
    updateEndDisplay();
}



private void updateEndDisplay() {
    endDateDisplay.setText(
            new StringBuilder()
                // Month is 0 based so add 1
                .append(mMonth + 1).append("-")
                .append(mDay).append("-")
                .append(mYear).append(" "));

}



private void updateStartDisplay() {
    mDateDisplay.setText(
            new StringBuilder()
                // Month is 0 based so add 1
                .append(mMonth + 1).append("-")
                .append(mDay).append("-")
                .append(mYear).append(" "));


}

/*ユーザーが開始日関数のダイアログで日付を「設定」したときに受信するコールバック*/

 private DatePickerDialog.OnDateSetListener mDateSetListener =
            new DatePickerDialog.OnDateSetListener() {

            public void onDateSet(DatePicker view, int year, 
                                  int monthOfYear, int dayOfMonth) {
                mYear = year;
                mMonth = monthOfYear;
                mDay = dayOfMonth;
                updateStartDisplay();
            }
        };

@Override
protected Dialog onCreateDialog(int id) {
    switch (id) {
    case START_DATE_DIALOG_ID:
        return new DatePickerDialog(this,
                    mDateSetListener,
                    mYear, mMonth, mDay);
    }
    return null;
}
/* the callback received when the user "sets" the date in the dialog for the end date function  */

private DatePickerDialog.OnDateSetListener endDateSetListener =
        new DatePickerDialog.OnDateSetListener() {

            public void onDateSet(DatePicker view, int year, 
                                  int monthOfYear, int dayOfMonth) {
                mYear = year;
                mMonth = monthOfYear;
                mDay = dayOfMonth;
                updateStartDisplay();
            }
        };

protected Dialog onCreateDialog1(int id) {
    switch (id) {
    case END_DATE_DIALOG_ID:
        return new DatePickerDialog(this,
                    endDateSetListener,
                    mYear, mMonth, mDay);
    }
    return null;
}

}

コードに必要な変更についてアドバイスしてください。

4

14 に答える 14

30

新しいダイアログ タイプを追加せずに無制限の数の日付フィールドを許可するソリューションがあります。ユーザーがいずれかのボタンをクリックすると、DatePickerDialog を起動する前に、現在変更されている TextView と Calendar を登録します。ダイアログの OnDateSetListener は、登録された TextView と Calendar を更新します。

import java.util.Calendar;

import android.app.Activity;
import android.app.DatePickerDialog;
import android.app.Dialog;
import android.app.DatePickerDialog.OnDateSetListener;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.DatePicker;
import android.widget.TextView;

public class MultiDatePickerActivity extends Activity {

    private TextView startDateDisplay;
    private TextView endDateDisplay;
    private Button startPickDate;
    private Button endPickDate;
    private Calendar startDate;
    private Calendar endDate;

    static final int DATE_DIALOG_ID = 0;

    private TextView activeDateDisplay;
    private Calendar activeDate;

    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.multidatepicker);

        /*  capture our View elements for the start date function   */
        startDateDisplay = (TextView) findViewById(R.id.startDateDisplay);
        startPickDate = (Button) findViewById(R.id.startPickDate);

        /* get the current date */
        startDate = Calendar.getInstance();

        /* add a click listener to the button   */
        startPickDate.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {
                showDateDialog(startDateDisplay, startDate);
            }
        });

        /* capture our View elements for the end date function */
        endDateDisplay = (TextView) findViewById(R.id.endDateDisplay);
        endPickDate = (Button) findViewById(R.id.endPickDate);

        /* get the current date */
        endDate = Calendar.getInstance();

        /* add a click listener to the button   */
        endPickDate.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {
                showDateDialog(endDateDisplay, endDate);
            }
        });

        /* display the current date (this method is below)  */
        updateDisplay(startDateDisplay, startDate);
        updateDisplay(endDateDisplay, endDate);
    }

    private void updateDisplay(TextView dateDisplay, Calendar date) {
        dateDisplay.setText(
                new StringBuilder()
                    // Month is 0 based so add 1
                    .append(date.get(Calendar.MONTH) + 1).append("-")
                    .append(date.get(Calendar.DAY_OF_MONTH)).append("-")
                    .append(date.get(Calendar.YEAR)).append(" "));

    }

    public void showDateDialog(TextView dateDisplay, Calendar date) {
        activeDateDisplay = dateDisplay;
        activeDate = date;
        showDialog(DATE_DIALOG_ID);
    }

    private OnDateSetListener dateSetListener = new OnDateSetListener() {
        @Override
        public void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth) {
            activeDate.set(Calendar.YEAR, year);
            activeDate.set(Calendar.MONTH, monthOfYear);
            activeDate.set(Calendar.DAY_OF_MONTH, dayOfMonth);
            updateDisplay(activeDateDisplay, activeDate);
            unregisterDateDisplay();
        }
    };

    private void unregisterDateDisplay() {
        activeDateDisplay = null;
        activeDate = null;
    }

    @Override
    protected Dialog onCreateDialog(int id) {
        switch (id) {
            case DATE_DIALOG_ID:
                return new DatePickerDialog(this, dateSetListener, activeDate.get(Calendar.YEAR), activeDate.get(Calendar.MONTH), activeDate.get(Calendar.DAY_OF_MONTH));
        }
        return null;
    }

    @Override
    protected void onPrepareDialog(int id, Dialog dialog) {
        super.onPrepareDialog(id, dialog);
        switch (id) {
            case DATE_DIALOG_ID:
                ((DatePickerDialog) dialog).updateDate(activeDate.get(Calendar.YEAR), activeDate.get(Calendar.MONTH), activeDate.get(Calendar.DAY_OF_MONTH));
                break;
        }
    }
}

この種の柔軟性は、実行時まで必要な日付ピッカーの数がわからないアプリケーションで役立ちます。

于 2010-11-16T19:02:35.713 に答える
27

2 つの個別の DatePicker ダイアログを作成する必要があります

リスナーを 2 つ作る

int from_year, from_month, from_day,to_year, to_month, to_day; //initialize them to current date in onStart()/onCreate()
DatePickerDialog.OnDateSetListener from_dateListener,to_dateListener;

それらを実装...

         from_dateListener = new OnDateSetListener(){

            public void onDateSet(DatePicker arg0, int arg1, int arg2, int arg3) {

                          ...

                }
            }

        };
        to_dateListener = new OnDateSetListener(){
            public void onDateSet(DatePicker arg0, int arg1, int arg2, int arg3) {
                .....
            }
        };

両方に個別のダイアログを作成します

int DATE_PICKER_TO = 0;
int DATE_PICKER_FROM = 1;

@Override
protected Dialog onCreateDialog(int id) {

    switch(id){
        case DATE_PICKER_FROM:
                return new DatePickerDialog(this, from_dateListener, from_year, from_month, from_day); 
            case DATE_PICKER_TO:
                return new DatePickerDialog(this, to_dateListener, to_year, to_month, to_day);
    }
        return null;
}
于 2010-09-17T11:59:49.887 に答える
8

Adam のオプションを少し軽量な解釈に拡張し、より便利な可能性があるように、ダイアログ リクエストをインスタンス化した要素 ID の int 参照を維持し、最終的なイベント ハンドラーでそれを参照することにしました。これには、複数の日付入力があり、それぞれまたはそれぞれのグループに特定の書式設定が必要な場合に、このメソッドの switch ステートメントにうまく適合するという追加の利点があります。以下のすべてのスニペットは、Activity クラスに直接含まれています

インスタンス変数

private static final int        DIALOG_DATE_PICKER  = 100;
private int                     datePickerInput;

ダイアログハンドラ

@Override
public Dialog onCreateDialog(int id)
{
    switch(id) {
        case DIALOG_DATE_PICKER:
            final Calendar c = Calendar.getInstance();
            DatePickerDialog dialog = new DatePickerDialog(this, dateSetListener, c.get(Calendar.YEAR), c.get(Calendar.MONTH), c.get(Calendar.DAY_OF_MONTH));
            return dialog;
    }
    return null;
}

クリックリスナー

private OnClickListener datePickerListener =
    new OnClickListener()
{
    @Override
    public void onClick(View v)
    {
        datePickerInput = v.getId();
        showDialog(DIALOG_DATE_PICKER);
    }
};

日付選択ハンドラ

private DatePickerDialog.OnDateSetListener dateSetListener =
    new DatePickerDialog.OnDateSetListener()
{
    @Override
    public void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth)
    {
        switch( datePickerInput ) {
            case R.id.datePicker1:
                ((EditText) findViewById( datePickerInput ))
                    .setText(...);
                ...
                break;
            case R.id.datePicker2:
                ...
                break;
            default:
                ...
                break;
        }
    }
};
于 2011-10-06T21:49:49.830 に答える
5

よりクリーンなソリューションを見つけたと思います。これは、Google のアドバイスと私がここで読んだコメントを組み合わせたものです。私の場合、Viewpager のフラグメントから呼び出された場合でも機能します。基本的に、ここで定義されているように、フラグメントからピッカー ダイアログを呼び出すときに、引数のバンドルをダイアログ フラグメントに渡します :その価値。

Fragment コードから、startDate ボタンと endDate ボタンの両方の 2 つのリスナーを次に示します。

    mWylStartDate.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            Bundle bundle = new Bundle();
            bundle.putInt("DATE",1);

            DialogFragment newFragment = new DatePickerFragment();
            newFragment.setArguments(bundle);

            newFragment.show(getFragmentManager(), "datePicker");
        }
    });

    mWylEndDate.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            Bundle bundle = new Bundle();
            bundle.putInt("DATE",2);

            DialogFragment newFragment = new DatePickerFragment();
            newFragment.setArguments(bundle);

            newFragment.show(getFragmentManager(), "datePicker");

        }
    });

ここに私の DatePickerFragment クラスがあります

public class DatePickerFragment extends DialogFragment implements DatePickerDialog.OnDateSetListener
{

    static final int START_DATE = 1;
    static final int END_DATE = 2;

    private int mChosenDate;

    int cur = 0;


    @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);


        Bundle bundle = this.getArguments();
        if (bundle != null)
        {
            mChosenDate = bundle.getInt("DATE", 1);
        }


        switch (mChosenDate)
        {

            case START_DATE:
                cur = START_DATE;
                return new DatePickerDialog(getActivity(), this, year, month, day);

            case END_DATE:
                cur = END_DATE;
                return new DatePickerDialog(getActivity(), this, year, month, day);

        }
        return null;
    }


    @Override
    public void onDateSet(DatePicker datePicker, int year, int month, int day)
    {

        if (cur == START_DATE)
        {
            // set selected date into textview
            Log.v("Date Début", "Date1 : " + new StringBuilder().append(month + 1)
                    .append("-").append(day).append("-").append(year)
                    .append(" "));
        } else
        {
            Log.v("Date fin", "Date2 : " + new StringBuilder().append(month + 1)
                    .append("-").append(day).append("-").append(year)
                    .append(" "));
        }
    }
}
于 2014-07-02T14:43:34.880 に答える
2

あなたは単にこのタイプを使うことができます

public class MainActivity extends Activity {

     private TextView startDateDisplay;
        private TextView endDateDisplay;
        private Button startPickDate;
        private Button endPickDate;
        private Calendar startDate;
        private Calendar endDate;

        static final int DATE_DIALOG_ID = 0;

        private TextView activeDateDisplay;
        private Calendar activeDate;

        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);

            /*  capture our View elements for the start date function   */
            startDateDisplay = (TextView) findViewById(R.id.startDateDisplay);
            startPickDate = (Button) findViewById(R.id.startPickDate);

            /* get the current date */
            startDate = Calendar.getInstance();

            /* add a click listener to the button   */
            startPickDate.setOnClickListener(new View.OnClickListener() {
                public void onClick(View v) {
                    showDateDialog(startDateDisplay, startDate);
                }
            });

            /* capture our View elements for the end date function */
            endDateDisplay = (TextView) findViewById(R.id.endDateDisplay);
            endPickDate = (Button) findViewById(R.id.endPickDate);

            /* get the current date */
            endDate = Calendar.getInstance();

            /* add a click listener to the button   */
            endPickDate.setOnClickListener(new View.OnClickListener() {
                public void onClick(View v) {
                    showDateDialog(endDateDisplay, endDate);
                }
            });

            /* display the current date (this method is below)  */
            updateDisplay(startDateDisplay, startDate);
            updateDisplay(endDateDisplay, endDate);
        }

        private void updateDisplay(TextView dateDisplay, Calendar date) {
            dateDisplay.setText(
                    new StringBuilder()
                        // Month is 0 based so add 1
                        .append(date.get(Calendar.MONTH) + 1).append("-")
                        .append(date.get(Calendar.DAY_OF_MONTH)).append("-")
                        .append(date.get(Calendar.YEAR)).append(" "));

        }

        public void showDateDialog(TextView dateDisplay, Calendar date) {
            activeDateDisplay = dateDisplay;
            activeDate = date;
            showDialog(DATE_DIALOG_ID);
        }

        private OnDateSetListener dateSetListener = new OnDateSetListener() {
            @Override
            public void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth) {
                activeDate.set(Calendar.YEAR, year);
                activeDate.set(Calendar.MONTH, monthOfYear);
                activeDate.set(Calendar.DAY_OF_MONTH, dayOfMonth);
                updateDisplay(activeDateDisplay, activeDate);
                unregisterDateDisplay();
            }
        };

        private void unregisterDateDisplay() {
            activeDateDisplay = null;
            activeDate = null;
        }

        @Override
        protected Dialog onCreateDialog(int id) {
            switch (id) {
                case DATE_DIALOG_ID:
                    return new DatePickerDialog(this, dateSetListener, activeDate.get(Calendar.YEAR), activeDate.get(Calendar.MONTH), activeDate.get(Calendar.DAY_OF_MONTH));
            }
            return null;
        }

        @Override
        protected void onPrepareDialog(int id, Dialog dialog) {
            super.onPrepareDialog(id, dialog);
            switch (id) {
                case DATE_DIALOG_ID:
                    ((DatePickerDialog) dialog).updateDate(activeDate.get(Calendar.YEAR), activeDate.get(Calendar.MONTH), activeDate.get(Calendar.DAY_OF_MONTH));
                    break;
            }
        }


}
于 2014-04-29T06:26:53.943 に答える
0

次のコードを使用できます

@Override
protected Dialog onCreateDialog(int id) {
    /*
     * final Dialog d = new Dialog(this); d.set
     */

    switch (id) {
    case DATE_DIALOG_ID:
        return new DatePickerDialog(this,
                android.R.style.Theme_Holo_Light_Dialog_MinWidth,
                mDateSetListener, cmYear, cmMonth, cmDay);

    }
    return null;
}

private DatePickerDialog.OnDateSetListener mDateSetListener = new DatePickerDialog.OnDateSetListener() {
    @Override
    public void onDateSet(DatePicker view, int year, int monthOfYear,
            int dayOfMonth) {
        cmYear = year;
        cmMonth = monthOfYear;
        cmDay = dayOfMonth;
        updateDisplay();
    }
};

private void updateDisplay() {

    String date_check = ""
            + new StringBuilder()
                    // Month is 0 based so add 1
                    .append(cmYear).append("-").append(cmMonth + 1)
                    .append("-").append(cmDay).append(" ");
}

任意のダイアログで呼び出すことができますonclick

showDialog(DATE_DIALOG_ID);

ここで、DATE_DIALOG_ID は次のように宣言されます

static final int DATE_DIALOG_ID = 0;

これが役に立つことを願っています。

于 2014-04-28T09:37:11.037 に答える
-4

ブール値のフラグ変数を使用するだけで、呼び出し元のビューを決定できます。

于 2014-02-12T14:43:52.440 に答える