NullPointerException异常的onSaveInstanceState上与AndroidFragments [英] NullPointerException on onSaveInstanceState with AndroidFragments
问题描述
我收到一个NullPointerException异常,当我离开FragmentActivity和去ListActivity。其实,我开始看到名单之前,我的部队关闭。但LogCat中指的是我刚刚从来到活动。
在LogCat中这样说:
7月8日至31日:38:53.356:E / AndroidRuntime(8134):致命异常:主要
7月8日至31号:38:53.356:E / AndroidRuntime(8134):显示java.lang.NullPointerException
7月8日至31号:38:53.356:E / AndroidRuntime(8134):在android.support.v4.app.FragmentManagerImpl.saveFragmentBasicState(FragmentManager.java:1576)
7月8日至31号:38:53.356:E / AndroidRuntime(8134):在android.support.v4.app.FragmentManagerImpl.saveAllState(FragmentManager.java:1617)
7月8日至31号:38:53.356:E / AndroidRuntime(8134):在android.support.v4.app.FragmentActivity.onSaveInstanceState(FragmentActivity.java:481)
7月8日至31号:38:53.356:E / AndroidRuntime(8134):在COM .--- myApp.MasterCat.onSaveInstanceState(MasterCat.java:119)
7月8日至31号:38:53.356:E / AndroidRuntime(8134):在android.app.Activity.performSaveInstanceState(Activity.java:1137)
7月8日至31号:38:53.356:E / AndroidRuntime(8134):在android.app.Instrumentation.callActivityOnSaveInstanceState(Instrumentation.java:1215)
7月8日至31号:38:53.356:E / AndroidRuntime(8134):在android.app.ActivityThread.performStopActivityInner(ActivityThread.java:3077)
7月8日至31号:38:53.356:E / AndroidRuntime(8134):在android.app.ActivityThread.handleStopActivity(ActivityThread.java:3136)
7月8日至31号:38:53.356:E / AndroidRuntime(8134):在android.app.ActivityThread.access $ 900(ActivityThread.java:142)
7月8日至31号:38:53.356:E / AndroidRuntime(8134):在android.app.ActivityThread $ H.handleMessage(ActivityThread.java:1235)
7月8日至31号:38:53.356:E / AndroidRuntime(8134):在android.os.Handler.dispatchMessage(Handler.java:99)
7月8日至31号:38:53.356:E / AndroidRuntime(8134):在android.os.Looper.loop(Looper.java:137)
7月8日至31号:38:53.356:E / AndroidRuntime(8134):在android.app.ActivityThread.main(ActivityThread.java:4928)
7月8日至31号:38:53.356:E / AndroidRuntime(8134):在java.lang.reflect.Method.invokeNative(本机方法)
7月8日至31号:38:53.356:E / AndroidRuntime(8134):在java.lang.reflect.Method.invoke(Method.java:511)
7月8日至31号:38:53.356:E / AndroidRuntime(8134):在com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:791)
7月8日至31号:38:53.356:E / AndroidRuntime(8134):在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:558)
7月8日至31号:38:53.356:E / AndroidRuntime(8134):在dalvik.system.NativeStart.main(本机方法)
线119 MasterCat是:
@覆盖
公共无效的onSaveInstanceState(包savedInstanceState){
super.onSaveInstanceState(savedInstanceState);
}
我不知道还有什么其他code显示,请让我知道。我的基本设置包含4个静态内部类是父 FragmentActivity
(使用支持库)内的所有片段。它使用标签和viewpager。
编辑,更多code:
公共类MasterCat扩展FragmentActivity工具
ActionBar.TabListener {
SectionsPagerAdapter mSectionsPagerAdapter;
ViewPager mViewPager;
@覆盖
公共无效的onCreate(包savedInstanceState){
super.onCreate(savedInstanceState);
的setContentView(R.layout.fragment_layout);
mSectionsPagerAdapter =新SectionsPagerAdapter(
getSupportFragmentManager());
最后的动作条动作条= getActionBar();
actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
mViewPager =(ViewPager)findViewById(R.id.viewpager);
mViewPager.setAdapter(mSectionsPagerAdapter);
mViewPager
.setOnPageChangeListener(
新ViewPager.SimpleOnPageChangeListener(){
@覆盖
公共无效onPageSelected(INT位置){
actionBar.setSelectedNavigationItem(位置);
}
});
的for(int i = 0; I< mSectionsPagerAdapter.getCount();我++){
actionBar.addTab(actionBar.newTab()
.setText(mSectionsPagerAdapter.getPageTitle(I))
.setTabListener(本));
}
}
公共无效onTabUnselected(ActionBar.Tab选项卡,
FragmentTransaction fragmentTransaction){}
@覆盖
公共无效的onSaveInstanceState(包savedInstanceState){
super.onSaveInstanceState(savedInstanceState);
}
@覆盖
公共无效onRestoreInstanceState(包savedInstanceState){
super.onRestoreInstanceState(savedInstanceState);
}
公共无效onTabSelected(ActionBar.Tab选项卡,FragmentTransaction英尺){
mViewPager.setCurrentItem(tab.getPosition());
}
公共无效onTabReselected(ActionBar.Tab选项卡,
FragmentTransaction fragmentTransaction){}
公共类SectionsPagerAdapter扩展FragmentPagerAdapter {
公共SectionsPagerAdapter(FragmentManager FM){
超(FM);
}
@覆盖
公共片段的getItem(INT位置){
片f = NULL;
开关(位置){
情况下0:
{
F =新MasterFrag();
捆绑的args =新包();
f.setArguments(参数);
打破;
}
情况1:
{
F =新FeaturedFrag();
捆绑的args =新包();
f.setArguments(参数);
打破;
}
案例2:
{
F =新TopFrag();
捆绑的args =新包();
f.setArguments(参数);
打破;
}
案例3:
{
F =新NewFrag();
捆绑的args =新包();
f.setArguments(参数);
打破;
}
默认:
抛出新抛出:IllegalArgumentException(没有这么多的片段:
+位置);
}
返回F;
}
@覆盖
公众诠释getCount将(){
返回4;
}
@覆盖
公共CharSequence的getPageTitle(INT位置){
开关(位置){
情况下0:
返回的getString(R.string.mastercattab1).toUpperCase();
情况1:
返回的getString(R.string.mastercattab2).toUpperCase();
案例2:
返回的getString(R.string.mastercattab3).toUpperCase();
案例3:
返回的getString(R.string.mastercattab4).toUpperCase();
}
返回null;
}
}
}
一个典型的片段有这样一个轮廓:
公共静态类FeaturedFrag扩展片段{
公共FeaturedFrag(){}
@覆盖
公共查看onCreateView(LayoutInflater充气,容器的ViewGroup,
捆绑savedInstanceState){
返回inflater.inflate(R.layout.rateithome,集装箱,假);
}
@覆盖
公共无效onActivityCreated(包savedInstanceState){
super.onActivityCreated(savedInstanceState);
}
}
看起来这是一个已知臭虫在Android支持库。幸运的是,它已经被修补。
要修复bug:
- 使用SDK管理器更新到支持库的最新版本
- 新版本替换
Android的支持 - v4.jar
文件中的应用程序的库/
文件夹你刚才下载
I am receiving a NullPointerException when I LEAVE a FragmentActivity and go to a ListActivity. I actually start to see the list before I get the Force Close. But the LogCat refers to the Activity that I just came from.
The LogCat says this:
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)
Line 119 in MasterCat is:
@Override
public void onSaveInstanceState(Bundle savedInstanceState) {
super.onSaveInstanceState(savedInstanceState);
}
I am not sure what other code to show, please let me know. My basic setup contains 4 static inner classes that are all fragments inside the parent FragmentActivity
(using the support library). It uses tabs and a viewpager.
EDIT, More Code:
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;
}
}
}
A Typical Fragment has an outline like this:
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);
}
}
It looks like this is a known bug in the Android Support Library. Fortunately, it's been patched.
To fix the bug:
- Use the SDK Manager to update to the latest version of the support library
- Replace the
android-support-v4.jar
file in your application'slibs/
folder with the new version that you just downloaded
这篇关于NullPointerException异常的onSaveInstanceState上与AndroidFragments的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!