【问题标题】:How to communicate between a Fragment and an Activity to which it is not attached?如何在 Fragment 和未附加的 Activity 之间进行通信?
【发布时间】:2015-11-12 13:38:51
【问题描述】:

我想在片段上的onClick 事件之后对 Activity 执行一些操作。

我只发现了如何使用getActivity() 在片段和片段附加到的 Activity 之间进行通信,这不是我的情况。

【问题讨论】:

  • 您可以使用服务或广播接收器,例如
  • 只需使用带有 Bundle 参数的 Intent。 2 分钟内完成。

标签: android fragment communication android-fragmentactivity


【解决方案1】:

对于一个超级简单的解决方案,使用片段来触发活动类中的方法,该方法使用意图来调用所需的活动。

编辑:查看下面的 cmets 以获得更多帮助。

【讨论】:

  • 您甚至可以从片段中发送 Intent。
  • @JacksOnF1re Ok 不知道,但这会让事情变得更容易。
  • 有趣的是,它在内部使用附加的活动来开始发送意图:)
  • 那么这个问题的意义何在?如果它像使用简单的意图一样简单。当然,如果您想与之交互,那么您可以发送一个额外的数据布尔值来触发该方法。为什么这个超级复杂的方法被新浪 KH 称为最简单的方法?没有冒犯新浪KH,只是说。
  • 没有线索。您的回答也是我推荐的方式。
【解决方案2】:

正如其他人所说,您必须使用广播或服务.....

但是:

最简单快捷的方法是:

创建这两个类::

全局变量:

public class Globals {

private static final Globals instance = new Globals();
private GlobalVariables globalVariables = new GlobalVariables();

private Globals() {
}

public static Globals getInstance() {
    return instance;
}

public GlobalVariables getValue() {
    return globalVariables;
}

}

和全局变量::

public class GlobalVariables {
    public Activity receiverActivity;
}

不在接收器活动中::

Globals.getInstance().getValue().receiverActivity = this;

现在发件人可以做任何事情了!例如从接收者活动中调用公共方法:

Globals.getInstance().getValue().doSomething();

基本不推荐,但效果很好。 :D

【讨论】:

  • “基本上不推荐 [..]” 对 - 那就不要这样做。使用广播接收器。全局变量...不要!
【解决方案3】:

您必须创建一个您的活动实现的接口。 BroadcastReceiver 确实有其优势,但使用回调解决这个问题是直接且容易做到的。

这是一个例子。我们给 Activity 一个 String 并让它返回一个 Integer:

public interface IMyStringListener{
public Integer computeSomething(String myString);
}

接口可以在片段或单独的文件中定义。接下来你的 Activity 实现接口。

public class MyActivity implements IMyStringListener{

 @Override
 public Integer computeSomething(String myString){
   /** Do something with the string and return your Integer instead of 0 **/ 
   return 0;
  }

}

然后在您的片段中,您将有一个 MyStringListener 变量,您将在片段的 onAttach(Activity activity) 方法中设置侦听器。

public class MyFragment {

    private MyStringListener listener;

    @Override
    public void onAttach(Activity activity) {
        super.onAttach(activity);
        try {
            listener = (MyStringListener) activity;
        } catch (ClassCastException castException) {
            /** The activity does not implement the listener. */
        }
    }

}

【讨论】:

  • OP说他的fragment没有附加到他需要通信的activity,也没有其他连接。
  • Fragment 可以与任何 Activity 通信,只要 Activity 实现了接口。它将您的 Fragments 与 Activity 的特定实现分离。
  • 它只是一个接口,因此你需要一个接口的引用,OP在他的实现中没有没有
  • this: "listener = (MyStringListener) 活动;"不会工作。因为onAttach中的activity不是应该调用的activity。
【解决方案4】:

使用委托: 一个 createView 触发委托,并在活动中创建监听器

试试这个: Fragment-Fragment communication in Android

只是委托函数

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-05
    相关资源
    最近更新 更多