Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/346.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 片段到活动通信_Java_Android_Android Fragments_Android Activity_Interface - Fatal编程技术网

Java 片段到活动通信

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

我会立即坦白承认我不理解接口。我相信我遵循了在中列出的流程。在“定义接口”部分中,我声明并定义了所需的接口NewDate:

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语句,这个片段的上下文就是它的活动。这并没有从我读过的片段到活动交流页面中体现出来。谢谢你的澄清。