新Activity中fragment的接口第一次返回null

问题描述 投票:0回答:1

我尝试更改 this 答案以将数据从片段发送到新活动。但是当活动开始时

listener
会变为空。

我检查过,在第一次活动开始后,侦听器受到重视并且工作正常。 我知道有更好的方法在片段和活动之间进行通信,但为了学习,我想这样做。谢谢。

地图片段:

private static MapsFragment.onMySignalListener listener;
public void switchWindow() {
    if (listener == null)
        Toast.makeText(getContext(), "Problem", Toast.LENGTH_LONG).show();

    if(listener != null){
        listener.onMySignal(paramImageUrl);
    }
}
public interface onMySignalListener {
    void onMySignal(String image_url);
}
public static void setOnMySignalListener(MapsFragment.onMySignalListener listener) {
    MapsFragment.listener = listener;
}

目的地活动:

protected void onCreate(Bundle savedInstanceState) {
.
MapsFragment.setOnMySignalListener(new MapsFragment.onMySignalListener() {
        @Override
        public void onMySignal(String image_url) {
            ImageUrl = image_url;
        }
    });
}

在片段中按钮侦听器的某处我调用此方法

switchWindow();
java android android-fragments android-activity
1个回答
0
投票

要解决此问题,您可以在 Activity 的

onCreate()
方法中初始化侦听器,而不是在片段的
onCreateView()
方法中初始化。

试试这个

public class DestinationActivity extends AppCompatActivity {

    private static MapsFragment.onMySignalListener listener;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_destination);

        // Initialize the listener.
        listener = new MapsFragment.onMySignalListener() {
            @Override
            public void onMySignal(String image_url) {
                ImageUrl = image_url;
            }
        };
    }

    // ...
}

在 Activity 的 onCreate() 方法中初始化侦听器后,您可以使用 setter 方法将其传递给片段。

public class MapsFragment extends Fragment {

    private static onMySignalListener listener;

    public static void setOnMySignalListener(onMySignalListener listener) {
        MapsFragment.listener = listener;
    }

    // ...

    public void switchWindow() {
        if (listener == null)
            Toast.makeText(getContext(), "Problem", Toast.LENGTH_LONG).show();

        if (listener != null) {
            listener.onMySignal(paramImageUrl);
        }
    }

    // ...
}
© www.soinside.com 2019 - 2024. All rights reserved.