查看传呼机崩溃空指针异常是由于导航回到旧片段 - Android电子 [英] View Pager Crash Null Pointer Exception due to navigating back to the old fragment - Android

查看:212
本文介绍了查看传呼机崩溃空指针异常是由于导航回到旧片段 - Android电子的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我使用寻呼机查看页面之间进行导航。我使用FragmentStatePagerAdapter。我可以在一个方向上有任何问题,轻扫。但是,如果我刷回旧之一。它越来越崩溃。我得到空指针异常。

 十月3日至12日:20:34.273:E / AndroidRuntime(29035):工艺:com.titlesource.notarymobile,PID:29035
10月3日至12日:20:34.273:E / AndroidRuntime(29035):显示java.lang.NullPointerException
10月3日至12日:20:34.273:E / AndroidRuntime(29035):在android.support.v4.app.Fragment.instantiate(Fragment.java:399)
10月3日至12日:20:34.273:E / AndroidRuntime(29035):在android.support.v4.app.FragmentState.instantiate(Fragment.java:97)
10月3日至12日:20:34.273:E / AndroidRuntime(29035):在android.support.v4.app.FragmentManagerImpl.restoreAllState(FragmentManager.java:1790)
10月3日至12日:20:34.273:E / AndroidRuntime(29035):在android.support.v4.app.Fragment.performCreate(Fragment.java:1489)
10月3日至12日:20:34.273:E / AndroidRuntime(29035):在android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:893)
10月3日至12日:20:34.273:E / AndroidRuntime(29035):在android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1104)
10月3日至12日:20:34.273:E / AndroidRuntime(29035):在android.support.v4.app.BackStackRecord.run(BackStackRecord.java:682)
10月3日至12日:20:34.273:E / AndroidRuntime(29035):在android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1467)
10月3日至12日:20:34.273:E / AndroidRuntime(29035):在android.support.v4.app.FragmentManagerImpl.executePendingTransactions(FragmentManager.java:472)
10月3日至12日:20:34.273:E / AndroidRuntime(29035):在android.support.v4.app.FragmentStatePagerAdapter.finishUpdate(FragmentStatePagerAdapter.java:163)
10月3日至12日:20:34.273:E / AndroidRuntime(29035):在android.support.v4.view.ViewPager.populate(ViewPager.java:1068)
10月3日至12日:20:34.273:E / AndroidRuntime(29035):在android.support.v4.view.ViewPager.populate(ViewPager.java:914)
10月3日至12日:20:34.273:E / AndroidRuntime(29035):在android.support.v4.view.ViewPager $ 3.run(ViewPager.java:244)
10月3日至12日:20:34.273:E / AndroidRuntime(29035):在android.view.Choreographer $ CallbackRecord.run(Choreographer.java:761)
10月3日至12日:20:34.273:E / AndroidRuntime(29035):在android.view.Choreographer.doCallbacks(Choreographer.java:574)
10月3日至12日:20:34.273:E / AndroidRuntime(29035):在android.view.Choreographer.doFrame(Choreographer.java:543)
10月3日至12日:20:34.273:E / AndroidRuntime(29035):在android.view.Choreographer $ FrameDisplayEventReceiver.run(Choreographer.java:747)
10月3日至12日:20:34.273:E / AndroidRuntime(29035):在android.os.Handler.handleCallback(Handler.java:733)
10月3日至12日:20:34.273:E / AndroidRuntime(29035):在android.os.Handler.dispatchMessage(Handler.java:95)
10月3日至12日:20:34.273:E / AndroidRuntime(29035):在android.os.Looper.loop(Looper.java:136)
10月3日至12日:20:34.273:E / AndroidRuntime(29035):在android.app.ActivityThread.main(ActivityThread.java:5102)
10月3日至12日:20:34.273:E / AndroidRuntime(29035):在java.lang.reflect.Method.invokeNative(本机方法)
10月3日至12日:20:34.273:E / AndroidRuntime(29035):在java.lang.reflect.Method.invoke(Method.java:515)
10月3日至12日:20:34.273:E / AndroidRuntime(29035):在com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:779)
10月3日至12日:20:34.273:E / AndroidRuntime(29035):在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595)
10月3日至12日:20:34.273:E / AndroidRuntime(29035):在dalvik.system.NativeStart.main(本机方法)

