54

私はGoogleの例を使用して、dialogfragmenthttp://developer.android.com/guide/topics/ui/controls/pickers.htmlを使用してアプリ内に日付ピッカーを挿入してい
ます。

しかし、設定後に日付を取得する方法がわかりません(Javaエキスパートではありません)。ダイアログと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) {
        **Log.w("DatePicker","Date = " + year);**
    }
}

...そして私は自分のアクティビティからダイアログを呼び出します...

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

Log.wの代わりに親アクティビティでメソッドを呼び出す正しい方法は何ですか?これは、コールバックをパラメーターなどとして渡すことに関連していると思いますが、インターネットで見つけた参照のほとんどは、ダイアログフラグメントのない以前のバージョンに関するものです。

編集:それが重要かどうかはわかりませんが、親の活動は次のように宣言されています:

public class EditSessionActivity extends FragmentActivity {

解決策:Lechoユーザーのおかげで、これがその方法です

DatePickerFragmennt.class

public class DatePickerFragment extends DialogFragment{

    @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(), (EditSessionActivity)getActivity(), year, month, day);
    }

}

...および親アクティビティEditSessionActivity.class....

public class EditSessionActivity extends FragmentActivity implements OnDateSetListener {
...
    @Override
    public void onDateSet(DatePicker view, int year, int month, int day) {
        //do some stuff for example write on log and update TextField on activity
        Log.w("DatePicker","Date = " + year);
        ((EditText) findViewById(R.id.tf_date)).setText("Date = " + year);
    }
4

9 に答える 9

64

コンストラクターfoDatePickerDialogDatePickerDialog.OnDateSetListener2番目のパラメーターを受け取るため、親アクティビティEditSessionActivity(ではなくDatePickerFragment)にそのインターフェイスを実装し、次の行を変更する必要があります。

return new DatePickerDialog(getActivity(), this, year, month, day);

これに:

return new DatePickerDialog(getActivity(), (EditSessionActivity)getActivity(), year, month, day);

そして、あなたの活動は次のようになります:

public class EditSessionActivity extends FragmentActivity implements
        DatePickerDialog.OnDateSetListener{

    public void onDateSet(DatePicker view, int year, int month, int day) {
        //use date in your activity
    }
    ...
}
于 2012-07-17T17:18:08.790 に答える
25

日付ピッカーを表示するクラスの日付ピッカー作成でonDateSetを単純にオーバーライドします。以下のコードを参照してください。

  private OnClickListener onDateClicked() {
    return new OnClickListener() {
          @Override
          public void onClick(View v) {
             DialogFragment newFragment = new DatePickerFragment() {
                @Override
                public void onDateSet(DatePicker view, int year, int month, int day) {
                  salePaymentCustomView.setBtDateText("" + day + "/" + month+1 + "/" + year);
                }
             };
             newFragment.show(getActivity().getSupportFragmentManager(), "datePicker");
    }
  };
 } 
于 2013-02-07T12:58:13.593 に答える
14

onDateSetこの問題は、メソッドを親アクティビティに移動しなくても解決できます。DatePickerFragmentビューを検索する場所を指定するだけです。

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 some stuff for example write on log and update TextField on activity
        Log.w("DatePicker","Date = " + year);
        ((TextView) getActivity().findViewById(R.id.tf_date)).setText("Date = " + year);
    }
}

また、キャストのターゲットをからに変更しEditTextましたTextView。このようにして、実装だけでなく、さまざまな種類のビューに実装を再利用できますEditText

于 2013-05-11T23:14:58.443 に答える
10

上記の答えに1つの訂正があります。このようにDatePickerDialogを返す代わりに

新しいDatePickerDialog(getActivity()、(EditSessionActivity)getActivity()、year、month、day);を返します。

より一般的な方法で返品する必要があります

新しいDatePickerDialog(getActivity()、(OnDateSetListener)getActivity()、year、month、day);を返します。

アクティビティがOnDateSetListenerインターフェイスを実装し、関数onDateSetをオーバーライドしていることを確認してください

@Override
public void onDateSet(DatePicker view, int year, int monthOfYear,int dayOfMonth) 
于 2014-01-25T06:50:14.767 に答える
3
public void onDate(View view) {

        DialogFragment fragment = new SelectDateFragment();
        fragment.show(getFragmentManager(), "Date Picker");
    }

