【问题标题】:Create an interface to communicate with another fragment创建一个接口来与另一个 Fragment 通信
【发布时间】:2017-02-13 02:45:14
【问题描述】:

我创建了一个界面,因此当我在 FragmentA 上按下 TextView 时,我可以在 FragmentB 上设置文本。有些东西不起作用,我无法弄清楚。

我创建了一个名为 Communicator 的界面:

public interface Communicator {
void respond(String data);

}

在 FragmentA 上,我在名为 Communcator 的接口上设置了一个引用,并在 TextView 上设置了一个 OnClickListener:

Communicator comm;

homeTextView.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            comm.respond("Trying to set text on FragmentB from here");
        }
    });

FragmentB,设置我改变文本的方法:

 public void setText(final String data) {
    startTripTxt.setText(data);
}

最后在 MainActivity 中我实现了接口.. 我认为这是我做错了什么:

 @Override
public void respond(String data) {

    getSupportFragmentManager().beginTransaction()
            .replace(R.id.container_main, new FragmentB(), "fragment2").addToBackStack(null).commit();

    FragmentB fragmentB= (FragmentB) getSupportFragmentManager().findFragmentByTag("fragment2");
    if (fragmentB != null) {
        fragmentB.setText(data);
    }


}

片段 2 加载,但文本为空。

【问题讨论】:

  • 好吧。我认为问题出在MainActivity中的响应函数当你调用commit()时,它没有在UI线程中运行,需要时间来完成它,然后你声明的fragmentB将为null。

标签: android android-fragments interface


【解决方案1】:

片段 2 加载,但文本为空。

您实现Communicator 可以,但是您调用FragmentB 和传递数据的方式不行。这就是您无法从FragmentB 获取文本的原因。向FragmentB发送数据的正确方式应该是这样的:

public static FragmentB createInstance(String data) {
        FragmentB fragment = new FragmentB();
        Bundle bundle = new Bundle();
        bundle.putString("data", data);
        fragment.setArguments(bundle);
        return fragment;
    }

您可以通过以下方式从 FragmentB 获取数据:

Bundle bundle = getArguments();
        if (bundle != null) {
             String data = bundle.getString("data");
        }

【讨论】:

    【解决方案2】:

    看起来你声明了fragmentB之后,你的意思是在那个fragment上设置文本。您正在调用 trainFinderFragment.setText()。这是你的问题吗?

    FragmentB fragmentB= (FragmentB) getSupportFragmentManager().findFragmentByTag("fragment2");
    if (fragmentB != null) {
        fragmentB.setText(data);
    }
    

    【讨论】:

    • 我已经编辑了我的问题。 FragmentB其实叫作TrainFinderFragment,不过这里重命名为FragmentB,这样大家比较清楚。
    • 哦,好吧。是的,鉴于您的编辑,您应该接受 RoShan 的上述建议。使用捆绑包传入文本。
    猜你喜欢
    • 1970-01-01
    • 2013-10-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多