2012-08-31 28 views
6

Tôi nhận được một NullPointerException khi tôi LEAVE một FragmentActivity và đi đến một ListActivity. Tôi thực sự bắt đầu thấy danh sách trước khi tôi nhận được Force Close. Nhưng LogCat đề cập đến Hoạt động mà tôi vừa xuất phát.NullPointerException trên onSaveInstanceState với AndroidFragments

Các LogCat nói điều này:

08-31 07:38:53.356: E/AndroidRuntime(8134): FATAL EXCEPTION: main 
08-31 07:38:53.356: E/AndroidRuntime(8134): java.lang.NullPointerException 
08-31 07:38:53.356: E/AndroidRuntime(8134):  at android.support.v4.app.FragmentManagerImpl.saveFragmentBasicState(FragmentManager.java:1576) 
08-31 07:38:53.356: E/AndroidRuntime(8134):  at android.support.v4.app.FragmentManagerImpl.saveAllState(FragmentManager.java:1617) 
08-31 07:38:53.356: E/AndroidRuntime(8134):  at android.support.v4.app.FragmentActivity.onSaveInstanceState(FragmentActivity.java:481) 
08-31 07:38:53.356: E/AndroidRuntime(8134):  at com.---.myApp.MasterCat.onSaveInstanceState(MasterCat.java:119) 
08-31 07:38:53.356: E/AndroidRuntime(8134):  at android.app.Activity.performSaveInstanceState(Activity.java:1137) 
08-31 07:38:53.356: E/AndroidRuntime(8134):  at android.app.Instrumentation.callActivityOnSaveInstanceState(Instrumentation.java:1215) 
08-31 07:38:53.356: E/AndroidRuntime(8134):  at android.app.ActivityThread.performStopActivityInner(ActivityThread.java:3077) 
08-31 07:38:53.356: E/AndroidRuntime(8134):  at android.app.ActivityThread.handleStopActivity(ActivityThread.java:3136) 
08-31 07:38:53.356: E/AndroidRuntime(8134):  at android.app.ActivityThread.access$900(ActivityThread.java:142) 
08-31 07:38:53.356: E/AndroidRuntime(8134):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1235) 
08-31 07:38:53.356: E/AndroidRuntime(8134):  at android.os.Handler.dispatchMessage(Handler.java:99) 
08-31 07:38:53.356: E/AndroidRuntime(8134):  at android.os.Looper.loop(Looper.java:137) 
08-31 07:38:53.356: E/AndroidRuntime(8134):  at android.app.ActivityThread.main(ActivityThread.java:4928) 
08-31 07:38:53.356: E/AndroidRuntime(8134):  at java.lang.reflect.Method.invokeNative(Native Method) 
08-31 07:38:53.356: E/AndroidRuntime(8134):  at java.lang.reflect.Method.invoke(Method.java:511) 
08-31 07:38:53.356: E/AndroidRuntime(8134):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:791) 
08-31 07:38:53.356: E/AndroidRuntime(8134):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:558) 
08-31 07:38:53.356: E/AndroidRuntime(8134):  at dalvik.system.NativeStart.main(Native Method) 

Dòng 119 trong MasterCat là:

@Override 
public void onSaveInstanceState(Bundle savedInstanceState) { 
    super.onSaveInstanceState(savedInstanceState); 
} 

Tôi không chắc chắn những gì mã khác để hiển thị, xin vui lòng cho tôi biết. Thiết lập cơ bản của tôi chứa 4 lớp bên trong tĩnh là tất cả các mảnh bên trong phụ huynh FragmentActivity (sử dụng thư viện hỗ trợ). Nó sử dụng các tab và một viewpager.

EDIT, thêm Mã:

