문제

I have an activity with 3 tabs using fragments, it works fine when working in portrait mode, however, when I change it to landscape, it crashes. This is the code:

public class MainMenuActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main_menu);

        ActionBar actionBar = getActionBar();
        actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);

        String label1 = getResources().getString(R.string.userMainTab);
        Tab tab = actionBar.newTab();
        tab.setText(label1);
        TabListener<UserTabActivity> tl = new TabListener<UserTabActivity>(this, label1, UserTabActivity.class);
        tab.setTabListener(tl);
        actionBar.addTab(tab);

        String label2 = getResources().getString(R.string.credentialGroupMainTab);
        Tab tab2 = actionBar.newTab();
        tab2.setText(label2);
        TabListener<CredentialGroupActivity> tl2 = new TabListener<CredentialGroupActivity>(this, label2, CredentialGroupActivity.class);
        tab2.setTabListener(tl2);
        actionBar.addTab(tab2);

        String label3 = getResources().getString(R.string.credentialTabHeader);
        Tab tab3 = actionBar.newTab();
        tab3.setText(label3);
        TabListener<CredentialTabActivity> tl3 = new TabListener<CredentialTabActivity>(this, label2, CredentialTabActivity.class);
        tab3.setTabListener(tl3);
        actionBar.addTab(tab3);     

    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main_menu, menu);
        return true;
    }   

    public static class TabListener<T extends Fragment> implements ActionBar.TabListener{

        private Fragment mFragment;
        private final Activity mActivity;
        private final String mTag;
        private final Class<T> mClass;

        public TabListener(Activity activity, String tag, Class<T> clz){
            mActivity = activity;
            mTag = tag;
            mClass = clz;

            mFragment = mActivity.getFragmentManager().findFragmentByTag(mTag);
            if(mFragment != null && !mFragment.isDetached()){
                FragmentTransaction ft = mActivity.getFragmentManager().beginTransaction();
                ft.detach(mFragment);
                ft.commit();
            }
        }

        @Override
        public void onTabReselected(Tab arg0, FragmentTransaction arg1) {
            // TODO Auto-generated method stub
        }

        @Override
        public void onTabSelected(Tab arg0, FragmentTransaction arg1) {
            // TODO Auto-generated method stub
            if(mFragment == null){
                mFragment = Fragment.instantiate(mActivity, mClass.getName());
                arg1.add(android.R.id.content, mFragment, mTag);
            } else{
                arg1.attach(mFragment);
            }
        }

        @Override
        public void onTabUnselected(Tab arg0, FragmentTransaction arg1) {
            // TODO Auto-generated method stub
            if(mFragment != null){
                arg1.detach(mFragment);
            }
        }

    }

}

Could you tell me why is not working? The error is:

java.lang.RuntimeException: Unable to destroy activity{ACTIVITY_NAME} : java.lang.NullPointerException

I have noticed that it fails until I click on any of the tabs, and then try to change it to landscape, but I haven't been able to identify in the code what's happening, and also, when I change the view, it loses the tab where it was positioned.

Thanks in advanced!

EDIT

In order to keep the selected tab after changing the orientation, I ended up doing this, thanks to the suggestions made by Nathaniel Waggoner and karthikk:

protected void onSaveInstanceState(Bundle outState) {
    // TODO Auto-generated method stub
    super.onSaveInstanceState(outState);

    outState.putInt("tabState", actionBar.getSelectedTab().getPosition());
}

//In the onCreate method
    if(savedInstanceState != null ){
        actionBar.selectTab(actionBar.getTabAt(savedInstanceState.getInt("tabState")));
    }

Thanks!!

도움이 되었습니까?

해결책 2

Are you Overriding onDestroy in your fragments? That NPE you show is a symptom I've seen when I've overidden OnDestroy in fragments used in Tabs. I would remove that override if you are and see if this clears up that issue.

다른 팁

To retain the tab selection,

  1. it has to be stored in preference OR
  2. Override the onSaveInstanceState() and save the TAB_SELECTION. On configuration change your activity would give the previous state as Bundle via onRestoreInstanceState() API.

I suggest to refer http://developer.android.com/reference/android/app/Activity.html#onSaveInstanceState(android.os.Bundle) for more information.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top