0

を含む私のTabHost中に奇妙な問題があります。FragmentActivityViewPager

問題は、アプリケーションの使用中に電話を閉じる (電源ボタンを押す) と、電話を元に戻すとアプリケーションが再度開かれると、この時点で myTabHostが見つからないことです。そのため、携帯電話を閉じると が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ますか?

どんな助けでも大歓迎です。

4

1 に答える 1

2

電話をスリープ状態にして電話をかけると、onDestroy は電話をオンに戻したときonPauseonStoponCreate が呼び出されないようにします。

onRestartonStartおよびonResume呼び出されます (アクティビティ ライフサイクル トレーニング アプリを変更して、すべてのライフサイクル メソッドにログ メッセージを追加することにより、Nexus 7 でチェックされます) initialiseTabHost。そこに関連する部分を追加します。onCreateonStartonCreateonRestart

更新 (Emil Adz): あなたが提案したように、onResumeメソッドを追加し、次のように変更しました。

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

私のチェックでは、問題が解決したようです。どうもありがとうございました。

編集 (Julien):あなたonResumeを見て、なぜ mTab​​Host がnull. 後で行う必要のある初期化のために表示されonStopないことを期待していましたが、完全になくなるとは思っていませんでした。

理想的には、mTabHost が最終的に存在する理由を突き止める必要がnullあります。問題は、バグを再現できないことです。アクセスできないすべてのクラスのコードを削除すると、次のアクティビティが表示され、3 つのタブが表示され、デバイスをスリープ状態にして起動したときにも表示されます。

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>

そのコードはデバイスで機能しますか、それともタブが消えますか?

于 2013-06-24T11:18:27.223 に答える