【问题标题】:How to return Dialogue fragments result values如何返回对话片段结果值
【发布时间】:2016-06-10 12:51:52
【问题描述】:

我创建了一个DateandTimePickerDialogueFragment,我正在从MainActivity 调用DateandTimePickerDialogueFragment

我的问题是,如何将DateandTimePickerDialogueFragment 结果值发送到MainActivity

MainActivity:

@Override
public void onClick(View v) {

    if (v.getId() == R.id.buttonid) {

        DateandTimePickerDialogueFragment dateandTimePickerDialogueFragment = new DateandTimePickerDialogueFragment();
        dateandTimePickerDialogueFragment.show(getSupportFragmentManager(), "DateandTimePickerDialogueFragment");
    }
}

DateandTimePickerDialogueFragment:

public class DateandTimePickerDialogueFragment extends DialogFragment {

    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        return super.onCreateView(inflater, container, savedInstanceState);
    }

    @NonNull
    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {
        return displayDateDialogPicker(getActivity());
    }

    /**
     * @param context
     */
    private Dialog displayDateDialogPicker(Context context) {

        int mYear, mMonth, mDay;
        final Calendar c = Calendar.getInstance();
        mYear = c.get(Calendar.YEAR);
        mMonth = c.get(Calendar.MONTH);
        mDay = c.get(Calendar.DAY_OF_MONTH);

        DatePickerDialog dpd = new DatePickerDialog(context,
                new DatePickerDialog.OnDateSetListener() {

                    @Override
                    public void onDateSet(DatePicker view, int year,
                                          int monthOfYear, int dayOfMonth) {
                        int mymonth = monthOfYear + 1;
                        String mmmMonth = "", mmDate = "";
                        if (mymonth > 0 && mymonth < 10) {

                            mmmMonth = "0" + mymonth;

                        } else {

                            mmmMonth = "" + mymonth;
                        }

                        if (dayOfMonth > 0 && dayOfMonth < 10) {
                            mmDate = "0" + dayOfMonth;
                        } else {

                            mmDate = "" + dayOfMonth;
                        }
                        //YYYY-MM-DD
                        String finalDate = year + "-" + (mmmMonth) + "-" + mmDate;

                        Intent intentData = new Intent();
                        intentData.putExtra("Date", finalDate);

                        getTargetFragment().onActivityResult(getTargetRequestCode(), Activity.RESULT_OK, intentData);
                    }
                }, mYear, mMonth, mDay);
        dpd.show();
        return dpd;
    }
}

【问题讨论】:

  • 你能写一个方法来更新你的类变量以获得结果吗?

标签: android android-dialogfragment android-datepicker datepickerdialog


【解决方案1】:

虽然不在 DialogFragment 上使用包含方法或 valueType 的接口,但在返回 dpd 之前,将该 dpd 插入该变量接口并在 MainActivity 上实现该接口。

【讨论】:

    【解决方案2】:

    在您的DialogFragment 中,您可以为此制作接口

    用下面的代码替换完整的代码

    public class DateandTimePickerDialogueFragment extends DialogFragment {
    public static interface OnCompleteListener {
        public abstract void onComplete(String time);
    }
    
    private OnCompleteListener mListener;
    // make sure the Activity implemented it
    
    public void onAttach(Activity activity) {
        super.onAttach(activity);
        try {
            this.mListener = (OnCompleteListener) activity;
        } catch (final ClassCastException e) {
            throw new ClassCastException(activity.toString() + " must implement OnCompleteListener");
        }
    }
    
    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        return super.onCreateView(inflater, container, savedInstanceState);
    }
    
    @NonNull
    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {
        return displayDateDialogPicker(getActivity());
    }
    
    /**
     * @param context
     */
    private Dialog displayDateDialogPicker(Context context) {
        mListener = (OnCompleteListener)getActivity();
        int mYear, mMonth, mDay;
        final Calendar c = Calendar.getInstance();
        mYear = c.get(Calendar.YEAR);
        mMonth = c.get(Calendar.MONTH);
        mDay = c.get(Calendar.DAY_OF_MONTH);
    
        DatePickerDialog dpd = new DatePickerDialog(context,
                new DatePickerDialog.OnDateSetListener() {
    
                    @Override
                    public void onDateSet(DatePicker view, int year,
                                          int monthOfYear, int dayOfMonth) {
                        int mymonth = monthOfYear + 1;
                        String mmmMonth = "", mmDate = "";
                        if (mymonth > 0 && mymonth < 10) {
    
                            mmmMonth = "0" + mymonth;
    
                        } else {
    
                            mmmMonth = "" + mymonth;
                        }
    
                        if (dayOfMonth > 0 && dayOfMonth < 10) {
                            mmDate = "0" + dayOfMonth;
                        } else {
    
                            mmDate = "" + dayOfMonth;
                        }
                        //YYYY-MM-DD
                        String finalDate = year + "-" + (mmmMonth) + "-" + mmDate;
    
    
                        mListener.onComplete(finalDate);
                       // getTargetFragment().onActivityResult(getTargetRequestCode(), Activity.RESULT_OK, intentData);
                    }
                }, mYear, mMonth, mDay);
        dpd.show();
        return dpd;
    }
    }
    

    现在您可以在您的活动中implements DateandTimePickerDialogueFragment.OnCompleteListener 并导入接口的方法,在此方法中您可以获取您的数据

     @Override
    public void onComplete(String time) {
        Log.d("TAG", time.toString());
    }
    

    【讨论】:

    • 我得到了类似 java.lang.NullPointerException 的异常:尝试调用虚拟方法 'void android.support.v4.app.Fragment.onActivityResult(int, int, android.content.Intent)' on空对象引用
    • 尝试先检查Intent是否为空
    【解决方案3】:

    你会想要设置一个接口监听器。

    在您的对话框片段中:

        public interface DateandTimeListener {
             public void OnDateTimeSelected(String date);
        }
    
        private static DateandTimeListener mListener;
    
        //Your activity will call this. Passing its context 'this' as the listener.
        public void setDateandTimeListener(DateandTimeListener listener){
             mListener = listener;
        }
    

    然后在你的 onDateSet 中:

     public void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth){
     ....                        
     String finalDate = year + "-" + (mmmMonth) + "-" + mmDate;
     mListener.OnDateTimeSelected(finalDate);
    
     ....
     }
    

    在您的 MainActivity 中:

    确保你实现了监听器。

     public class MainActivity extends Activity implements DateandTimePickerDialogueFragment.DateandTimeListener
    

    这将强制您覆盖活动中的OnDateTimeSelected 回调函数。从那里您将获得从对话框返回的 finalDate 字符串。

    另外在你的活动中确保你调用setDateandTimeListener(this)来设置监听器

    希望有帮助!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-06-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多