2013-06-16 2 views
0

У меня есть странная проблема с моим TabHost в моем FragmentActivity, который содержит ViewPager.TabHost исчезает после блокировки телефона и его повторного открытия:

Проблема заключается в том, что когда я закрываю свой телефон (нажмите кнопку питания), пока я использую свое приложение, а затем я возвращаю телефон, и мое приложение снова открывается, и в этот момент мой TabHost отсутствует. Поэтому закрытие моего телефона приводит к исчезновению TabHost.

Я предполагаю, что мне нужно сохранить состояние tabHost в объекте saveInstanceState и восстановить его в onResume Я только не знаю, как это делается. вот мой код 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 

} 

Как бы один сохранить состояние TabHost и восстановить его в onResume?

Любая помощь будет очень признательна.

+0

Появляется ли «TabHost» в более поздней точке? вы тестировали это на разных версиях Android? – Luksprog

ответ

1

При надевании телефона и onStop вызывается, но onDestroy не делает так, чтобы onCreate не вызывался при включении телефона.

onRestart, onStart и onResume же дозвонились (проверен на Nexus 7, изменяя активность Lifecycle обучения приложения для добавления Вход сообщений во всех методах жизненного цикла), поэтому пытается двигаться как много коды в initialiseTabHost как вы можете от onCreate до onStart, оставляя только минимум, необходимый в onCreate, или оставьте его там и добавьте соответствующую его часть в onRestart.

Update (Эмиль Adz): Как вы предложили, чтобы я добавил метод onResume и изменил его следующим образом:

@Override 
protected void onResume() { 
    super.onResume(); 
    if (mTabHost == null) 
    { 
     this.initialiseTabHost(null); 
    } 
} 

С моей проверки он выглядит, как если бы это решить мою проблему, спасибо ,

Edit (Julien): Глядя на ваш onResume мне интересно, почему mTabHost является null. Я ожидал, что он не появился из-за некоторой инициализации, которую нужно было сделать после onStop, но я не ожидал, что она полностью исчезнет.

В идеале мы должны выяснить, почему mTabHost заканчивается null, и проблема в том, что я не могу воспроизвести ошибку. Если я потрошить код каждого класса не имеют доступа к я получаю следующее деятельность, которая отображает 3 вкладки и все еще отображает их, когда я поставил устройство спать andwake его:

package com.example.tabhost; 

import android.content.Context; 
import android.os.Bundle; 
import android.support.v4.app.Fragment; 
import android.support.v4.app.FragmentActivity; 
import android.support.v4.view.ViewPager; 
import android.util.Log; 
import android.view.Display; 
import android.view.View; 
import android.view.WindowManager; 
import android.widget.ImageView; 
import android.widget.LinearLayout; 
import android.widget.TabHost; 
import android.widget.TabHost.TabContentFactory; 
import android.widget.TextView; 

public class TabsViewPagerFragmentActivity extends FragmentActivity implements ViewPager.OnPageChangeListener, TabHost.OnTabChangeListener 
{ 
    static final String TAG = TabsViewPagerFragmentActivity.class.getSimpleName(); 
    private TabHost mTabHost; // TabHost? Why not a FragmentTabHost? 
    private ViewPager mViewPager; 
    private TextView tvTabTitle; 
    private Display display; 
    public static final int POPUP_MARGIN = 6; 

    public void NotifyTabActivityViewPagerAdapter() {} 

    public boolean getTabActivityViewPagerAdapter() 
    { 
     return true; 
    } 

    public ViewPager getTabActivityViewPager() 
    { 
     return mViewPager; 
    } 

