【问题标题】:What is the best way to communication between fragments片段之间通信的最佳方式是什么
【发布时间】:2014-09-22 14:03:00
【问题描述】:

我有一个片段容器,里面有 3 个不同的片段,我想在 3 个片段之间通知消息

最好的方法是什么?

谢谢

【问题讨论】:

标签: android android-activity fragment


【解决方案1】:

最简单和最好的方法是使用一些事件总线库。它将使您的代码保持干净和片段、活动之间的松散耦合通信。

Otto 非常容易设置和使用。它来自广场。查看@http://square.github.io/otto/

http://corner.squareup.com/2012/07/otto.html 还会让您一睹它解决了什么问题。

【讨论】:

  • 如果它解决了您的问题,那么接受和投票的好习惯
【解决方案2】:

在 Activity 中保留一个公共变量(如果是小数据),或者在 Activity 中编写一个接口并在所有片段中实现它。并使用接口通过在其中编写方法来传递数据。

【讨论】:

  • 但是根据您的解决方案,这意味着我需要保存一个活动引用,并且它可能存在内存泄漏错误
【解决方案3】:

给你。这是进行片段活动通信的正确且完整的方式。片段片段通信应该通过控制它们的活动。我添加了相关接口,以onBackPress为例:

 public class BaseFragment extends Fragment implements BaseActivityDelegate {

    private BaseActivityInterface mActivity;

    @Override
    public void onActivityCreated(Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);

        if (mActivity != null) {
            mActivity.registerBaseActivityDelegate(this);
        }
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        if (mActivity != null) {
            mActivity.unregisterBaseActivityDelegate(this);
        }
    }

    @Override
    public void onAttach(Activity activity) {
        super.onAttach(activity);
        try {
            mActivity = (BaseActivityInterface)activity;
        } catch (ClassCastException e) {
            throw new ClassCastException(activity.toString() +" must implement BaseActivityInterface");
        }
    }

    @Override
    public void onDetach () {
        super.onDetach();
        mActivity = null;
    }

    /**
     * Override by sub-class in order to intercept the back press.
     *
     * @return true if the back press is consume by the fragment
     */
    @Override
    public boolean onBackPressed() {
        return false;
    }
}




public class BaseActivity extends FragmentActivity implements BaseActivityInterface {

    protected ArrayList<BaseActivityDelegate> mBaseActivityDelegates;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        this.mBaseActivityDelegates = new ArrayList<BaseActivityDelegate>();
    }

    @Override
    public void registerBaseActivityDelegate(BaseActivityDelegate delegate) {
        if (mBaseActivityDelegates != null) {
            mBaseActivityDelegates.add(delegate);
        }
    }

    @Override
    public void unregisterBaseActivityDelegate(BaseActivityDelegate delegate) {
        if (mBaseActivityDelegates != null) {
            mBaseActivityDelegates.remove(delegate);
        }
    }

    @Override
    public void onBackPressed() {
        if (mBaseActivityDelegates != null) {
            for (BaseActivityDelegate delegate : mBaseActivityDelegates) {
                if (delegate != null && delegate.onBackPressed()) {
                    // the delegate intercepted the back press event
                    return;
                }
            }
        }
        // back press was not intercepted, continue handling it
        super.onBackPressed();
    }
}


public interface BaseActivityDelegate {
    public boolean onBackPressed();
}

public interface BaseActivityInterface {
    public void registerBaseActivityDelegate(BaseActivityDelegate delegate);
    public void unregisterBaseActivityDelegate(BaseActivityDelegate delegate);

}

【讨论】:

    猜你喜欢
    • 2015-08-10
    • 1970-01-01
    • 1970-01-01
    • 2012-12-25
    • 1970-01-01
    • 1970-01-01
    • 2016-10-12
    • 2015-03-07
    • 1970-01-01
    相关资源
    最近更新 更多