Android 将变量值从活动传递到片段时获取空数据

Android 将变量值从活动传递到片段时获取空数据,android,android-fragments,Android,Android Fragments,我试图将变量locDistance值传递给片段。我在活动中尝试了以下代码: protected void onPostExecute(Double distance) { locDistance = distance; Bundle bundle = new Bundle(); bundle.putDouble("distance", locDistance ); // Fragment class

我试图将变量
locDistance
值传递给片段。我在活动中尝试了以下代码:

protected void onPostExecute(Double distance) {
            locDistance = distance;

            Bundle bundle = new Bundle();
            bundle.putDouble("distance", locDistance );
            // Fragment class Arguments
            Fragment obj = new Fragment();
            obj.setArguments(bundle);
        }
然后在
onCreate()
中按如下方式获取片段中的值:


但我得到的值是0.0。任何帮助都将不胜感激。

对于在创建片段的新实例时传递值,我建议您使用工厂模式。要了解更多关于工厂模式的信息,只需谷歌一下,你就会得到很多信息。目前,您可以尝试以下步骤:

在片段中创建一个静态方法。像这样

private double locDistance = 0.0;
public static Fragment newInstance(double locDistance) {
    Fragment fragment = new Fragment();
    fragment.locDistance = locDistance;
    return fragment;
}  

public double getLocDistance(){
    return this.locDistance;
}
protected void onPostExecute(Double distance) {
    locDistance = distance;
    Fragment obj = Fragment.newInstance(locDistance);
}  
Double distance = obj.getLocDistance();
然后像这样修改代码

private double locDistance = 0.0;
public static Fragment newInstance(double locDistance) {
    Fragment fragment = new Fragment();
    fragment.locDistance = locDistance;
    return fragment;
}  

public double getLocDistance(){
    return this.locDistance;
}
protected void onPostExecute(Double distance) {
    locDistance = distance;
    Fragment obj = Fragment.newInstance(locDistance);
}  
Double distance = obj.getLocDistance();
现在您可以像这样检索locDistance值

private double locDistance = 0.0;
public static Fragment newInstance(double locDistance) {
    Fragment fragment = new Fragment();
    fragment.locDistance = locDistance;
    return fragment;
}  

public double getLocDistance(){
    return this.locDistance;
}
protected void onPostExecute(Double distance) {
    locDistance = distance;
    Fragment obj = Fragment.newInstance(locDistance);
}  
Double distance = obj.getLocDistance();
然后在onCreate()内按如下方式获取片段中的值:

onCreate()
永远不会使用您显示的代码调用。片段的无参数构造函数为

这段代码创建了一个全新的片段,不会将任何内容传递给任何现有片段

如果您希望将数据从AsyncTask传递回其他类,最好使用回调侦听器实现


当然,您可以在任何地方实现侦听器,但是通过传回活动,您可以将数据发送到某个现有片段中,而不是尝试创建一个新片段

因为它是不同的片段实例(就像在您的代码中,除了设置参数外,您对
obj
不做任何操作),我如何传递值!!??你过得很好。你在这里制造了一个不同的片段。在
onPostExecute
的末尾,
obj
被垃圾收集并销毁。参数是将数据传递给片段而不是字段的正确方法。这是一个有争议的问题。我个人认为,字段更好,因为参数键是简单的字符串而不是强类型对象,所以您必须记住参数键的确切名称和拼写,无需IDE帮助。我愿意接受这样的建议:静态构造函数是否被视为工厂模式?无论如何,片段可以在旋转时重新创建,然后字段被清空,这就是为什么参数是首选的。这是一个要点,但我使用setRetainInstance(true);用于保留有关旋转的数据。这有什么坏处吗?工厂模式是Java中最常用的设计模式之一。你可以在网上得到很多信息,顺便说一句,我不是这方面的专家。我在大学里学过工厂模式,这不是你要展示的。这只是一个静态构造函数。你自己看看。它“处理创建对象的问题,而不必指定要创建的对象的确切类别。”。。。您指定的是其自身中的确切类,因此不是工厂。无论如何,保留片段会导致内存泄漏,这是解决一个简单问题的一种方法