2

わかりました、FragmentManager から継承するクラスがあります。このクラス内には、いくつかのフラグメント タブを作成して TabHost に挿入する FragmentPagerAdapter があります。コードは正常にコンパイルされ、機能します。これらのクラスの一部を以下に示します。私はこれを行うために使用しています android supprt package v4

public class TabMenu extends FragmentActivity implements TabHost.OnTabChangeListener, ViewPager.OnPageChangeListener{
...
@Override
public void onCreate(Bundle savedInstanceState){
    super.onCreate(savedInstanceState);
    setContentView(R.layout.tabs_container);
    setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
    tabHost = (TabHost)findViewById(android.R.id.tabhost);
    tabHost.setup();

    viewPager = (ViewPager)findViewById(R.id.viewpager);

    ...

    menuAdapter = new MenuPagerAdapter(this, tabHost, viewPager);
    menuAdapter.addTab("meutime", "Meu Time", MeuTime.class, extras);
    ...
    tabHost.setOnTabChangedListener(this);
    viewPager.setOnPageChangeListener(this);
            ...

public class MenuPagerAdapter extends FragmentPagerAdapter{
    public MenuPagerAdapter(FragmentActivity fragmentActivity, TabHost tabHost, ViewPager viewPager) {
        ...
    }

    @Override
    public Fragment getItem(int position) {
        String currentFragment = tabNames.get(position);
        return fragmentManager.findFragmentByTag(currentFragment);
    }

    @Override
    public int getCount() {
        // TODO Auto-generated method stub
        return tabNames.size();
    }

    public void addTab(String tag, String tabLabel, Class<?> cls, Bundle bundle){
        TabHost.TabSpec tabSpec = tabHost.newTabSpec(tag).setIndicator(createTab(tabLabel));
        Intent intent = new Intent();
        intent.setClass(context, cls);
        intent.putExtras(bundle);
        tabSpec.setContent(intent);
        tabNames.add(tag);
        tabHost.addTab(tabSpec);
        notifyDataSetChanged();
    }

    private View createTab(String tabLabel){
        View view = LayoutInflater.from(context).inflate(R.layout.tab_spec_layout, null, false);
        ...
        return view;
    }
}

この FragmentActivity をインスタンス化すると、次の例外が発生しました。

java.lang.IllegalStateException: Did you forget to call 'public void setup(LocalActivityManager activityGroup)'?

Android 開発者のサイトを読むと、LocalActivityManager は非推奨です。ただし、TabHost.setup(LocalActivityManager) で使用されます。このクラスが廃止された場合、この場合の解決策はありますか? TabContentFactory を使用できません。

4

1 に答える 1

0

残念ながら、私はTabContentFactoryを使用しました。個人的には、このソリューションで空のビューを作成するのは好きではありませんでしたが、機能します。

public void addTab(String tag, final String tabLabel, Class<?> cls, Bundle bundle){
        TabHost.TabSpec tabSpec = tabHost.newTabSpec(tag).setIndicator(createTab(tabLabel));
        tabSpec.setContent(new TabHost.TabContentFactory() {
            public View createTabContent(String tag) {
                View view = new View(context);
                view.setMinimumHeight(0);
                view.setMinimumWidth(0);
                return view;
            }
        });

        fragContentInstances.add(new FragContentInfos(cls, bundle));
        tabHost.addTab(tabSpec);
        notifyDataSetChanged();
    }

    private class FragContentInfos{
        private Class<?> cls;
        private Bundle bundle;
        public FragContentInfos(Class<?> cls, Bundle bundle){
            this.cls = cls;
            this.bundle = bundle;
        }
    }
于 2012-07-05T15:22:28.550 に答える