2012-08-31 7 views
6

FragmentActivityを離れてListActivityに移動すると、NullPointerExceptionが発生します。私はForce Closeを得る前に実際にリストを見始める。しかし、LogCatはちょうど私が来た活動を指します。AndroidFragmentsを使用したonSaveInstanceStateのNullPointerException

はLogCatはこれを言う:MASTERCATで

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) 

ライン119は、次のとおりです。

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

私は、私に知らせてください表示、他のどのようなコードを確認していません。私の基本的なセットアップには、(サポートライブラリを使用して)親FragmentActivity内のすべてのフラグメントである4つの静的内部クラスが含まれています。タブとビューページを使用します。

EDIT、より多くのコード:

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; 
     } 
    } 
} 

典型的なフラグメントは、このようなアウトラインがあります

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

あなたのアクティビティやフラグメントコードも入れてください – waqaslam

+0

@Waqasリクエストごとにたくさんのコードが追加されました。 – KickingLettuce

+0

投稿した前に以前のエラーメッセージがありますか? – Proxy32

答えて

13

に見えます。幸いにも、それはパッチが当てられています。あなただけのをダウンロードした新しいバージョンを使用してアプリケーションのlibs/フォルダにandroid-support-v4.jarファイルを置き換え

  1. サポートライブラリ
  2. の最新バージョンに更新するために、SDK Managerを使用してください:バグを修正する

2

これを試してみてください。これはknown bug in the Android Support Libraryあるよう

public void onSaveInstanceState(Bundle savedInstanceState) { 

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

これは機能しませんでした。あたかもそれがヌルでなく、同じ行 "super.onSave ..."に上っているかのように、そのまま条件を過ぎて行く。誰かがサポートライブラリのバグかもしれないと言った。だから私は次の選択肢として今それを働かそうとしている。 – KickingLettuce

+0

[OK]をクリックします。 :)その修正が働いたかどうかをお知らせください。 – rsb2097

+2

私はサポートライブラリを更新しました。バグがありました。すべてが今はうまいです。 – KickingLettuce

0

あなただけの迅速な回避策をしたい場合は、お使いのフラグメントのコードにこれを追加します。

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

    super.onSaveInstanceState(outState); 
} 

プロパティは実際には最適化のヒントに過ぎず、問題が発生しないようにしてください。Android reference documentationを参照してください。

もちろん、サポートライブラリをanswered by theisenpとして更新することは、長期的には望ましいことです。

関連する問題