【问题标题】:How to call the Function of the Fragment from the Main activity如何从主要活动中调用片段的功能
【发布时间】:2015-07-15 09:26:18
【问题描述】:

首先让我告诉你我想要做什么。 我有一个带有导航抽屉和一些片段类的活动。在活动恢复中,我调用了一个 MapFragment,我用它在谷歌地图上用蓝点向用户显示其当前位置。

这运行成功。

现在我想从导航抽屉中显示地图上的图钉,因此我正在调用用于从服务器下载图钉并在地图上显示它们的函数。该函数名为 GetAllPins ,我使用 Ion 库以下列方式执行此操作:

 public void GetAllPins() {

        progressDialog.show();
 Ion.with(getActivity())
                .load(MyServiceUrl)
                .progressHandler(new ProgressCallback() {
                    @Override
                    public void onProgress(long downloaded, long total) {
                        if (downloaded == total) {
                            progressDialog.dismiss();
                        }
                    }
                })
                .setMultipartParameter("name", "Stacy")
                .setMultipartParameter("latitude","18.92239u")
                .setMultipartParameter("longitude", "24.98329")
                .asJsonObject()
                .setCallback(new FutureCallback<JsonObject>() {
                    @Override
                    public void onCompleted(Exception e, JsonObject result) {
                        if (result == null) {
                            progressDialog.dismiss();
                            Toast.makeText(getActivity(), "Error in establishing connection with server", Toast.LENGTH_SHORT).show();

                        } else {
                            Toast.makeText(getActivity(), "Completed successfully", Toast.LENGTH_SHORT).show();
}
}
);
}

注意:当我在 MyMapFragment 的 onActivityCreated 方法中调用时,它工作正常并成功绘制引脚,但是当我尝试从 MainActivity 调用它时给我一个 NullpointerException。

在 MainActivity 中,我在 switch case 中调用它,因为我正在使用 SwitchCase 相应地导航到片段。

public void navigateToFragment(int pos) {

    FragmentManager fragmentManager = getSupportFragmentManager();
    fragmentManager.popBackStack(null, FragmentManager.POP_BACK_STACK_INCLUSIVE);
    FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
    final MyMapFragment myMapFragment = new MyMapFragment();
    switch (pos) {


        case R.id.home:
            if(!isFirstRun) {

                fragmentTransaction.replace(R.id.frame, myMapFragment, "MapFragment").addToBackStack("MapFragment").commit();
            }else{
                isFirstRun=false;
            }
            //
            break;

        case R.id.mark_pin:
            isFirstRun=false;
            if (myMapFragment!=null){
           myMapFragment.GetAllPins();}
                        break;
                    }

所以我在 ProgressDialog 上收到 Null pointerException ,但如果我注释掉以下错误。

 FATAL EXCEPTION: main
java.lang.NullPointerException: Can not pass null context in to retrieve ion instance

告诉我如何从主活动中调用此函数以使用该 MyMapFragment 在地图上显示图钉。 我不想制作不同的地图片段来显示上面的图钉。请帮我。

【问题讨论】:

  • 将参数上下文添加到方法并在使用不同上下文调用时传递它
  • 它给了我同样的 NullpointerException 错误
  • 能否展开 logcat 输出并显示代码在哪几行中断
  • Ion.with(context) .... 在这一行 .... 当我做 public void GetAllPins(Context context) {
  • 在调用方法时尝试使用Log.e("Context", "Context: " + context);,看看何时尝试传入空上下文

标签: android google-maps android-fragments


【解决方案1】:

从日志本身,可以清楚地看出调用上下文的错误...从片段中,当您调用 getActivity() 时,您将获得正确的上下文...但是当您从 MainActivity 调用相同的方法时, getActivity() 将返回 null...所以最好将上下文作为参数添加到函数中,当从片段调用时,通过传递 getActivity() 来调用它,并通过传递 'this' 从 MainActivity 调用它...

我没有测试它...但它应该可以工作...

像这样从 MainActivity 调用函数,fragment.GetAllPins(MainActivity.this);

当你从fragment调用时,应该是这样的,GetAllPins(getActivity());

【讨论】:

  • 它给了我同样的 nullpointerException 错误,我已经知道我必须传递上下文,我做到了,它给了我 nullpointerException
  • getAllPins 方法在 Mapfragment 中如何,MainActivity.this 可以在其中工作吗?
  • Nop... 当你从fragment调用时,应该是这样的,GetAllPins(getActivity());
  • 在尝试从 Fragment 访问 Activity 之前,还应确保 Fragment 已附加到 Activity。
  • 是的,它已附加,因为我可以在上面看到我的位置,地图已初始化,所有事情都已完成
猜你喜欢
  • 2022-01-25
  • 2016-06-15
  • 1970-01-01
  • 2016-08-17
  • 1970-01-01
  • 1970-01-01
  • 2023-03-24
  • 2021-10-13
  • 2021-03-04
相关资源
最近更新 更多