如何通过调用片段中的方法在MainActivity中实现接口?

时间:2016-08-12 13:58:48

标签: android android-fragments interface

我必须在MainActivity中实现一个接口,该接口在自定义适配器中定义。但是该接口方法的所有相关对象都在片段中定义。那么我如何在MainActivity和片段之间进行通信,以使接口的实现工作而不会得到空指针异常?

这是我必须实现的接口,它是在自定义适配器中定义的。

public interface UpdateMainClass{
        void updateItemList(int position);
        void updateListBackground(int position, boolean isChecked);
    }

在我的主要活动中,我重写了上述内容。

/**
     * <p>This method is used to remove the item from speicified position</p>
     * @param position location of the item to be removed
     */
    @Override
    public void updateItemList(int position) {
        myNewFragment.updateItemList(position);
    }

    /**
     * <p>Updates the background checkbox status in POJO class and helps to set the background color on long press.</p>
     * <p>Illegal state is checked to prevent changing of checkbox status while list is being scrolled.</p>
     * @param position position of the item in list where checkbox status is changed.
     * @param isChecked current status of the checkbox.
     */
    @Override
    public void updateListBackground(int position, boolean isChecked) {
        myNewFragment.updateListBackground(position, isChecked);
    }

这是我的Fragment类,我可以实际实现该方法。

/**
     * <p>This method is used to remove the item from speicified position</p>
     *
     * @param position location of the item to be removed
     */
    public void updateItemList(int position) {
        myArrayList.remove(position);
        mAdapter.notifyItemRemoved(position);
    }

    /**
     * <p>Updates the background checkbox status in POJO class and helps to set the background color on long press.</p>
     * <p>Illegal state is checked to prevent changing of checkbox status while list is being scrolled.</p>
     *
     * @param position  position of the item in list where checkbox status is changed.
     * @param isChecked current status of the checkbox.
     */
    public void updateListBackground(int position, boolean isChecked) {
        try {
            if (isChecked)
                myArrayList.get(position).setCompleted(1);
            else
                myArrayList.get(position).setCompleted(0);
            mAdapter.notifyItemChanged(position);
        } catch (IllegalStateException e) {
            //do nothing
        }
    }

这显然不起作用,我最终在我的片段类中的myArrayList.get(position)得到一个空指针异常。那么有更好的方法来编码吗?

1 个答案:

答案 0 :(得分:0)

不会那样。

首先,创建一个接口,该接口具有用于在片段和主机活动之间进行通信的方法。

其次,您在主机活动中实现该接口并执行业务逻辑。

第三,你在片段的onAttach()方法中获得了你的活动的回调:

@Override
public void onAttach(Activity activity) {
   super.onAttach(activity);

   try {
     callback = (UpdateMainClass) activity;
   } catch (ClassCastException e) {
     throw new ClassCastException(activity.toString()
            + " must implement UpdateMainClass");
   }
}

Forth,您可以通过activity的回调字段从您的片段调用这些接口方法,如:

callback.updateItemList(_data_);

这是Fragment -> Activity communication

如果要从主机活动访问片段的方法,您应该从FragmentManager中获取片段的引用。

最好的解决方案是使用EventBus库,如Otto,EventBus或RxBus。