web-dev-qa-db-ja.com

Android Datepicker Fragment-ユーザーが日付を設定したときに何かを行う方法は?

私はここでチュートリアルに従っています: http://developer.Android.com/guide/topics/ui/controls/pickers.html

動作するものがあり、日付ピッカーが表示されます。しかし、ユーザーが日付を設定したときの対処方法に固執しています。

私は彼らがこの方法を持っているのを見ます:

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

しかし、コードを入れても何も起こりません。

私はJavaに精通していないので、選択した日付でテキストビューを更新するために必要な追加のコードがわかりません。

私はこのコードを追加しました:

private DatePickerDialog.OnDateSetListener mDateListener =
        new DatePickerDialog.OnDateSetListener() {
            public void onDateSet(DatePicker view, int year, int month, int day) {
                updateDate(year, month, day);
            }
        };

public void updateDate(int year, int month, int day) {
    TextView bdate = (TextView)findViewById(R.id.birthDate);
    Date chosenDate = new Date(year, month, day);
    Java.text.DateFormat dateFormat = DateFormat.getDateFormat(getApplicationContext());
    bdate.setText(dateFormat.format(chosenDate));
}

しかし、それは何もしません。

私はこのほぼ正確な質問を見つけました: dialogfragmentを使用してdatepickerから日付を取得します

ただし、そのソリューションでは、(EditSessionActivity)を使用して、DatePickerFragmentクラスをEditSessionActivityのみで動作するように制限しませんか?

16
dtc

DialogFragmentに引数を渡すには、静的ファクトリを使用する必要があります。 docs から、

「すべてのフラグメントには空のコンストラクターが必要です。これにより、アクティビティの状態を復元するときにインスタンス化できます。フラグメントが再インスタンス化されるときにこれらのコンストラクターが呼び出されないため、サブクラスにパラメーターを持つ他のコンストラクターを持たないことを強くお勧めします。 、引数は、呼び出し元がsetArguments(Bundle)を使用して提供し、後でFragmentがgetArguments()を使用して取得できます。」

同様に、Fragmentサブクラスは静的である必要があります。これにより、親アクティビティまたはFragmentに依存せずに自身を再インスタンス化できます。これらのガイドラインに従わないと、フラグメントが再開しようとしたときにクラッシュやエラーが発生することがあります。

Androidの docs からDialogFragmentを構築するための推奨される方法は、静的ファクトリメソッドを使用することです。これは、初期日付とOnDateChangedListenerを受け取る日付ピッカーフラグメントの例です。

public static class DatePickerFragment extends DialogFragment{

    private OnDateSetListener onDateSetListener;

    static DatePickerFragment newInstance(Date date, OnDateSetListener onDateSetListener) {
        DatePickerFragment pickerFragment = new DatePickerFragment();
        pickerFragment.setOnDateSetListener(onDateSetListener);

        //Pass the date in a bundle.
        Bundle bundle = new Bundle();
        bundle.putSerializable(MOVE_IN_DATE_KEY, date);
        pickerFragment.setArguments(bundle);
        return pickerFragment;
    }

    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {
        super.onCreateDialog(savedInstanceState);

        Date initialDate = (Date) getArguments().getSerializable(MOVE_IN_DATE_KEY);
        int[] yearMonthDay = ymdTripleFor(initialDate);
        DatePickerDialog dialog = new DatePickerDialog(getActivity(), onDateSetListener, yearMonthDay[0], yearMonthDay[1],
                yearMonthDay[2]);
        return dialog;
    }

    private void setOnDateSetListener(OnDateSetListener listener) {
        this.onDateSetListener = listener;
    }

    private int[] ymdTripleFor(Date date) {
        Calendar cal = Calendar.getInstance(Locale.US);
        cal.setTime(date);
        return new int[]{cal.get(Calendar.YEAR), cal.get(Calendar.MONTH), cal.get(Calendar.DAY_OF_MONTH)};
    }
}

次に、次のようにこれらのダイアログフラグメントの1つを作成できます。

DatePickerFragment.newInstance(yourDate, yourOnDateSetListener);
9
GLee

ここでDialogFragmentsを使用できると思います。

DialogFragment newFragment = new DatePickerFragment();
newFragment.show(getSupportFragmentManager(), "datePicker");

datePickerFragmentを定義し、以下のメソッドを実装します

public void onDateSet(DatePicker view, int year, int month, int day) {
// Do something with the date chosen by the user
DateEdit.setText(day + "/" + (month + 1) + "/" + year);
}

Android DialogFragment Example から取得。

2
KnowIT

私の経験では、このコードは完全に機能します!、私はwin10 Android Studio 2.2 ...

import Android.app.Dialog;
import Android.support.v4.app.DialogFragment;
import Android.support.v7.app.AppCompatActivity;
import Android.os.Bundle;
import Android.view.View;
import Android.app.DatePickerDialog;
import Android.widget.DatePicker;
import Android.widget.EditText;
import Java.util.Calendar;


public class MainActivity extends AppCompatActivity implements DatePickerDialog.OnDateSetListener{
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);}

    public void datePicker(View view){
        DatePickerFragment fragment_date = new DatePickerFragment();
        fragment_date.show(getSupportFragmentManager(),"datePicker");}

    @Override
    public void onDateSet(DatePicker view, int year, int month, int day) {
         String day_x = ""+ day  ,month_x = ""+(month+1);
         if (day   < 9 ){ day_x   = "0" + day_x;}
         if (month < 9 ){ month_x = "0" + month_x;}
         ((EditText) findViewById(R.id.txtDate)).setText(day_x + "/" + month_x + "/" + year);}

    public static class DatePickerFragment extends DialogFragment {
        @Override
        public Dialog onCreateDialog (Bundle savedInstanceState){
            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);
            return new DatePickerDialog(getActivity() ,(DatePickerDialog.OnDateSetListener)this,day,month,year);}}

}

「textViewtxtDate」と「onclick = datePickerのボタン」があります

1