//  @SuppressLint("NewApi")
    class SelectDateFragment extends DialogFragment implements
            DatePickerDialog.OnDateSetListener {

        public Dialog onCreateDialog(Bundle savedInstanceState) {


            System.out.println("entrering on create dialog");;

            return new DatePickerDialog(getActivity(), this, mYear, mMonth,
                    mDay);//it will return dialog setting date with mYera,MMonth and MDay

        }

        @Override
        public void onDateSet(android.widget.DatePicker view, int year,
                int monthOfYear, int dayOfMonth) {
            System.out.println("year=" + year + "day=" + dayOfMonth + "month="
                    + monthOfYear);
            mYear=year;
            mMonth=monthOfYear;
            mDay=dayOfMonth;

            onPopulateSet(year, monthOfYear + 1, dayOfMonth);

        }
// set the selected date in the edit text  
        private void onPopulateSet(int year, int i, int dayOfMonth) {
            EditText et_setDate;
            et_setDate = (EditText) findViewById(R.id.register_et_dob);//register_et_dob:-id name of the edit text 
            et_setDate.setText(dayOfMonth + "/" + i + "/" + year);
            System.out.println("enetring on populate Set");

        }
于 2013-08-26T11:13:54.303 に答える
3

結果をフラグメントに返す必要があるが、アクティビティは返さない場合は、次の完全な解決策があります。

public class DatePickerDialogFragment extends DialogFragment  {

    private static final String ARGUMENT_YEAR = "ARGUMENT_YEAR";
    private static final String ARGUMENT_MONTH = "ARGUMENT_MONTH";
    private static final String ARGUMENT_DAY = "ARGUMENT_DAY";
    private DatePickerDialog.OnDateSetListener listener;

    private int year;
    private int month;
    private int dayOfMonth;

    public static DatePickerDialogFragment newInstance(final int year, final int month, final int dayOfMonth) {
        final DatePickerDialogFragment df = new DatePickerDialogFragment();
        final Bundle args = new Bundle();
        args.putInt(ARGUMENT_YEAR, year);
        args.putInt(ARGUMENT_MONTH, month);
        args.putInt(ARGUMENT_DAY, dayOfMonth);
        df.setArguments(args);
        return df;
    }

    @Override
    public void onCreate(@Nullable final Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        retrieveArguments();
    }

    private void retrieveArguments() {
        final Bundle args = getArguments();
        if (args != null) {
            year = args.getInt(ARGUMENT_YEAR);
            month = args.getInt(ARGUMENT_MONTH);
            dayOfMonth = args.getInt(ARGUMENT_DAY);
        }
    }

    @Override
    public Dialog onCreateDialog(final Bundle savedInstanceState) {
        return new DatePickerDialog(getContext(), this.listener, this.year, this.month, this.dayOfMonth);
    }

    public void setListener(final DatePickerDialog.OnDateSetListener listener) {
        this.listener = listener;
    }
}

次に、フラグメントまたはアクティビティで使用します。

final Calendar c = Calendar.getInstance();
DatePickerDialogFragment datePicker = DatePickerDialogFragment.newInstance(
        c.get(Calendar.YEAR),
        c.get(Calendar.MONTH),
        c.get(Calendar.DAY_OF_MONTH));
datePicker.setListener(this);
datePicker.show(getChildFragmentManager(), null);
于 2018-05-30T20:33:20.837 に答える
2

Leszekの答えは機能しますが、ダイアログが別のフラグメントから開始された場合は機能しません。その場合setTargetFragment()、ダイアログを作成するコードとダイアログコードで使用する必要がありgetTargetFragment()ます。

ダイアログを作成するコードでは、次のようになります。

DialogFragment dialogFragment = new YourDialogFragment();
dialogFragment.setTargetFragment(YourParentFragment.this, 0);
dialogFragment.show(getFragmentManager(), "mydialog");

DialogFragmentコードの場合:

@Override
public Dialog onCreateDialog(Bundle savedInstanceState)
{
    DatePickerDialog.OnDateSetListener listener = new DatePickerDialog.OnDateSetListener()
    {
        @Override
        public void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth)
        {
            YourParentFragment parentFragment = (YourParentFragment) getTargetFragment();
            // Manipulate the parent fragment
            // ...
        }
    };
    // Get the initial date
    // ...
    return new DatePickerDialog(getActivity(), listener, year, month, day);
}
于 2017-02-22T11:44:32.040 に答える
0

