【问题标题】:How to get the context of fragment before its view is created如何在创建视图之前获取片段的上下文
【发布时间】:2015-09-14 00:04:18
【问题描述】:

我正在使用 MainActivity 上的导航抽屉,然后我使用此导航抽屉来替换 MainActivity 容器中的不同片段。在片段中,我使用的是谷歌地图。在这个片段中,我还使用 Ion 库从服务器下载一些位置信息并在地图上显示它们。

导航抽屉项目是首页,朋友位置,关于我们

现在当我点击朋友位置时,我想在地图上画图钉,所以我是你 使用与主屏幕相同的主屏幕地图也显示地图。

我在朋友位置项目点击上所做的如下

myMapFragment = new MyMapFragment();

                        fragmentTransaction1.replace(R.id.frame, myMapFragment, "MyMapFragment").commit();
                        fragmentManager.executePendingTransactions();
                        myMapFragment.GetAllFriendsLocation("share",MainActivity.this);

所以 GetAllFriendsLocation 是那个片段中显示地图的方法,这个函数是从服务器下载位置信息,然后在地图上绘制图钉

这就是我的做法

 public void GetAllFriendsLocation(String type) {
        MainActivity.setOverflowButtonColor(getActivity(),2);
        if(cd.isConnectingToInternet()) {
            progressDialog.show();
            Ion.with(getActivity())
                    .load("http://myapi.com/data.php")...

但我在以下行收到 nulpointerException

Ion.with(getActivity()) .load("http://myapi.com/data.php").

似乎 getActivity 是空的,因为片段没有完全启动。

所以请给我建议,当它被初始化并准备好在屏幕上显示时,我如何调用片段方法,在它被初始化之后,该方法应该运行并从服务器下载。

或者我能想到的第二个是,在片段初始化之前,如何在 mainactivty 中获取上下文?

请帮帮我..

【问题讨论】:

  • 为什么不直接将应用上下文传递给 ion?
  • @bhargav 什么意思,请解释一下
  • getActivity().getApplicationContext(),这永远不会为空,Ion 使用上下文将其网络请求线程与其生命周期联系起来,因此通过传递 applicationCpntext() 唯一的区别是网络请求即使调用了活动 onDestroy(),线程也会运行,只要 applicationContext 仍然处于活动状态。
  • 我在调用片段函数时从 mainactivity 传递应用程序上下文,比如说 myMapFragment.GetAllFriendsLocation("locations",this.getApllicationContext) 并通过以下方式在 mapFragment 的函数中获取此上下文public static void GetAllFriendsLocation(String type, Context context) 但仍会在 Ion.with(context) 上获得空指针异常 ....................
  • 你不认为 mapfragment 没有完全初始化这就是我收到错误的原因吗?

标签: android android-fragments fragment


【解决方案1】:

尝试使用实例而不是构造函数来创建和使用片段。 在片段类本身中创建片段实例,如下所示:

public static MyMapFragment newInstance(Bundle bundle) {
    MyMapFragment fragment = new MyMapFragment ();

    fragment.setArguments(bundle);
    return fragment;
}

然后在你的活动中像这样使用它:

MyMapFragment fragment = MyMapFragment.getInstance(bundle);

其中 bundle 包含您可能希望发送到片段的任何内容。 这应该可以。

【讨论】:

  • myMapFragment = new MyMapFragment(); 替换为 MyMapFragment fragment = MyMapFragment.getInstance(bundle); 并将 getInstance() 函数粘贴到您的片段类中。如果不需要,请删除 bundle 参数。
【解决方案2】:

您应该使用 onCreate() 和 onViewCreated() 方法。

您在 onCreate() 方法中加载一个片段。并在 onViewCreated() 方法中调用方法。

【讨论】:

  • 你能告诉我如何在 onCreate 方法中加载片段吗?
【解决方案3】:

我觉得和这里android get activity returns null类似

我认为,在使用 getActivity 之前,您应该检查您的 Fragment 是否安全,例如:(推荐)

private boolean isSafe()
{
    if (this.isRemoving() || this.getActivity() == null || this.isDetached() || !this.isAdded()
                    || this.getView() == null)
    {
        return false;
    }

    return true;
}

或者像这样缓存你的活动

private Activity mActivity;

@Override
public void onAttach(Activity activity) {
    super.onAttach(activity);
    this.mActivity = activity;
}

【讨论】:

  • 我已经实现了这个,OnAttach 并在 Ion 中使用 mActivity,但它没有帮助
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-15
  • 2016-08-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多