1

TabBarSherlock とサポート ライブラリを使用してアプリを構築し、3.0 より前のデバイスに ActionBar サポートを追加しました。タブとリスナーを作成するために従ったチュートリアルを思い出せませんが、次のコードがあります。

最初にタブを作成します (SherlockFragmentActivity 内):

ActionBar actionBar = getSupportActionBar();
actionBar.setDisplayShowTitleEnabled(false);
actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);

/*--------Setup News Tab--------*/
Tab tab1 = actionBar.newTab()
        .setText("News")
        .setTabListener(new TabListener<TabFragment>(
                        this, "tab1", TabFragment.class));
Bundle newsBundle = new Bundle();
newsBundle.putInt("news_id", newsID);
tab1.setTag(newsBundle);
actionBar.addTab(tab1);
/*------------------------------*/
// This is repeated 3 more times to total 4 Tabs.

TabListener次に、これらのタブが選択されたことを検出するためにこれらの各タブで使用されるclassCalledがあります。

public class TabListener<T extends Fragment> implements ActionBar.TabListener{
    private TabFragment 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;
    }

    public void onTabSelected(Tab tab, FragmentTransaction ft) {
        // Check if the fragment is already initialised
        if (mFragment == null) {
             Log.v("FRAGMENT", "FRAGMENT NEEDS TO BE CREATED");
             mFragment = (TabFragment) Fragment.instantiate(mActivity, mClass.getName(), (Bundle)tab.getTag());
             ft.add(android.R.id.content, mFragment, mTag);
        } else {
            Log.v("FRAGMENT", "FRAGMENT ALREADY CREATED");
            ft.show(mFragment);
        }
    }

    public void onTabUnselected(Tab tab, FragmentTransaction ft) {
        if (mFragment != null) {
            ft.hide(mFragment);
        }
    }

    @Override
    public void onTabReselected(Tab tab, FragmentTransaction ft) {
    }
}

for each TabTabFragmentを含むクラスを使用します。ViewPager私の問題は、最初のタブ以外のタブを選択すると、フラグメント内のコンテンツが表示されないことです。フラグメントが初期化されたときのログから、表示されていないだけでビューが作成されていることがわかります。これは背景を示す空白の領域です。

4

3 に答える 3

0

と を使用する代わりに、show()hide()を使用attach()detach()ます。show/hide を使用しても、ビュー階層が画面から削除されず、単に非表示になるため、それに関連する問題が発生する可能性があります。

于 2013-09-17T04:13:54.253 に答える
0

フラグメントを切り離しているのではなく、単に隠しているだけです。そのため、他のフラグメントが にアタッチされるようにデタッチする必要がありますonTabUnSelected

FragmentManagerは、構成の変更時に現在表示されているフラグメント (および履歴) を自動的に復元します。findFragmentByTag新しいインスタンスを作成してアタッチする前に、ターゲット フラグメントのインスタンスが既に存在するかどうかを確認するために呼び出します。

例:

public void onTabSelected(Tab tab, FragmentTransaction ft) {
    SherlockFragment preInitializedFragment = (SherlockFragment) mActivity.getSupportFragmentManager().findFragmentByTag(mTag);

    // Check if the fragment is already initialized
    if (mFragment == null && preInitializedFragment == null) {
        // If not, instantiate and add it to the activity
        mFragment = (SherlockFragment) SherlockFragment.instantiate(mActivity, mClass.getName());
        ft.add(android.R.id.content, mFragment, mTag);
    } else if (mFragment != null) {
        // If it exists, simply attach it in order to show it
        ft.attach(mFragment);
    } else if (preInitializedFragment != null) {
        ft.attach(preInitializedFragment);
        mFragment = preInitializedFragment;
    }
}

そして、あなたonTabUnSelectedはこうあるべきです

public void onTabUnselected(Tab tab, FragmentTransaction ft) {
        if (mFragment != null) {
            // Detach the fragment, because another one is being attached
            ft.detach(mFragment);
        }
    }
于 2013-09-17T08:01:05.770 に答える