这是我的code:

  @覆盖
保护无效的onCreate(捆绑savedInstanceState){
    super.onCreate(savedInstanceState);
    的setContentView(R.layout.activity_page_view);
    mProgressDialog =新ProgressDialog(JobDetailsActivity.this);
    mProgressDialog.setMessage(加载);
    束束= getIntent()getExtras()。
    位置= bundle.getInt(list_posiition_details);
        清单<片断>片段= getFragments();
        pageAdapter =新MyPageAdapter(getSupportFragmentManager(),片段);        寻呼机=(ViewPager)findViewById(R.id.viewpager);
        pager.setAdapter(pageAdapter);
        pager.setCurrentItem(位置);
        pager.setOffscreenPageLimit(3);
}
公共接口YourFragmentInterface {
    无效fragmentBecameVisible();
} 私人列表<片断> getFragments(){
        清单<片断> FLIST =新的ArrayList<片断>();        最终的ArrayList<> TEMP = DataModel.getScheduleList();         对于(最终obj对象:TEMP){
             如果(OBJ的instanceof作业){
                 字符串=((工作)OBJ).getA();
                 字符串B = Long.toString(((工作)OBJ).getB());
                 字符串C =((工作)OBJ).getC();
                 fList.add(JobDetailsFragment_.newInstance(A,B,C));
                 mProgressDialog.dismiss();
             }
         }
        返回FLIST;
    }
  公共类MyPageAdapter扩展FragmentStatePagerAdapter {
        私人列表<片断>片段;        公共MyPageAdapter(FragmentManager FM,列表与LT;片断>片段){
            超(FM);
            this.fragments =片段;
        }
        @覆盖
        公共片段的getItem(INT位置){
            返回this.fragments.get(位置);
        }        @覆盖
        公众诠释的getCount(){
            返回this.fragments.size();
        }        @覆盖
        公众诠释getItemPosition(Object对象){
            返回POSITION_NONE;
        }    }

下面是我的片段类:

 公共类MyFragment扩展片段{
公共静态最后弦乐EXTRA_MESSAGE =EXTRA_MESSAGE;
私有静态视图视图;
/ **
 *请注意,这可能是NULL,如果谷歌Play服务APK是不是
 *可用。
 * /SupportMapFragment mSupportMapFragment;
私人GoogleMap的GoogleMap的;公共静态最终MyFragment的newInstance(字符串消息)
{
    MyFragment F =新MyFragment();
    集束BDL =新包(1);
    bdl.putString(EXTRA_MESSAGE,消息);
    f.setArguments(BDL);
    返回F;
}
//浏览视图。@覆盖
公共查看onCreateView(LayoutInflater充气器,容器的ViewGroup,
    捆绑savedInstanceState){
    。字符串消息= getArguments()的getString(EXTRA_MESSAGE);     如果(查看!= NULL){
            ViewGroup中父=(ViewGroup中)view.getParent();
            如果(父!= NULL)
                parent.removeView(视图);
        }
        尝试{
            鉴于= inflater.inflate(R.layout.myfragment_layout,集装箱,FALSE);
            TextView的messageTextView =(TextView中)view.findViewById(R.id.textView);
            messageTextView.setText(消息);
        }赶上(InflateException E){
            / *地图已经存在,只是返回看法,因为它是* /
        }//视图V = inflater.inflate(R.layout.myfragment_layout,集装箱,FALSE);
    返回视图。
}
@覆盖
公共无效onActivityCreated(捆绑savedInstanceState){
    super.onActivityCreated(savedInstanceState);
    FragmentManager FM = getChildFragmentManager();
    mSupportMapFragment =(SupportMapFragment)fm.findFragmentById(R.id.location_map);
    如果(mSupportMapFragment == NULL){
        mSupportMapFragment = SupportMapFragment.newInstance();
        fm.beginTransaction()取代(R.id.location_map,mSupportMapFragment).commit()。
    }
}@覆盖
公共无效onResume(){
    super.onResume();
    如果(GoogleMap的== NULL){
        GoogleMap的= mSupportMapFragment.getMap();
        googleMap.addMarker(。新的MarkerOptions()位置(经纬度新(0,0)));
    }
  }}


解决方案

我找到了解决办法。

其因FragmentStatePagerAdapter的发生。在片段,我们需要分离getChildFragmentManager。

