【问题标题】:Support Library with ActionBar and Tabs带有 ActionBar 和 Tabs 的支持库
【发布时间】:2013-09-16 20:18:13
【问题描述】:

我有一个项目,我在其中使用 Android 支持库来包含适用于 3.0 之前的设备的 ActionBar。

我的项目中也有标签。标签是Fragments。这样,我从支持库中扩展了 Class android.support.v4.app.Fragment 中的每个 Tab。

但是,我对 3.0 之前的设备有疑问。没有显示操作栏。所以,也没有标签。

我找不到解决办法....

所以我的“主要活动”(处理带有选项卡的 ActionBar)看起来像这样:

public class Hauptmenue_extended extends ActionBarActivity implements
        OnClickListener {
actionBar = getSupportActionBar();
    actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);

    Tab tabB = actionBar.newTab();
    tabB.setText("Home");
    tabB.setIcon(R.drawable.icon_home);
    tabB.setTabListener(new TabListener<Startmenue_activity>(this, "Start",
            Startmenue_activity.class));
    actionBar.addTab(tabB);

    Tab tabA = actionBar.newTab();
    tabA.setText("");
    tabA.setIcon(R.drawable.icon_nachrichten_sel);
    tabA.setTabListener(new TabListener<Nachrichten_activity>(this,
            "Nachrichten", Nachrichten_activity.class));
    actionBar.addTab(tabA);

    Tab tabC = actionBar.newTab();
    tabC.setText("");
    tabC.setIcon(R.drawable.icon_favoriten);
    tabC.setTabListener(new TabListener<Favoriten_activity>(this,
            "Favoriten", Favoriten_activity.class));
    actionBar.addTab(tabC);

我的 TabListener 看起来像这样:

public static class TabListener<T extends Fragment> implements
        ActionBar.TabListener {

    private final FragmentActivity myActivity;
    private final String myTag;
    private final Class<T> myClass;

    public TabListener(FragmentActivity activity, String tag, Class<T> cls) {
        myActivity = activity;
        myTag = tag;
        myClass = cls;
    }

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

        Fragment myFragment = myActivity.getSupportFragmentManager()
                .findFragmentByTag(myTag);

        // Check if the fragment is already initialized
        if (myFragment == null) {
            // If not, instantiate and add it to the activity
            myFragment = Fragment
                    .instantiate(myActivity, myClass.getName());
            ft.add(android.R.id.content, myFragment, myTag);
        } else {
            // If it exists, simply attach it in order to show it
            ft.attach(myFragment);
        }

    }

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

        Fragment myFragment = myActivity.getSupportFragmentManager()
                .findFragmentByTag(myTag);

        if (myFragment != null) {
            // Detach the fragment, because another one is being attached
            ft.detach(myFragment);
        }

    }

    @Override
    public void onTabReselected(Tab tab, FragmentTransaction ft) {
        // TODO Auto-generated method stub

    }

}

每个 Fragment 或 Tab 看起来像这样:

public class Nachrichten_activity extends Fragment implements
    OnChildClickListener, OnClickListener { ...

有人有想法吗? :)

【问题讨论】:

  • 清单中的应用程序/活动主题怎么样?
  • 为什么要在 Activity 中实现 OnClickListener?
  • 我使用以下主题:
  • OnClickListener 是旧代码的一部分。但这并不能解决问题?
  • 不知道...?我无法解决问题..

标签: android android-fragments tabs android-support-library


【解决方案1】:

一些指针,不能确定什么可以解决您的问题

  • 使用@style/Theme.AppCompat.Light(在你的例子中什么是.Base?)
  • 不要将片段命名为“_activity”,这只会造成混淆。
  • 由于支持库中的错误,前 ICS 使用 R.id.action_bar_activity_content 而不是 android.R.id.content 。这将在以后的版本中修复。
  • 在 onTabSelected 中使用 ft.replace()

【讨论】:

  • 我想当您引用 appcompat-v7 r.19.0.0 或更高版本时,不再需要在 android.R.id.content 和 R.id.action_bar_activity_content 之间切换。 Chris Banes fixed an issue类似这个问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-03
  • 1970-01-01
  • 1970-01-01
  • 2012-11-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多