【问题标题】:getActivity from fragment inside View pager return null从视图寻呼机中的片段获取活动返回 null
【发布时间】:2015-12-08 13:34:12
【问题描述】:

我在 Fragment Activity 中有一个 View pager,而 View pager 在活动开始时包含两个片段,我有一个休息请求,当我得到响应时,我想更新每个片段内部和每个片段中的视图我正在使用 getActivity 但我的问题是我总是在平板设备上的 getActivity 上出现空指针异常,但我在手机上没有遇到这个问题

那是我的寻呼机适配器

public class Guide_ViewPager_adapter extends FragmentStatePagerAdapter {
    private Guides_fragment guide_frag = new Guides_fragment();
    private Maps_fragment maps_frag = new Maps_fragment();

    public Guide_ViewPager_adapter(FragmentManager fm){
        super(fm);
    }

    @Override
    public Fragment getItem(int position) {
        switch (position) {
            case 0:
                return guide_frag;
            case 1:
                return maps_frag;
        }
        return  null;

    }

    @Override
    public int getCount() {
        return 2;
    }
}

LogCat sn-p:

致命异常:主要 进程:android.vi.com.vad,PID:9554 java.lang.NullPointerException 在 android.vi.com.vad.Guides_fragment.update(Guides_fragment.java:138) 在 android.vi.com.vad.Guide_activity$GuideTask.onPostExecute(Guide_activity.java:213) 在 android.vi.com.vad.Guide_activity$GuideTask.onPostExecute(Guide_activity.java:165) 在 android.os.AsyncTask.finish(AsyncTask.java:632) 在 android.os.AsyncTask.access$600(AsyncTask.java:177) 在 android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:645) 在 android.os.Handler.dispatchMessage(Handler.java:102) 在 android.os.Looper.loop(Looper.java:149) 在 android.app.ActivityThread.main(ActivityThread.java:5234) 在 java.lang.reflect.Method.invokeNative(Native Method) 在 java.lang.reflect.Method.invoke(Method.java:515) 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:609) 在 dalvik.system.NativeStart.main(Native Method)

这是我在加载数据时从活动内部调用它的方法

public void update(String result) {
    if (animation != null) {
        animation.reset();
        animation.cancel();
    }
    if (loaderImage != null) {
        loaderImage.clearAnimation();
        loaderImage.setVisibility(View.GONE);
    }
    if (result.equalsIgnoreCase("null")) {
        if (errorImage != null) {
            errorImage.setVisibility(View.VISIBLE);
        }
    } else {
        Guide_GridView_adapter adapter = new Guide_GridView_adapter(activity.getApplicationContext(), Guide_activity.Downloads_Guides);
        guides_gridView.setAdapter(adapter);
        adapter.notifyDataSetChanged();
    }
}

当我为活动设置值时:

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

【问题讨论】:

  • 您在平板电脑上使用不同的布局吗?您可以发布包含给出 null 的 getactivity 的函数吗?
  • 请发布 logcat 以进行精确调试
  • 感谢大家的回复我还没有创建平板布局但我只想在创建平板布局之前测试平板电脑上的活动

标签: android android-fragments android-viewpager


【解决方案1】:

我通过在 Fragment onCreate() 中调用 setRetainInstance(true) 解决了我的问题

 @Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setRetainInstance(true);
}

【讨论】:

  • 控制是否在 Activity 重新创建期间(例如从配置更改)保留片段实例。这只能与不在后台堆栈中的片段一起使用。如果设置,当重新创建活动时,片段生命周期将略有不同:不会调用 onDestroy()(但仍然会调用 onDetach(),因为片段正在与其当前活动分离)。 onCreate(Bundle) 不会被调用,因为片段没有被重新创建。 onAttach(Activity) 和 onActivityCreated(Bundle) 仍然会被调用。
【解决方案2】:

为什么需要调用getActivity?活动作为参数传入?即

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

话虽如此,如果您正在编写最新的 API 级别 onAttachActiviy(Activity) 已被弃用,您应该改用 onAttachActivity(Context)

Android Fragment onAttach() deprecated

【讨论】:

  • 我尝试过使用 this.activity = activity;但我得到了相同的结果,我也无法很好地覆盖方法 onAttachActivity(Context)
  • 你在使用 import android.support.v4.app.Fragment; ?
  • 我倾向于检查您的 gradle 依赖项是否使用最新的支持库版本。同样在您最初的问题中,您到底在哪里看到 NPE?在 onAttach?或稍后当你提到活动时?如果是这样,用 NPE 发布函数
  • 编译 'com.android.support:appcompat-v7:22.2.1' 'com.android.support:support-v4:22.2.1'
  • 我正在使用这个版本的支持库
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多