因此​​,我们需要activityCreated()后添加以下code

  @覆盖
    公共无效onDetach(){
        super.onDetach();
        尝试{
            现场childFragmentManager = Fragment.class.getDeclaredField(mChildFragmentManager);
            childFragmentManager.setAccessible(真);
            childFragmentManager.set(这一点,空);
        }赶上(NoSuchFieldException E){
            抛出新的RuntimeException(E);
        }赶上(IllegalAccessException E){
            抛出新的RuntimeException(E);
        }
    }

I am using view pager for navigating between pages. I am using FragmentStatePagerAdapter. I can swipe in one direction with out any problems. But if i swipe back to the older one. Its getting crash. I am getting null pointer exception.

03-12 10:20:34.273: E/AndroidRuntime(29035): Process: com.titlesource.notarymobile, PID: 29035
03-12 10:20:34.273: E/AndroidRuntime(29035): java.lang.NullPointerException
03-12 10:20:34.273: E/AndroidRuntime(29035):    at android.support.v4.app.Fragment.instantiate(Fragment.java:399)
03-12 10:20:34.273: E/AndroidRuntime(29035):    at android.support.v4.app.FragmentState.instantiate(Fragment.java:97)
03-12 10:20:34.273: E/AndroidRuntime(29035):    at android.support.v4.app.FragmentManagerImpl.restoreAllState(FragmentManager.java:1790)
03-12 10:20:34.273: E/AndroidRuntime(29035):    at android.support.v4.app.Fragment.performCreate(Fragment.java:1489)
03-12 10:20:34.273: E/AndroidRuntime(29035):    at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:893)
03-12 10:20:34.273: E/AndroidRuntime(29035):    at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1104)
03-12 10:20:34.273: E/AndroidRuntime(29035):    at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:682)
03-12 10:20:34.273: E/AndroidRuntime(29035):    at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1467)
03-12 10:20:34.273: E/AndroidRuntime(29035):    at android.support.v4.app.FragmentManagerImpl.executePendingTransactions(FragmentManager.java:472)
03-12 10:20:34.273: E/AndroidRuntime(29035):    at android.support.v4.app.FragmentStatePagerAdapter.finishUpdate(FragmentStatePagerAdapter.java:163)
03-12 10:20:34.273: E/AndroidRuntime(29035):    at android.support.v4.view.ViewPager.populate(ViewPager.java:1068)
03-12 10:20:34.273: E/AndroidRuntime(29035):    at android.support.v4.view.ViewPager.populate(ViewPager.java:914)
03-12 10:20:34.273: E/AndroidRuntime(29035):    at android.support.v4.view.ViewPager$3.run(ViewPager.java:244)
03-12 10:20:34.273: E/AndroidRuntime(29035):    at android.view.Choreographer$CallbackRecord.run(Choreographer.java:761)
03-12 10:20:34.273: E/AndroidRuntime(29035):    at android.view.Choreographer.doCallbacks(Choreographer.java:574)
03-12 10:20:34.273: E/AndroidRuntime(29035):    at android.view.Choreographer.doFrame(Choreographer.java:543)
03-12 10:20:34.273: E/AndroidRuntime(29035):    at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:747)
03-12 10:20:34.273: E/AndroidRuntime(29035):    at android.os.Handler.handleCallback(Handler.java:733)
03-12 10:20:34.273: E/AndroidRuntime(29035):    at android.os.Handler.dispatchMessage(Handler.java:95)
03-12 10:20:34.273: E/AndroidRuntime(29035):    at android.os.Looper.loop(Looper.java:136)
03-12 10:20:34.273: E/AndroidRuntime(29035):    at android.app.ActivityThread.main(ActivityThread.java:5102)
03-12 10:20:34.273: E/AndroidRuntime(29035):    at java.lang.reflect.Method.invokeNative(Native Method)
03-12 10:20:34.273: E/AndroidRuntime(29035):    at java.lang.reflect.Method.invoke(Method.java:515)
03-12 10:20:34.273: E/AndroidRuntime(29035):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779)
03-12 10:20:34.273: E/AndroidRuntime(29035):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595)
03-12 10:20:34.273: E/AndroidRuntime(29035):    at dalvik.system.NativeStart.main(Native Method)

