0

I'm having a bit of an issue I can't seem to work around (I haven't worked with fragments in this way before)

I have a main FragmentActivity as follows:

package com.my.app;

import android.app.AlertDialog;
import android.content.DialogInterface; 
import android.os.Bundle;
import android.support.v4.app.FragmentActivity;
import android.support.v4.view.ViewPager;

import com.astuetz.viewpager.extensions.ScrollingTabsView;
import com.astuetz.viewpager.extensions.TabsAdapter;

public class MyTabsActivity extends FragmentActivity {

private ViewPager mPager;
private ScrollingTabsView mScrollingTabs;

private TabsAdapter mScrollingTabsAdapter;

@Override
public void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_my_tabs);

    mPager = (ViewPager) findViewById(R.id.pager);
    mScrollingTabs = (ScrollingTabsView) findViewById(R.id.my_tabs);
    mScrollingTabsAdapter = new MyTabsAdapter(this, mPager);
    addTabs();
    mScrollingTabs.setAdapter(mScrollingTabsAdapter);
    mScrollingTabs.setViewPager(mPager);
    mPager.setCurrentItem(1);
    mPager.setPageMargin(1);
}

private void addTabs() {
    mScrollingTabsAdapter.addTab("FirstFragment", "First");
    mScrollingTabsAdapter.addTab("SecondFragment", "Second");
}
}

The XML is as follows (with the Viewpager and ScrollingTabsView:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res/com.my.package"
android:layout_width="fill_parent"
android:layout_height="fill_parent" >

<com.astuetz.viewpager.extensions.ScrollingTabsView
    android:id="@+id/ztc_tabs"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:background="@drawable/tab_unselected_holo"
    app:dividerDrawable="@drawable/divider"/>

<android.support.v4.view.ViewPager
    android:id="@+id/pager"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:layout_below="@+id/ztc_tabs" />

</RelativeLayout>

Then in the MyTabsAdapter I have this:

package com.my.app;

import com.my.app.R;

import java.util.ArrayList;

import android.app.Activity;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentActivity;
import android.support.v4.app.FragmentPagerAdapter;
import android.support.v4.view.ViewPager;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.Button;

import com.astuetz.viewpager.extensions.TabsAdapter;

public class MyTabsAdapter extends FragmentPagerAdapter implements TabsAdapter {
private final ArrayList<TabInfo> mTabs = new ArrayList<TabInfo>();
private final ViewPager mPager;

private Activity mContext;

static final class TabInfo {
    private final String fragName;
    private final String title;

    TabInfo(String fragName, String title) {
        this.fragName = fragName;
        this.title = title;
    }
}

public MyTabsAdapter(FragmentActivity ctx, ViewPager pager) {
    super(ctx.getSupportFragmentManager());
    this.mContext = ctx;
    this.mPager = pager;
    this.mPager.setAdapter(this);
}

public View getView(int position) {
    Button tab;

    LayoutInflater inflater = mContext.getLayoutInflater();
    tab = (Button) inflater.inflate(R.layout.tab_scrolling, null);

    tab.setText(this.mTabs.get(position).title.toUpperCase());

    return tab;
}

public void addTab(String fragName, String title) {
    TabInfo info = new TabInfo(fragName, title);
    mTabs.add(info);
}

@Override
public Fragment getItem(int position) {
    TabInfo info = mTabs.get(position);
    if (info.fragName == "FirstFragment") {
        return FirstFragment.newInstance();
    } else if (info.fragName == "SecondFragment") {
        return SecondFragment.newInstance(t);
    }
    return null;
}

@Override
public int getCount() {
    return mTabs.size();
}

}

And FirstFragment/SecondFragment have their own basic layouts and are nearly identical, heres a Fragment

package com.my.app;

import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

public class FirstFragment extends Fragment {

public static Fragment newInstance() {
    FirstFragment frag = new FirstFragment();;
    return frag;
}

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setRetainInstance(true);
}

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

}

Everything here works exactly as I want it to. The tabs work, the ViewPager pages properly, etc.

The problem is, I get this trace and force close when I change the orientation and I'm not sure why.

E/AndroidRuntime(32431): FATAL EXCEPTION: main
E/AndroidRuntime(32431): java.lang.NullPointerException
E/AndroidRuntime(32431):    at android.support.v4.app.FragmentManagerImpl.saveFragmentBasicState(FragmentManager.java:1576)
E/AndroidRuntime(32431):    at android.support.v4.app.FragmentManagerImpl.saveAllState(FragmentManager.java:1617)
E/AndroidRuntime(32431):    at android.support.v4.app.FragmentActivity.onSaveInstanceState(FragmentActivity.java:481)
E/AndroidRuntime(32431):    at android.app.Activity.performSaveInstanceState(Activity.java:1147)
E/AndroidRuntime(32431):    at android.app.Instrumentation.callActivityOnSaveInstanceState(Instrumentation.java:1216)
E/AndroidRuntime(32431):    at android.app.ActivityThread.handleRelaunchActivity(ActivityThread.java:3666)
E/AndroidRuntime(32431):    at android.app.ActivityThread.access$700(ActivityThread.java:141)
E/AndroidRuntime(32431):    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1240)
E/AndroidRuntime(32431):    at android.os.Handler.dispatchMessage(Handler.java:99)
E/AndroidRuntime(32431):    at android.os.Looper.loop(Looper.java:137)
E/AndroidRuntime(32431):    at android.app.ActivityThread.main(ActivityThread.java:5039)
E/AndroidRuntime(32431):    at java.lang.reflect.Method.invokeNative(Native Method)
E/AndroidRuntime(32431):    at java.lang.reflect.Method.invoke(Method.java:511)
E/AndroidRuntime(32431):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
E/AndroidRuntime(32431):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
E/AndroidRuntime(32431):    at dalvik.system.NativeStart.main(Native Method)
W/ActivityManager(  418):   Force finishing activity com.ada.ztc/.ZTCTabs

So what I need help with is figuring out why I'm getting that error on orientation change. I've done some research and haven't seemed to find anybody with a similar setup.

Any help would be appreciated, I'd be glad to provide more information if needed.

bbedward
  • 6,368
  • 7
  • 36
  • 59

2 Answers2

2

I seem to have resolved this by adding

android:configChanges="orientation|screenSize"

in the manifest for the FragmentActivity

bbedward
  • 6,368
  • 7
  • 36
  • 59
  • 2
    That's not resolving it; that's removing one way of triggering the issue. The activity can still be killed by the system when the user leaves the app for any reason, and you'll get the same crash (try turning on the "kill activities" option in the Developer Settings to see what I mean). You should still figure out and fix the underlying issue rather than hacking around it, or it'll bite you later. – Yoni Samlan Jan 23 '13 at 23:48
  • 1
    Beware android:configChanges="orientation|screenSize" this not update your layout after screen change. Sometimes i need different layouts for lan/port and this will not change it automatically. – Mertuarez Jan 25 '13 at 14:26
2
@Override
        public void onSaveInstanceState(Bundle outState) {
            outState.putString("BUGFIX", "BUGFIX");
            super.onSaveInstanceState(outState);
        }

try this. bundle is never empty

Mertuarez
  • 901
  • 7
  • 24
  • Thanks, this works, also some solutions from http://code.google.com/p/android/issues/detail?id=19211#c5 will work. – bbedward Jan 24 '13 at 23:29