Java 片段到活动通信
我会立即坦白承认我不理解接口。我相信我遵循了在中列出的流程。在“定义接口”部分中,我声明并定义了所需的接口NewDate:Java 片段到活动通信,java,android,android-fragments,android-activity,interface,Java,Android,Android Fragments,Android Activity,Interface,我会立即坦白承认我不理解接口。我相信我遵循了在中列出的流程。在“定义接口”部分中,我声明并定义了所需的接口NewDate: public class DatePickerFragment extends DialogFragment { NewDate mCallback; private static final String TAG = "DatePickerFragment"; public Date date; private DatePicker mD
public class DatePickerFragment extends DialogFragment {
NewDate mCallback;
private static final String TAG = "DatePickerFragment";
public Date date;
private DatePicker mDatePicker;
//interface implemented by DatePicker Activity
public interface NewDate{
public void UpdateDate(Date date);
}
我在调用活动中实现它,如“实现接口”一节所述:
public class DatePickerActivity extends SingleFragmentActivity implements DatePickerFragment.NewDate {
private final String TAG = "DatePickerActivity";
private static final int REQUEST_DATE = 0;
@Override
protected Fragment createFragment() {
Log.d(TAG, "Entered createFragment");
Intent intent = getIntent();
Date date = (Date) intent.getSerializableExtra(EXTRA_DATE);
Log.d(TAG,"date = " + date);
UUID id = (UUID) intent.getSerializableExtra(EXTRA_ID);
Log.d(TAG, "crime ID is " + id);
return DatePickerFragment.newInstance(date);
}
public void UpdateDate(Date date) {
Log.d(TAG, "Entered UpdateDate");
Log.d(TAG, "Date is " + date);
Toast.makeText(getApplicationContext(),"Clicked OK to update date!", Toast.LENGTH_SHORT).show();
return;
}
}
忽略返回日期可能是错误的这一事实,问题是代码从来没有在这里出现过
如图所示,当用户单击OK按钮将事件传递给父DatePickerActivity时,将调用DatePickerFragment中的以下方法,当DatePickerFragment连接到DatePickerActivity时,将执行OnAtach方法:
public class DatePickerFragment extends DialogFragment {
...
private void sendResult(int resultCode, Date date){
Log.d(TAG, "Entered sendResult");
Log.d(TAG, "resultCode is " + resultCode);
Log.d(TAG, "Date passed in to sendResult is " + date);
if (getTargetFragment() == null) {
if (mCallback != null){
mCallback.UpdateDate(date);
return;
} else {
Log.d(TAG, "mCallback is null");
return;
}
...
@Override
public void onAttach(Context context) {
super.onAttach(context);
Log.d(TAG, "Entered onAttach");
try {
Log.d(TAG, "Trying to create new mCallback");
mCallback = (NewDate) date;
Log.d(TAG, "mCallback is " + mCallback);
} catch (ClassCastException e){
throw new ClassCastException(date.toString() + " must implement NewDate");
}
以下是在我运行代码后运行代码所产生的LogCat输出:
DatePickerActivity: Entered createFragment
DatePickerActivity: date = Mon Oct 23 15:24:38 CDT 2017
DatePickerActivity: crime ID is a205fce6-9a38-4c40-9dce-ba651c281752
DatePickerFragment: Entered newInstance
DatePickerFragment: Date is Mon Oct 23 15:24:38 CDT 2017
DatePickerFragment: id is 16842960
DatePickerFragment: Entered onAttach
DatePickerFragment: Trying to create new mCallback
DatePickerFragment: mCallback is null
DatePickerFragment: Entered onCreateView
DatePickerFragment: Date passed to DatePickerFragment is: Mon Oct 23 15:24:38 CDT 2017
DatePickerFragment: Set date in calendar
DatePickerFragment: year is 2017
DatePickerFragment: month is 9
DatePickerFragment: day is 23
DatePickerFragment: Entered onActivityCreated
DatePickerFragment: Entered onStart
DatePickerFragment: Entered onResume
DatePickerFragment: You clicked OK!
DatePickerFragment: onClick: year is 2017
DatePickerFragment: onClick: month is 9
DatePickerFragment: onClick: day is 31
DatePickerFragment: Dialog date is Tue Oct 31 00:00:00 CDT 2017
DatePickerFragment: Entered sendResult
DatePickerFragment: resultCode is -1
DatePickerFragment: Date passed in to sendResult is Tue Oct 31 00:00:00 CDT 2017
DatePickerFragment: mCallback is null
如果对齐代码的Log.d消息,您会注意到DatePickerActivity中的UpdateDate永远不会被访问,因为mCallback为null。我原以为在onAttach之后mCallback不会为null,但它仍然为null。我读过其他网页,比如和,这让我觉得我已经满足了接口要求。然而,我显然没有
那么,有人可以解释我在这些网页上遗漏了什么,或者提供一个链接来解释我遗漏了什么吗?您需要将
mCallback
分配给承载片段并实现DatePickerFragment.NewDate
界面的活动:
@Override
public void onAttach(Context context) {
super.onAttach(context);
Log.d(TAG, "Entered onAttach");
try {
Log.d(TAG, "Trying to create new mCallback");
//modified:
if (context instanceof DatePickerActivity){
mCallback = (DatePickerActivity) context;
}
Log.d(TAG, "mCallback is " + mCallback);
} catch (ClassCastException e){
throw new ClassCastException(date.toString() + " must implement NewDate");
}
}
您需要将
mCallback
分配给承载片段并实现DatePickerFragment.NewDate
接口的活动:
@Override
public void onAttach(Context context) {
super.onAttach(context);
Log.d(TAG, "Entered onAttach");
try {
Log.d(TAG, "Trying to create new mCallback");
//modified:
if (context instanceof DatePickerActivity){
mCallback = (DatePickerActivity) context;
}
Log.d(TAG, "mCallback is " + mCallback);
} catch (ClassCastException e){
throw new ClassCastException(date.toString() + " must implement NewDate");
}
}
丹尼尔,你真是个天才!成功了。然而,在我读到的这篇文章中,我没有看到任何能让我想到你的建议的东西。我需要了解接口。检查已设置!你的建议告诉我一些我需要理解的事情,比如检查上下文。现在我看到了你的if语句,这个片段的上下文就是它的活动。这并没有从我读过的片段到活动交流页面中体现出来。谢谢你的澄清。丹尼尔,你是个天才!成功了。然而,在我读到的这篇文章中,我没有看到任何能让我想到你的建议的东西。我需要了解接口。检查已设置!你的建议告诉我一些我需要理解的事情,比如检查上下文。现在我看到了你的if语句,这个片段的上下文就是它的活动。这并没有从我读过的片段到活动交流页面中体现出来。谢谢你的澄清。