And here is my Code:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_page_view);
    mProgressDialog = new ProgressDialog(JobDetailsActivity.this);
    mProgressDialog.setMessage("Loading");
    Bundle bundle = getIntent().getExtras();
    position = bundle.getInt("list_posiition_details");
        List<Fragment> fragments = getFragments();
        pageAdapter = new MyPageAdapter(getSupportFragmentManager(), fragments);

        pager = (ViewPager)findViewById(R.id.viewpager);
        pager.setAdapter(pageAdapter);
        pager.setCurrentItem(position);
        pager.setOffscreenPageLimit(3);
}


public interface YourFragmentInterface {
    void fragmentBecameVisible();
}

 private List<Fragment> getFragments(){
        List<Fragment> fList = new ArrayList<Fragment>();

        final ArrayList<?> temp = DataModel.getScheduleList();

         for (final Object obj : temp) {
             if(obj instanceof Job) {
                 String a = ((Job) obj).getA();
                 String b = Long.toString(((Job) obj).getB());
                 String c = ((Job) obj).getC();
                 fList.add(JobDetailsFragment_.newInstance(a, b, c));
                 mProgressDialog.dismiss();
             }
         }
        return fList;
    }


  public class MyPageAdapter extends FragmentStatePagerAdapter {
        private List<Fragment> fragments;

        public MyPageAdapter(FragmentManager fm, List<Fragment> fragments) {
            super(fm);
            this.fragments = fragments;
        }
        @Override
        public Fragment getItem(int position) {
            return this.fragments.get(position);
        }

        @Override
        public int getCount() {
            return this.fragments.size();
        }

        @Override
        public int getItemPosition(Object object) {
            return POSITION_NONE;
        }  

    }

Here is my Fragment class:

public class MyFragment extends Fragment {
public static final String EXTRA_MESSAGE = "EXTRA_MESSAGE";


private static View view;
/**
 * Note that this may be null if the Google Play services APK is not
 * available.
 */

SupportMapFragment mSupportMapFragment;
private GoogleMap googleMap;

public static final MyFragment newInstance(String message)
{
    MyFragment f = new MyFragment();
    Bundle bdl = new Bundle(1);
    bdl.putString(EXTRA_MESSAGE, message);
    f.setArguments(bdl);
    return f;
}
//  View view;

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
    Bundle savedInstanceState) {
    String message = getArguments().getString(EXTRA_MESSAGE);

     if (view != null) {
            ViewGroup parent = (ViewGroup) view.getParent();
            if (parent != null)
                parent.removeView(view);
        }
        try {
            view = inflater.inflate(R.layout.myfragment_layout, container, false);
            TextView messageTextView = (TextView)view.findViewById(R.id.textView);
            messageTextView.setText(message);
        } catch (InflateException e) {
            /* map is already there, just return view as it is */
        }

//      View v = inflater.inflate(R.layout.myfragment_layout, container, false);


    return view;
}


@Override
public void onActivityCreated(Bundle savedInstanceState) {
    super.onActivityCreated(savedInstanceState);
    FragmentManager fm = getChildFragmentManager();
    mSupportMapFragment = (SupportMapFragment) fm.findFragmentById(R.id.location_map);
    if (mSupportMapFragment == null) {
        mSupportMapFragment = SupportMapFragment.newInstance();
        fm.beginTransaction().replace(R.id.location_map, mSupportMapFragment).commit();
    }
}

@Override
public void onResume() {
    super.onResume();
    if (googleMap == null) {
        googleMap = mSupportMapFragment.getMap();
        googleMap.addMarker(new MarkerOptions().position(new LatLng(0, 0)));
    }
  }

}

解决方案

I found the solution.

Its happening because of FragmentStatePagerAdapter. In the fragment we need to detach the getChildFragmentManager.

So we need to add the below code after activityCreated()

        @Override
    public void onDetach() {
        super.onDetach();
        try {
            Field childFragmentManager = Fragment.class.getDeclaredField("mChildFragmentManager");
            childFragmentManager.setAccessible(true);
            childFragmentManager.set(this, null);
        } catch (NoSuchFieldException e) {
            throw new RuntimeException(e);
        } catch (IllegalAccessException e) {
            throw new RuntimeException(e);
        }
    }

这篇关于查看传呼机崩溃空指针异常是由于导航回到旧片段 - Android电子的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