从DialogFragment(日期选择器)检索和设置数据

3

当我在活动上按下一个按钮时,我的DialogFragment类被调用。我希望通过这个DialogFragment设置的日期显示在按钮文本上。FindViewById无法被该类识别。

我发现了一个类似的问题,但我无法将其与我的情况联系起来。

代码:

  1. Button which calls the Dialogue fragment:

    public void datepicker(View v) {
        DialogFragment newFragment = new DatePickerFragment();
        newFragment.show(getFragmentManager(), "datePicker"); 
    }
    
  2. Code for dialogue fragment:

    public class DatePickerFragment extends DialogFragment implements
        DatePickerDialog.OnDateSetListener {
    
        @Override
        public Dialog onCreateDialog(Bundle savedInstanceSateate) {
    
            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(), this, year, month, day);
            }
    
            public void onDateSet(DatePicker view, int year, int month, int day) {
                // Do something with the date chosen
            }
        }
    }
    

你能展示一下代码,这样我们就知道它们有什么不同了吗? - wtsang02
现在没问题了。我是唯一一个在StackOverflow上发布代码时经历地狱的人吗? - krtkush
不,只是@api标记会破坏代码格式。 - wtsang02
好的!无论如何,@A--C的答案对我有效。 - krtkush
4个回答

10

在负责接收用户设置日期的DialogFragment方法中,执行以下操作:

Button activityButton = (Button)getActivity().findViewById(R.id.myButton);
activityButton.setText (myDate);

@K_K 我使用了getActivity()方法,该方法有一个公共的findViewById()方法。你需要使用getActivity()方法,因为你所修改的按钮是属于你的 Activity 布局的一部分,而不是你的 Fragment 的。 - A--C
这不是为了解耦DialogFragment和Activity而设计的。如果DialogFragment由没有id为myButton的按钮的Activity托管,会发生什么? - LHA
@LocHa 如果Activity没有这个id的按钮,当您尝试使用activityButton时,将抛出NullPointerException。对于附加到多个Activities的Fragment,更容易创建一个Listener类型接口。详见:http://developer.android.com/training/basics/fragments/communicating.html - A--C

3
创建日期选择器片段的类:
    public class SelectDateFragment extends DialogFragment implements
                                     DatePickerDialog.OnDateSetListener {
    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {

            Calendar now = Calendar.getInstance();
            year = now.get(Calendar.YEAR);
            month = now.get(Calendar.MONTH);
            day = now.get(Calendar.DATE);

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

    public void onDateSet(DatePicker view, int year, int month, int day) {
        orderDateEditText.setText(year + "-" + (month + 1) + "-" + day);
    }
}

点击 ImageButton 时,调用此 Fragment:

    /** Create DatePicker dialog on click of OrderDateEditText **/
   orderDatePickerButton.setOnClickListener(new OnClickListener() {
        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub
            DialogFragment newFragment = new SelectDateFragment();
            newFragment.show(getFragmentManager(), "DatePicker");
        }
    });

月份中加1,因为DatePicker默认将1月到12月的月份从0到11计算。

谢谢。


1

这里有一个好的模式可以遵循:

  1. 在您的对话框中创建一个监听器接口,以处理对话框中相关按钮的按下
  2. 在起始活动中实现它
  3. 当用户按下“确定”或“取消”时,调用监听器方法
  4. 在监听器的实现中执行所需的操作,以更新活动的视图

类似于以下内容:

class MyDialogFragment extends DialogFragment implements DialogInterface.OnClickListener {
  static interface Listener {
    void onOkay(MyObject result);
    void onCancel();
  }
  ...

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

    // set this as a listener for ok / cancel buttons
    return new AlertDialog.Builder(activity)...whatever...
        .setPositiveButton(R.string.ok, this)
        .setNegativeButton(R.string.cancel, this).create();
  }

  @Override
  public void onClick(DialogInterface dialog, int which) {
      if (which == DialogInterface.BUTTON_POSITIVE) {
          if (getActivity() instanceof Listener) {
              ((Listener)getActivity()).onOkay(...);
          }
      } else {
          if (getActivity() instanceof Listener) {
              ((Listener)getActivity()).onCancel();
          }
      }
  }
}

class MyActivity extends Activity implements MyDialogFragment.Listener {
  ...
  @Override
  public void onOkay(MyObject result) {
    // update activity view here with result
  }

  @Override
  public void onCancel() {
    // anything?
  }
}

如果您的情况下,传递到 onOkay() 方法中的 "result" 将是用户在对话框中选择的日期对象。

0
一个Fragment不是一个View。如果你想找到一个Fragment,请使用FragmentManager中的findFragmentById方法。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接