public class MasterCat extends FragmentActivity implements 
     ActionBar.TabListener { 

    SectionsPagerAdapter mSectionsPagerAdapter; 
    ViewPager mViewPager; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.fragment_layout); 
     mSectionsPagerAdapter = new SectionsPagerAdapter(
       getSupportFragmentManager()); 
     final ActionBar actionBar = getActionBar(); 
     actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS); 
     mViewPager = (ViewPager) findViewById(R.id.viewpager); 
     mViewPager.setAdapter(mSectionsPagerAdapter); 
     mViewPager 
       .setOnPageChangeListener(
        new ViewPager.SimpleOnPageChangeListener() { 

        @Override 
        public void onPageSelected(int position) { 
         actionBar.setSelectedNavigationItem(position); 
        } 
       }); 
     for (int i = 0; i < mSectionsPagerAdapter.getCount(); i++) { 
      actionBar.addTab(actionBar.newTab() 
        .setText(mSectionsPagerAdapter.getPageTitle(i)) 
        .setTabListener(this)); 
     } 
    } 

    public void onTabUnselected(ActionBar.Tab tab, 
      FragmentTransaction fragmentTransaction) {} 

    @Override 
    public void onSaveInstanceState(Bundle savedInstanceState) { 
     super.onSaveInstanceState(savedInstanceState); 
    } 

    @Override 
    public void onRestoreInstanceState(Bundle savedInstanceState) { 
     super.onRestoreInstanceState(savedInstanceState); 
    } 

    public void onTabSelected(ActionBar.Tab tab, FragmentTransaction ft) { 
     mViewPager.setCurrentItem(tab.getPosition()); 
    } 

    public void onTabReselected(ActionBar.Tab tab, 
      FragmentTransaction fragmentTransaction) {} 

    public class SectionsPagerAdapter extends FragmentPagerAdapter { 

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

     @Override 
     public Fragment getItem(int position) { 
      Fragment f = null; 
      switch (position) { 
      case 0: 
      { 
       f = new MasterFrag(); 
       Bundle args = new Bundle(); 
       f.setArguments(args); 
       break; 
      } 
      case 1: 
      { 
       f = new FeaturedFrag(); 
       Bundle args = new Bundle(); 
       f.setArguments(args); 
       break; 
      } 
      case 2: 
      { 
       f = new TopFrag(); 
       Bundle args = new Bundle(); 
       f.setArguments(args); 
       break; 
      } 
      case 3: 
      { 
       f = new NewFrag(); 
       Bundle args = new Bundle(); 
       f.setArguments(args); 
       break; 
      } 
      default: 
       throw new IllegalArgumentException("not this many fragments: " 
        + position); 
      } 
      return f; 
     } 

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

     @Override 
     public CharSequence getPageTitle(int position) { 
      switch (position) { 
      case 0: 
       return getString(R.string.mastercattab1).toUpperCase(); 
      case 1: 
       return getString(R.string.mastercattab2).toUpperCase(); 
      case 2: 
       return getString(R.string.mastercattab3).toUpperCase(); 
      case 3: 
       return getString(R.string.mastercattab4).toUpperCase(); 
      } 
      return null; 
     } 
    } 
} 

Một Fragment tiêu biểu có một phác thảo như thế này:

public static class FeaturedFrag extends Fragment { 

    public FeaturedFrag() {} 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
      Bundle savedInstanceState) { 
     return inflater.inflate(R.layout.rateithome, container, false); 
    } 

    @Override 
    public void onActivityCreated(Bundle savedInstanceState) { 
     super.onActivityCreated(savedInstanceState); 
    } 
} 
+0

đặt mã hoạt động và đoạn mã của bạn quá – waqaslam

+0

@Waqas Chỉ cần thêm nhiều mã hơn cho mỗi yêu cầu. – KickingLettuce

+0

có thông báo lỗi trước đó trước khi bạn đăng không? – Proxy32

Trả lời

13

Dường như đây là một known bug in the Android Support Library. May mắn thay, nó đã được vá.

Để khắc phục lỗi này:

  1. Sử dụng quản lý SDK để cập nhật lên phiên bản mới nhất của các thư viện hỗ trợ
  2. Thay thế tệp android-support-v4.jar trong thư mục ứng dụng của bạn libs/ với phiên bản mới mà bạn vừa tải về
2

Hãy thử điều này:

public void onSaveInstanceState(Bundle savedInstanceState) { 

if (savedInstanceState != null) 
    { 
     super.onSaveInstanceState(savedInstanceState); 
    } 
} 
+1

Điều này không hoạt động. Nó vẫn đi ngay qua tình trạng như thể nó không phải là null và đi lên trên cùng một dòng "super.onSave ...". Có người nói rằng nó có thể là một lỗi với thư viện hỗ trợ; vì vậy tôi đang cố gắng làm việc đó ngay bây giờ như là lựa chọn tiếp theo của tôi. – KickingLettuce

+0

Ok. :) Hãy cho chúng tôi biết nếu sửa chữa đã làm việc. – rsb2097

+2

Vâng, tôi đơn giản cập nhật thư viện hỗ trợ - đã có một lỗi trong đó. Tất cả là tốt bây giờ. – KickingLettuce

0

Nếu bạn chỉ muốn một cách nhanh chóng workaround, thêm này để mã Fragment của bạn:

@Override 
public void onSaveInstanceState(Bundle outState) { 
    // Workaround to avoid NPE from support library bug: 
    setUserVisibleHint(false); 

    super.onSaveInstanceState(outState); 
} 

Thuộc tính setUserVisibleHint thực sự chỉ là gợi ý tối ưu hóa và không gây ra rắc rối nào cho bạn, xem Android reference documentation.

Tất nhiên, việc cập nhật Thư viện hỗ trợ là answered by theisenp có thể hấp dẫn hơn trong thời gian dài.

Các vấn đề liên quan