如何调用在Activity中扩展DialogFragment的类的成员函数

时间:2016-12-24 16:41:49

标签: java android android-dialogfragment

我编写了自定义 DatePickerDialog ,它扩展了 DialogFragment 并实现了DatePickerDialog.OnDateSetListener

public class DatePickerFragment extends DialogFragment implements DatePickerDialog.OnDateSetListener {

  @Override
  public Dialog onCreateDialog(Bundle savedInstanceState) {
    DatePickerDialog dpd = new DatePickerDialog(getActivity(),
                R.style.MyDialogTheme, this, year, month, day);
    return dpd;
  }

  public void onDateSet(DatePicker view, int year, int month, int day) {

  }

  // own  methods
  String getFormattedDate() {
  }
}

我在MainActivity中调用了这个片段。

public class Booking_activity extends AppCompatActivity implements View.OnClickListener {

  public void onClick(View view) {
    if (view == imgView_from) {
      // Initialize a new date picker dialog fragment
      DialogFragment dFragment = new DatePickerFragment();
      // Show the date picker dialog fragment
      dFragment.show(getFragmentManager(), "Date Picker");

      // error 
      dFragment.getFormattedDate();
    } 
  } 
}

5 个答案:

答案 0 :(得分:2)

发生错误是因为您尝试从 DialogFragment 访问无效方法。您需要使用以下命令创建DatePickerFragment:

DatePickerFragment dFragment = new DatePickerFragment();

或者施展它:

DialogFragment dFragment = new DatePickerFragment();
((DatePickerDialog)dFragment).getFormattedDate();

主要缺陷 是,您尝试在getFormattedDate() method对象完成实例化之前访问dFragment。请记住,show()是异步调用。

因此,当Booking_activity已完成实例化时,您需要通知dFragment活动。您可以使用它的接口。如下所示:

  1. 在DatePickerFragment中,添加interface:

    public class DatePickerFragment extends DialogFragment implements DatePickerDialog.OnDateSetListener {
    
      private DatePickerListener mListener;
    
      public interface DatePickerListener {
        void onDialogFinishInitialized();
      }
    
      @Override
      public Dialog onCreateDialog(Bundle savedInstanceState) {
        DatePickerDialog dpd = new DatePickerDialog(getActivity(),
                R.style.MyDialogTheme, this, year, month, day);
    
        // you need to inform the activity when Dialog has finish
        // initialized.
        mListener.onDialogFinishInitialized();
    
        return dpd;
      }
    
      ...
    
      // Need to add the activity as the listener.
      @Override 
      public void onAttach(Activity activity) {
        super.onAttach(activity);
        // This makes sure that the container activity has implemented
        // the listener interface. If not, it throws an exception
        try {
          mListener = (DatePickerListener) activity;
        } catch (ClassCastException e) {
          throw new ClassCastException(activity.toString() + " must implement DatePickerListener");
        }
      }
    
      ...
    
    }
    
  2. 在您的Activity中实现界面并调用getFormattedDate()方法:

    public class Booking_activity extends AppCompatActivity
    implements View.OnClickListener, DatePickerFragment.DatePickerListener {
      ...
      private DatePickerFragment dFragment;
      ...
      @Override
      public void onDialogFinishInitialized() {
        // You can call the method here now
        dFragment.getFormattedDate();
      }
      ...
    }
    

答案 1 :(得分:1)

您需要使用以下内容初始化新的日期选择器对话框片段:

DatePickerFragment dFragment = new DatePickerFragment();

如下面的代码所示:

public class Booking_activity extends AppCompatActivity implements View.OnClickListener {
  public void onClick(View view) {
    if (view == imgView_from) {

      // Initialize a new date picker dialog fragment
      DatePickerFragment dFragment = new DatePickerFragment(); // Changed this

      // Show the date picker dialog fragment
      dFragment.show(getFragmentManager(), "Date Picker");

      // error 
        dFragment.getFormattedDate();
    } 
  }
}

答案 2 :(得分:0)

您可以通过简单地转换对象来调用成员函数,如下所示

((DatePickerDialog)dFragment).getFormattedDate();

答案 3 :(得分:0)

将您的函数getFormattedDate访问模式设置为 public ,如下所示

  public String getFormattedDate() {
        }

将解决您的问题。

答案 4 :(得分:0)

所选解决方案运行良好,但我想指出onAttach()函数已弃用。我在这里找到了一些解决方案:Android Fragment onAttach() deprecated

我认为最受欢迎的答案是:

@Override
public void onAttach(Context context) {
    super.onAttach(context);
    activity = getActivity();
}

他们正在将onAtach(活动活动)更改为onAttach(上下文环境)。