【问题标题】:How to implement an interface in Fragment from a non parent Activity?如何从非父 Activity 在 Fragment 中实现接口?
【发布时间】:2018-02-18 05:45:56
【问题描述】:

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

这是我的基本设置

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(); 上崩溃,因为由于某种原因,我的侦听器从未正确设置。这样做的正确方法是什么?

【问题讨论】:

  • 我认为你必须颠倒你的逻辑。
  • @Mr.Hyde 该链接用于反向
  • 我想在fragment中实现接口而不是在activity中
  • @TheQ 所以请更改问题的标题。

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


【解决方案1】:

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

 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进行通信。

【讨论】:

  • 我的应用程序在我覆盖 onActivityCreated 时崩溃。我有点不清楚,Activity1不是Fragment的父级,Activity1和Fragment是完全分开的
  • 在我的代码中注意,我使用意图来启动 Activity1
  • 这就是我首先提到的。您只能从 fragment 访问父活动。所以接受它,你的问题是误导性的。无论如何,您可以使用LocalBroadcast 来实现此目的。
  • 你做得很好,我会努力跟上你的榜样。
【解决方案2】:

首先创建一个这样的接口:

public interface Listener{ void doSomething() }

然后在你的activity中实现这个接口。

而且还要加

Listener listener

在您的片段中 并且在片段的 onAttach 方法中使用这个

listener=(Listener)activity

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-11-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多