如何从非父Activity中实现Fragment中的接口?

时间:2018-02-18 05:45:56

标签: android android-fragments android-activity interface callback

我还没有在堆栈的任何地方找到明确的解决方案。

这是我的基本设置

public class Activity1 extends AppCompatActivity
{
    private OnAttributesUpdatedListener onAttributesUpdatedListener;

    public interface OnAttributesUpdatedListener
    {
        public void onAttributesUpdated();
    }

    public void setTargetFragment(Fragment fragment)
    {
        this.onAttributesUpdatedListener = (OnAttributesUpdatedListener) fragment;
    }

    private void whenFinishedSomethingCallback()
    {
        onAttributesUpdatedListener.onAttributesUpdated();
    }
}


public class Fragment1 extends Fragment implements Activity1.OnAttributesUpdatedListener
{
     button.setOnClickListener(new View.OnClickListener()
        {
            @Override
            public void onClick(View view) {
                if(rivalButtonClick == 0)
                {
                    Activity1 activity1 = new Activity1();
                    activity1.setTargetFragment(Fragment1.this);
                    startActivity(new Intent(getActivity(), activity1.getClass()));
                }
            }
        });
}

我得到一个空指针异常并崩溃:onAttributesUpdatedListener.onAttributesUpdated();因为某些原因我的监听器永远不会被正确设置。这样做的正确方法是什么?

2 个答案:

答案 0 :(得分:0)

只有当Desired onCreatView()是该特定片段的父onActivityCreated()时,您才需要在片段Activity的开头或Activity中设置侦听器。以下是一个例子。

 public class Activity1 extends AppCompatActivity {
    private OnAttributesUpdatedListener onAttributesUpdatedListener;
    public interface OnAttributesUpdatedListener {
        public void onAttributesUpdated();
    }

    public void setListener(OnAttributesUpdatedListener onAttributesUpdatedListener) {
        this.onAttributesUpdatedListener = onAttributesUpdatedListener;
    }

    private void whenFinishedSomethingCallback() {
        if(onAttributesUpdatedListener!=null)
        onAttributesUpdatedListener.onAttributesUpdated();
    }
}


 public class Fragment1 extends Fragment implements Activity1.OnAttributesUpdatedListener
{
    @Override
    public void onAttributesUpdated() {
        // Do your stuff here
    }
    @Override
    public void onActivityCreated(@Nullable Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
        ((Activity1)getActivity()).setListener(this);
    }
}

阅读片段生命周期以使用getActivity()。片段被销毁时也会删除监听器。

如果其他Fragment中存在Activity,请使用LocalBroadcastManager进行通信。

答案 1 :(得分:0)

首先创建一个这样的界面:

public interface Listener{ void doSomething() }

然后在您的活动中实现此界面。

并添加

Listener listener

在你的片段中 并且在onAttach方法中使用此片段

listener=(Listener)activity

然后在需要时调用侦听器。