片段到活动通信 [英] Fragment to Activity Communications

查看:104
本文介绍了片段到活动通信的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我承认我不懂接口,我会马上来。我相信我遵循 https://developer.android中规定的流程。 COM /培训/基础知识/片段/ communicating.html 。在定义接口部分,我声明并定义所需的接口NewDate:

I will come clean immediately by admitting that I don't understand Interfaces. I believe that I followed the process laid out in https://developer.android.com/training/basics/fragments/communicating.html. In section Define an Interface, I declare and define the required interface 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);
    }

我在调用Activity中实现它,如实现接口:

I implement it in the calling Activity as discussed in section Implement the Interface:

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;
    }
}

忽略返回日期可能有误的事实,问题是代码永远不会在这里。

Ignore the fact that returning date might be wrong, the problem is that the code never makes it here.

如图所示,当用户单击确定按钮将事件传递给父DatePickerActivity时,将调用DatePickerFragment中的以下方法。当DatePickerFragment附加到DatePickerActivity时执行onAttach方法:

As shown the following method in DatePickerFragment is called when the user clicks the OK button to deliver the event to the parent DatePickerActivity and the onAttach method is performed when the DatePickerFragment attaches to DatePickerActivity:

    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输出代码:

The following is the LogCat output as a result of the code running after I run the code:

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。我读过其他网页,例如 http:// simpledeveloper .com /如何在片段和活动之间进行通信/ http://techblogon.com/communication-between-activity-and-fragment-example/ ,这让我觉得我已经满足了接口要求。但是,我显然没有。

If you align the code's Log.d messages, you'll note that UpdateDate in DatePickerActivity is never accessed because mCallback is null. I thought that mCallback would not be null after onAttach, but it is still null. I've read other web pages, such as http://simpledeveloper.com/how-to-communicate-between-fragments-and-activities/ and http://techblogon.com/communication-between-activity-and-fragment-example/, that make me think that I've fulfilled the Interface requirements. However, I obviously haven't.

那么,任何人都可以解释我在这些网页上遗漏的内容,或提供一个解释我缺少的内容的链接吗?

So, can anyone explain either what I missed on those web pages or provide a link to one that explains what I'm missing?

推荐答案

您需要将 mCallback 分配给托管您片段的活动并实现 DatePickerFragment.NewDate 界面:

You need to assign mCallback to the activity that hosts your fragment and implements the DatePickerFragment.NewDate interface:

@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");
    }
}

这篇关于片段到活动通信的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