更改语言设置后,Android应用中的空指针异常

时间:2015-11-12 16:27:22

标签: android

我打开它后,我的Android应用程序崩溃并出现空指针异常,转到“设置”并将语言从英语(美国)更改为英语(英国),然后返回到应用程序。将语言从英语更改为西班牙语也会导致崩溃。

由于ViewPager对象变为空,应用程序崩溃。此对象在活动的onCreate()方法中创建,可在我的代码中的其他位置访问,但从未更改或重新创建。

我没有做任何事情来本地化我的应用程序,以便它适用于英语(美国)以外的语言。

public class TabMainActivity extends FragmentActivity implements ActionBar.TabListener, OnSharedPreferenceChangeListener
{
    ActionBar actionBar;
    ActionBar.Tab popsVideoTab, corralStatusTab, reportsTab,currentStatusTab, storeStatusTab, supportTab;
    ViewPager viewPager;
    TabsPagerAdapter mAdapter;
    Context context;

@Override
protected void onCreate(Bundle savedInstanceState)
{
    super.onCreate(savedInstanceState);
    setContentView(R.layout.tabmain);
    actionBar = getActionBar();     
    actionBar.setDisplayShowTitleEnabled(true);

    mAdapter = new TabsPagerAdapter(getSupportFragmentManager());
    viewPager = (ViewPager) findViewById(R.id.pager);
    viewPager.setAdapter(mAdapter);

    // Creating ActionBar tabs.
    actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);


    viewPager.setOnPageChangeListener(new ViewPager.OnPageChangeListener()
    {
         @Override
        public void onPageSelected(int position)
        {
            actionBar.setSelectedNavigationItem(position);
        }

        @Override
        public void onPageScrolled(int arg0, float arg1, int arg2)
        {
        }

        @Override
        public void onPageScrollStateChanged(int arg0)
        {
        }
    });
}


public int pagerGetCurrentItem()
{
    int pagerCurrentItem = viewPager.getCurrentItem();
    return pagerCurrentItem;
}

<android.support.v4.view.ViewPager xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/pager"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content">
    </android.support.v4.view.ViewPager>
</FrameLayout>

堆栈跟踪如下。

USER_COMMENT=null
ANDROID_VERSION=4.4.2
APP_VERSION_NAME=4.5.2
BRAND=samsung
PHONE_MODEL=SM-T210R
CUSTOM_DATA=
STACK_TRACE=java.lang.RuntimeException: Unable to start activity ComponentInfo{com.carttronics.storeport/com.carttronics.storeport.TabMainActivity}: java.lang.NullPointerException
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2400)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2458)
at android.app.ActivityThread.handleRelaunchActivity(ActivityThread.java:4041)
at android.app.ActivityThread.access$1000(ActivityThread.java:172)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1311)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:146)
at android.app.ActivityThread.main(ActivityThread.java:5598)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:515)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1283)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1099)
at dalvik.system.NativeStart.main(Native Method)
Caused by: java.lang.NullPointerException
at com.carttronics.storeport.TabMainActivity.pagerGetCurrentItem(TabMainActivity.java:507)
at com.carttronics.storeport.CurrentStatusFragmentTab.onCreate(CurrentStatusFragmentTab.java:95)
at android.support.v4.app.Fragment.performCreate(Fragment.java:1477)
at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:893)
at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1104)
at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1086)
at android.support.v4.app.FragmentManagerImpl.dispatchCreate(FragmentManager.java:1879)
at android.support.v4.app.FragmentActivity.onCreate(FragmentActivity.java:215)
at com.carttronics.storeport.TabMainActivity.onCreate(TabMainActivity.java:66)
at android.app.Activity.performCreate(Activity.java:5459)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1093)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2364)
... 12 more

2 个答案:

答案 0 :(得分:1)

更改语言后,将调用Activities OnDestroy方法,然后调用onCreate方法。 onCreate活动为我的应用创建了一个新的ViewPager。我的应用程序有几个片段,其中一个片段调用了onResume()并在再次重新创建之前访问了ViewPager对象。

我对ViewPager的所有引用都进行了空检查,并且应用程序不再崩溃。

答案 1 :(得分:0)

也许这是垃圾收集,但你应该检查viewPager!= null。 如果要存储索引,可以将其保存到捆绑包中 http://developer.android.com/reference/android/app/Fragment.html in:onSavedInstance