これと同様の問題が発生しましたが、日付ピッカーが別のフラグメント内のダイアログフラグメントから起動されていました。これにより、コールバックを操作するのが非常に困難になりました。これは、コールバックがメインアクティビティに戻りたいため、データを前のダイアログフラグメントに戻したいためです。

最初に、(OnDateSetListenerを使用して)新しい日付値をメインアクティビティに渡し、日付ピッカーを起動したダイアログを使用してそれらを取得しようとしましたが、日付ピッカーが閉じたときにそのダイアログでトリガーされるライフサイクルイベントはありません。

私が得た結果は、日付ピッカーのonDismissにあり、新しいダイアログフラグメントをインスタンス化し、その上でset resultsメソッドを呼び出してから、起動します。もちろん、このためには、日付ピッカーを起動するときに前のフラグメントが閉じられていることを確認する必要があります。

これは、日付ピッカーを呼び出したdialogFragmentです

public class NewTrialDialogFragment extends DialogFragment  {

public final String LOG_TAG = "NewTrialDialog Fragment";

Button startDateButton;
Integer newYear, newMonth, newDay;


@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    View rootView = inflater.inflate(R.layout.dialog_new_trial, container, false);
    getDialog().setTitle("Dialog New Trial");

    startDateButton = (Button) rootView.findViewById(R.id.button_start_date);
    startDateButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            showDatePickerDialog(v);
        }
    });

    //If you exit the datepicker without choosing anything, it returns zeros
    if (newYear != null && newMonth != null && newDay != null && newYear != 0) {
        startDateButton.setText(newYear + " " + newMonth + " " + newDay);
    }else{
        startDateButton.setText("Select Start Date");
    }

     return rootView;
}

public void showDatePickerDialog(View v) {
    TrialDatePickerDialog newDialog = new TrialDatePickerDialog();
    newDialog.show(getActivity().getSupportFragmentManager(), "datePicker");
    this.dismiss();
}

public void setDates(int year, int month, int day){
    newYear = year;
    newMonth = month;
    newDay = day;
}}

そして、日付ピッカー

public  class TrialDatePickerDialog extends DialogFragment implements DatePickerDialog.OnDateSetListener
     {

private final String LOG_TAG = "TrialDatePickerDialog";
int newYear, newMonth, newDay;


@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 TrialDatePickerDialog and return it
    return new DatePickerDialog(getActivity(), this , year, month, day);
}

         @Override
         public void onDismiss(DialogInterface dialog) {
             super.onDismiss(dialog);
             FragmentManager fm = getActivity().getSupportFragmentManager();
             NewTrialDialogFragment newTrialDialogFragment = new NewTrialDialogFragment();
             newTrialDialogFragment.setDates(newYear, newMonth, newDay);
             newTrialDialogFragment.show(fm, "new_trial_dialog");

         }

         @Override
         public void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth) {
             newYear = year;
             newMonth = monthOfYear;
             newDay = dayOfMonth;
         }
     }
于 2016-04-17T08:19:55.227 に答える
0

Kotlinバージョン。

DatePickerFragmentクラス:

class DatePickerFragment : DialogFragment() {

    override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {

        val c = Calendar.getInstance()
        val year = c.get(Calendar.YEAR)
        val month = c.get(Calendar.MONTH)
        val day = c.get(Calendar.DAY_OF_MONTH)

        return DatePickerDialog(context!!, context!! as MainActivity, year, month, day)
    }
}

DatePickerDialog.OnDateSetListenerがMainActicityに移動されました

class MainActivity : AppCompatActivity(), DatePickerDialog.OnDateSetListener {

    ..

    override fun onDateSet(view: DatePicker, year: Int, month: Int, day: Int) {
        //use date in your activity
    }
}
于 2019-11-04T02:42:27.530 に答える