    public void setCurrentTabTitle (String title) 
    { 
     tvTabTitle.setText(title); 
     Log.d(TAG, "set tab title from activity: "+title); 
    } 

    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; 
     } 
    } 

    class TabFactory implements TabContentFactory { 

     private final Context mContext; 

     public TabFactory(Context context) { 
      mContext = context; 
     } 

     public View createTabContent(String tag) { 
      View v = new View(mContext); 
      v.setMinimumWidth(0); 
      v.setMinimumHeight(0); 
      return v; 
     } 
    } 

    public void onCreate(Bundle savedInstanceState) 
    { 
     super.onCreate(savedInstanceState); 
     display = ((WindowManager)getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay(); 
     // Inflate the layout 
     setContentView(R.layout.activity_main); 

     // Initialise the TabHost 
     this.initialiseTabHost(savedInstanceState); 

     if (savedInstanceState != null) { 
      mTabHost.setCurrentTabByTag(savedInstanceState.getString("tab")); //set the tab as per the saved state 
     } 
    } 

    protected void onSaveInstanceState(Bundle outState) { 
     outState.putString("tab", mTabHost.getCurrentTabTag()); //save the tab selected 
     super.onSaveInstanceState(outState); 
    } 

    public void initialiseTabHost(Bundle args) { 
     mTabHost = (TabHost)findViewById(android.R.id.tabhost); 

     /* 
     * Why not use a FragmentTabHost and setup (Context context, FragmentManager manager, int containerId) 
     * see: http://getquery.com/android-fragment-tab-example/ 
     */ 
     mTabHost.setup(); 


     int numberOfTabs = 3;//application.currentReport.getTabsList().size(); 
     for (int i = 0; i < numberOfTabs; i++) 
     { 
      String str = "Tab " + String.valueOf(i); 

      TabsViewPagerFragmentActivity.AddTab(this, this.mTabHost, this.mTabHost.newTabSpec(str).setIndicator(str), null); 
     } 
     mTabHost.setOnTabChangedListener(this); 
    } 

    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.ic_launcher); 
     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); 
    } 

    @Override 
    public void onStart() { 
     super.onStart(); 
     Log.e("onStart", "mTabHost = " + mTabHost); 
    } 

    public void onTabChanged(String tag) { 
     //TabInfo newTab = this.mapTabInfo.get(tag); 
     int pos = this.mTabHost.getCurrentTab(); 
     this.mViewPager.setCurrentItem(pos); 
    } 

    @Override 
    public void onPageScrolled(int position, float positionOffset, 
      int positionOffsetPixels) { 
    } 

    @Override 
    public void onPageSelected(int position) { 
     this.mTabHost.setCurrentTab(position); 
    } 

    @Override 
    public void onPageScrollStateChanged(int state) { 
    } 
} 

Я использовал этот макет (от http://getquery.com/android-fragment-tab-example/):

<TabHost 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@android:id/tabhost" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent"> 

    <LinearLayout 
     android:orientation="vertical" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent"> 

     <TabWidget 
      android:id="@android:id/tabs" 

      android:orientation="horizontal" 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      android:layout_weight="0"/> 

     <FrameLayout 
      android:id="@android:id/tabcontent" 
      android:layout_width="0dp" 
      android:layout_height="0dp" 
      android:layout_weight="0"/> 

     <FrameLayout 
      android:id="@+id/realtabcontent" 
      android:layout_width="match_parent" 
      android:layout_height="0dp" 
      android:layout_weight="1"/> 

    </LinearLayout> 
</TabHost> 

ли, что код работает на устройстве или сделать ваши вкладки еще деваться?

+0

Я попробую это и дам вам знать, что является результатом, спасибо за вашу готовность помочь. –

+0

Не могли бы вы просто сказать мне, почему в конце концов вы сказали, что, может быть, лучше перейти на onRestart и no onResume? каковы различия между ними? –

+0

Я бы избегал 'onResume', потому что когда' onResume' называется активным, активность уже виден, и вы хотите добавить свой 'TabHost' до этого, иначе ваша деятельность будет показана без него, а затем добавит его (это может быть не видно из-за скорости добавив его, но лучше не рисковать, если только вам не понадобится). –

Смежные вопросы