I have a weird issue with my TabHost in my FragmentActivity that contains a ViewPager.
The problem is that when I close my phone (press the power button) while I use my application, and then I turn back the phone and my application gets reopened, at this point my TabHost is missing. So the closing of my phone is causes the TabHost to disappear.
My guess would be that I need to save my tabHost state in the saveInstanceState object, and restore it in onResume I only have no idea how it's done. here is my code for the FragmentActivity:
public class TabsViewPagerFragmentActivity extends FragmentActivity implements ViewPager.OnPageChangeListener, TabHost.OnTabChangeListener
{
static final String TAG = TabsViewPagerFragmentActivity.class.getSimpleName();
private TabHost mTabHost;
private ViewPager mViewPager;
private HashMap<String, TabInfo> mapTabInfo;
public ViewPagerAdapter mPagerAdapter;
private TextView tvReportName, tvTabTitle;
private Button bBackToParameters;
private Dialog progressDialog;
private SGRaportManagerAppObj application;
private int numberOfTabs = 0;
private Display display;
public static final int POPUP_MARGIN = 6;
LeftSideMenu leftSideMenu;
public void NotifyTabActivityViewPagerAdapter()
{
mPagerAdapter.notifyDataSetChanged();
}
public ViewPagerAdapter getTabActivityViewPagerAdapter()
{
return mPagerAdapter;
}
public ViewPager getTabActivityViewPager()
{
return mViewPager;
}
public void setCurrentTabTitle (String title)
{
tvTabTitle.setText(title);
Log.d(TAG, "set tab title from activity: "+title);
}
/**
* Maintains extrinsic info of a tab's construct
*/
private class TabInfo
{
private String tag;
private Class<?> clss;
private Bundle args;
private Fragment fragment;
TabInfo(String tag, Class<?> clazz, Bundle args)
{
this.tag = tag;
this.clss = clazz;
this.args = args;
}
}
/**
* A simple factory that returns dummy views to the Tabhost
*/
class TabFactory implements TabContentFactory {
private final Context mContext;
/**
* @param context
*/
public TabFactory(Context context) {
mContext = context;
}
/** (non-Javadoc)
* @see android.widget.TabHost.TabContentFactory#createTabContent(java.lang.String)
*/
public View createTabContent(String tag) {
View v = new View(mContext);
v.setMinimumWidth(0);
v.setMinimumHeight(0);
return v;
}
}
/** (non-Javadoc)
* @see android.support.v4.app.FragmentActivity#onCreate(android.os.Bundle)
*/
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
application = SGRaportManagerAppObj.getInstance();
display = ((WindowManager)getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay();
// Inflate the layout
setContentView(R.layout.tabs_screen_activity_layout);
tvTabTitle = (TextView) findViewById(R.id.tvTabName);
tvReportName = (TextView)findViewById(R.id.tvReportName);
tvReportName.setText(application.currentReport.getName()+ " - ");
bBackToParameters = (Button) findViewById(R.id.bBackToParameters);
leftSideMenu = (LeftSideMenu) findViewById(R.id.leftSideMenu);
applyOnClickListenerToLeftSideMenu();
findViewById(R.id.showLeftMenuButton).setOnClickListener(new View.OnClickListener()
{
@Override
public void onClick(View v)
{
Display d = ((WindowManager)getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay();
int width = d.getWidth();
View panel = findViewById(R.id.leftSideMenu);
View appPanel = findViewById(R.id.appLayout);
if (panel.getVisibility() == View.GONE){
appPanel.setLayoutParams(new LinearLayout.LayoutParams(width, LayoutParams.FILL_PARENT));
panel.setVisibility(View.VISIBLE);
applyOnClickListenerToLeftSideMenu();
}else{
ToggleButton button = (ToggleButton) findViewById(R.id.showLeftMenuButton);
button.setChecked(false);
panel.setVisibility(View.GONE);
}
}
});
// Initialise the TabHost
progressDialog = DialogUtils.createProgressDialog(this, this.getString(R.string.populating_view_pager));
progressDialog.show();
if (SGRaportManagerAppObj.getInstance().parametersRepository.getParametersRepository().size() == 0)
{
bBackToParameters.setText(R.string.back_to_report_list);
}
this.initialiseTabHost(savedInstanceState);
if (savedInstanceState != null) {
mTabHost.setCurrentTabByTag(savedInstanceState.getString("tab")); //set the tab as per the saved state
}
// Intialise ViewPager
this.intialiseViewPager();
progressDialog.dismiss();
}
/** (non-Javadoc)
* @see android.support.v4.app.FragmentActivity#onSaveInstanceState(android.os.Bundle)
*/
protected void onSaveInstanceState(Bundle outState) {
outState.putString("tab", mTabHost.getCurrentTabTag()); //save the tab selected
super.onSaveInstanceState(outState);
}
/**
* Initialise ViewPager
*/
public void intialiseViewPager()
{
List<Fragment> fragments = new Vector<Fragment>();
// TabInfo tabInfo = null;
if (application.getCurrentDataSource().equals(DataSource.SSRS))
{
numberOfTabs = application.currentReport.getTabsList().size();
}
else if (application.getCurrentDataSource().equals(DataSource.SGRDL))
{
numberOfTabs = application.currentReport.getODTabsList().size();
Log.d(TAG, "CURRENT REPORT FROM VIEW PAGER: "+ application.currentReport.toString());
}
Log.d(TAG,"Current Tabs number from TabsViewPager activity: " +numberOfTabs);
if (application.getCurrentDataSource().equals(DataSource.SSRS))
{
for (int i = 0; i < numberOfTabs; i++)
{
Tab tempTab = application.currentReport.getTabsList().get(i);
if (tempTab.getTabTemplateId() == 7)
{
GridFragment gridFragment = new GridFragment(tempTab);
fragments.add(gridFragment);
}
else if (tempTab.getTabTemplateId() == 8)
{
NewChartFragment chartFragment = new NewChartFragment(tempTab, this);
fragments.add(chartFragment);
}
}
}
else if (application.getCurrentDataSource().equals(DataSource.SGRDL))
{
for (int i = 0; i < numberOfTabs; i++)
{
ODTab tempTab = application.currentReport.getODTabsList().get(i);
if (tempTab.getTabType().equals(ODGrid.XML_GRID_ELEMENT))
{
GridFragment gridFragment = GridFragment.newInstance(tempTab.getTabId());
fragments.add(gridFragment);
}
else if (tempTab.getTabType().equals(ODChart.XML_CHART_ELEMENT))
{
NewChartFragment chartFragment = NewChartFragment.newInstance(tempTab.getTabId());
fragments.add(chartFragment);
}
}
}
Log.d(TAG, "Current report fragments set to adapter: "+fragments.toString());
/*
if (this.mPagerAdapter == null)
{
this.mPagerAdapter = new ViewPagerAdapter(super.getSupportFragmentManager(), fragments);
}
else
{
this.mPagerAdapter.removeAllFragments();
this.mPagerAdapter.addFragmentsListToAdapter(fragments);
}
*/
this.mPagerAdapter = new ViewPagerAdapter(super.getSupportFragmentManager(), fragments);
this.mViewPager = (ViewPager)super.findViewById(R.id.pager);
// this.mViewPager.setAdapter(null);
this.mViewPager.setAdapter(this.mPagerAdapter);
this.mViewPager.setOffscreenPageLimit(0);
this.mViewPager.setOnPageChangeListener(this);
Log.d(TAG, "Adapter initialized!");
}
/**
* Initialise the Tab Host
*/
public void initialiseTabHost(Bundle args) {
mTabHost = (TabHost)findViewById(android.R.id.tabhost);
/*
//new edit
if (mTabHost.getChildCount() > 0)
{
mTabHost.removeAllViews();
}
*/
mTabHost.setup();
TabInfo tabInfo = null;
mapTabInfo = new HashMap<String, TabsViewPagerFragmentActivity.TabInfo>();
if (args != null)
{}
else
{
if (application.getCurrentDataSource().equals(DataSource.SSRS))
{
int numberOfTabs = application.currentReport.getTabsList().size();
for (int i = 0; i < numberOfTabs; i++)
{
Tab tempTab = application.currentReport.getTabsList().get(i);
if (tempTab.getTabTemplateId() == 7)
{
//GridFragment gridFragment = new GridFragment(tempTab);
TabsViewPagerFragmentActivity.AddTab(this, this.mTabHost, this.mTabHost.newTabSpec("Tab "+String.valueOf(i)).setIndicator("Tab "+String.valueOf(i)), ( tabInfo = new TabInfo("Tab "+String.valueOf(i), GridFragment.class, args)));
this.mapTabInfo.put(tabInfo.tag, tabInfo);
}
else if (tempTab.getTabTemplateId() == 8)
{
TabsViewPagerFragmentActivity.AddTab(this, this.mTabHost, this.mTabHost.newTabSpec("Tab "+String.valueOf(i)).setIndicator("Tab "+String.valueOf(i)), ( tabInfo = new TabInfo("Tab "+String.valueOf(i), NewChartFragment.class, args)));
this.mapTabInfo.put(tabInfo.tag, tabInfo);
}
}
}
else if (application.getCurrentDataSource().equals(DataSource.SGRDL))
{
int numberOfTabs = application.currentReport.getODTabsList().size();
for (int i = 0; i < numberOfTabs; i++)
{
ODTab tempTab = application.currentReport.getODTabsList().get(i);
// Log.d(TAG,"Crashed Tab type: "+ tempTab.getTabType());
if (tempTab.getTabType().equals(ODGrid.XML_GRID_ELEMENT))
{
//GridFragment gridFragment = new GridFragment(tempTab);
TabsViewPagerFragmentActivity.AddTab(this, this.mTabHost, this.mTabHost.newTabSpec("Tab "+String.valueOf(i)).setIndicator("Tab "+String.valueOf(i)), ( tabInfo = new TabInfo("Tab "+String.valueOf(i), GridFragment.class, args)));
this.mapTabInfo.put(tabInfo.tag, tabInfo);
}
else if (tempTab.getTabType().equals(ODChart.XML_CHART_ELEMENT))
{
TabsViewPagerFragmentActivity.AddTab(this, this.mTabHost, this.mTabHost.newTabSpec("Tab "+String.valueOf(i)).setIndicator("Tab "+String.valueOf(i)), ( tabInfo = new TabInfo("Tab "+String.valueOf(i), NewChartFragment.class, args)));
this.mapTabInfo.put(tabInfo.tag, tabInfo);
}
}
}
}
// Default to first tab
//this.onTabChanged("Tab1");
//
mTabHost.setOnTabChangedListener(this);
}
/**
* Add Tab content to the Tabhost
* @param activity
* @param tabHost
* @param tabSpec
* @param clss
* @param args
*/
private static void AddTab(TabsViewPagerFragmentActivity activity, TabHost tabHost, TabHost.TabSpec tabSpec, TabInfo tabInfo)
{
// Attach a Tab view factory to the spec
ImageView indicator = new ImageView(activity.getBaseContext());
indicator.setPadding(10, 10, 10, 10);
indicator.setImageResource(R.drawable.tab_select_icon_selector);
LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT);
lp.setMargins(10, 10, 10, 10);
indicator.setLayoutParams(lp);
tabSpec.setIndicator(indicator);
tabSpec.setContent(activity.new TabFactory(activity));
tabHost.addTab(tabSpec);
}
/** (non-Javadoc)
* @see android.widget.TabHost.OnTabChangeListener#onTabChanged(java.lang.String)
*/
public void onTabChanged(String tag) {
//TabInfo newTab = this.mapTabInfo.get(tag);
int pos = this.mTabHost.getCurrentTab();
this.mViewPager.setCurrentItem(pos);
}
/* (non-Javadoc)
* @see android.support.v4.view.ViewPager.OnPageChangeListener#onPageScrolled(int, float, int)
*/
@Override
public void onPageScrolled(int position, float positionOffset,
int positionOffsetPixels) {
// TODO Auto-generated method stub
}
/* (non-Javadoc)
* @see android.support.v4.view.ViewPager.OnPageChangeListener#onPageSelected(int)
*/
@Override
public void onPageSelected(int position) {
// TODO Auto-generated method stub
this.mTabHost.setCurrentTab(position);
}
/* (non-Javadoc)
* @see android.support.v4.view.ViewPager.OnPageChangeListener#onPageScrollStateChanged(int)
*/
@Override
public void onPageScrollStateChanged(int state) {
// TODO Auto-generated method stub
}
How would one save the state of the TabHost and restore it in onResume?
Any help would be very appreciated.