Android 带有支持库的ActionBar选项卡

Android 带有支持库的ActionBar选项卡,android,android-fragments,android-support-library,Android,Android Fragments,Android Support Library,我遇到的问题是,在Android 2.3.7上不会显示操作栏,但在4.x+上可以正常工作。我的应用程序的其余部分在支持v7和v4库的情况下运行良好,正是这一方面给我带来了麻烦 下面是它的外观,如4.3所示: 下面是2.3.7中的内容: 在我的onCreate方法(从ActionBarActivity继承的类)中,我有以下内容: // setup action bar for tabs ActionBar actionBar = getSupportActionBar();

我遇到的问题是,在Android 2.3.7上不会显示操作栏,但在4.x+上可以正常工作。我的应用程序的其余部分在支持v7和v4库的情况下运行良好,正是这一方面给我带来了麻烦

下面是它的外观,如4.3所示:

下面是2.3.7中的内容:

在我的onCreate方法(从ActionBarActivity继承的类)中,我有以下内容:

    // setup action bar for tabs
    ActionBar actionBar = getSupportActionBar();
    actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
    actionBar.setDisplayHomeAsUpEnabled(true);
    actionBar.setDisplayShowTitleEnabled(true);


    Tab tab = actionBar.newTab()
            .setText(R.string.details)
            .setTabListener(new TabListener<DetailsFragmentOne>(
                    this, "one", DetailsFragmentOne.class));
    actionBar.addTab(tab);

    tab = actionBar.newTab()
        .setText(R.string.grades)
        .setTabListener(new TabListener<DetailsFragmentTwo>(
                this, "one", DetailsFragmentTwo.class));
    actionBar.addTab(tab);
//设置选项卡的操作栏
ActionBar ActionBar=getSupportActionBar();
actionBar.setNavigationMode(actionBar.NAVIGATION\u MODE\u选项卡);
actionBar.setDisplayHomeAsUpEnabled(true);
actionBar.setDisplayShowTitleEnabled(true);
Tab=actionBar.newTab()
.setText(R.string.details)
.setTabListener(新的TabListener(
这个“一”,DetailsFragmentOne.class);
actionBar.addTab(tab);
tab=actionBar.newTab()
.setText(R.string.grades)
.setTabListener(新的TabListener(
这个“一”,DetailsFragmentTwo.class);
actionBar.addTab(tab);
这是我的TabListener,一个内部类:

/**
 * This is copied almost verbatim from <a href="http://developer.android.com/guide/topics/ui/actionbar.html#Tabs">the ActionBar Tabs API Guide</a>.
 * @param <T>
 */
public class TabListener<T extends Fragment> implements ActionBar.TabListener {
    private Fragment mFragment;
    private final Activity mActivity;
    private final String mTag;
    private final Class<T> mClass;

    /** Constructor used each time a new tab is created.
      * @param activity  The host Activity, used to instantiate the fragment
      * @param tag  The identifier tag for the fragment
      * @param clz  The fragment's Class, used to instantiate the fragment
      */
    public TabListener(Activity activity, String tag, Class<T> clz) {
        mActivity = activity;
        mTag = tag;
        mClass = clz;
    }

    /* The following are each of the ActionBar.TabListener callbacks */

    public void onTabSelected(Tab tab, FragmentTransaction ft) {
        FragmentTransaction sft = ((FragmentActivity) mActivity).getSupportFragmentManager().beginTransaction();
        mFragment = getSupportFragmentManager().findFragmentByTag(mTag);
        // Check if the fragment is already initialized
        if (mFragment == null) {
            // If not, instantiate and add it to the activity
            mFragment = Fragment.instantiate(mActivity, mClass.getName());
            // calling commit() here because we're not using the provided FragmentTransaction
            sft.replace(android.R.id.content, mFragment, mTag).commit();
        } else {
            // If it exists, simply attach it in order to show it
            // calling commit() here because we're not using the provided FragmentTransaction
            sft.replace(android.R.id.content, mFragment).commit();
        }
    }

    public void onTabUnselected(Tab tab, FragmentTransaction ft) {
        FragmentTransaction sft = ((FragmentActivity) mActivity).getSupportFragmentManager().beginTransaction();
        mFragment = getSupportFragmentManager().findFragmentByTag(mTag);
        if (mFragment != null) {
             // calling commit() here because we're not using the provided FragmentTransaction
            sft.replace(android.R.id.content, mFragment).commit();
        }
    }

    public void onTabReselected(Tab tab, FragmentTransaction ft) {          
        FragmentTransaction sft = ((FragmentActivity) mActivity).getSupportFragmentManager().beginTransaction();
        mFragment = getSupportFragmentManager().findFragmentByTag(mTag);
        if (mFragment != null) {
             // calling commit() here because we're not using the provided FragmentTransaction
            sft.replace(android.R.id.content, mFragment).commit();
        }
    }

}
/**
*这几乎是一字不差地复制自。
*@param
*/
公共类TablListener实现ActionBar.TablListener{
私人碎片;
私人最终活动能力;
私有最终字符串mTag;
私人期末班;
/**每次创建新选项卡时使用的构造函数。
*@param activity主机活动,用于实例化片段
*@param标记片段的标识符标记
*@param clz片段的类,用于实例化片段
*/
公共TabListener(活动、字符串标记、类clz){
活动性=活动性;
mTag=标签;
mClass=clz;
}
/*下面是ActionBar.TabListener回调的每个部分*/
已选择的公共事务(选项卡,碎片事务ft){
FragmentTransaction sft=((FragmentActivity)MacActivity).getSupportFragmentManager().beginTransaction();
MFFragment=getSupportFragmentManager().findFragmentByTag(mTag);
//检查片段是否已初始化
if(mFragment==null){
//如果不是,则实例化并将其添加到活动中
MFFragment=Fragment.instantiate(mActivity,mClass.getName());
//在这里调用commit(),因为我们没有使用提供的FragmentTransaction
replace(android.R.id.content、mf片断、mTag.commit();
}否则{
//如果存在,只需将其附加以显示即可
//在这里调用commit(),因为我们没有使用提供的FragmentTransaction
替换(android.R.id.content,mf片断).commit();
}
}
已选择公共空页(选项卡,碎片事务ft){
FragmentTransaction sft=((FragmentActivity)MacActivity).getSupportFragmentManager().beginTransaction();
MFFragment=getSupportFragmentManager().findFragmentByTag(mTag);
if(mFragment!=null){
//在这里调用commit(),因为我们没有使用提供的FragmentTransaction
替换(android.R.id.content,mf片断).commit();
}
}
已重新选择“公共无效”选项卡(选项卡,碎片事务处理ft){
FragmentTransaction sft=((FragmentActivity)MacActivity).getSupportFragmentManager().beginTransaction();
MFFragment=getSupportFragmentManager().findFragmentByTag(mTag);
if(mFragment!=null){
//在这里调用commit(),因为我们没有使用提供的FragmentTransaction
替换(android.R.id.content,mf片断).commit();
}
}
}
我已经看到了另外两个问题,并试图实现这些答案,但我仍然有这个问题

编辑: 根据要求,应用的主题只是支持库的AppCompat.Light.DarkActionBar主题,没有覆盖,如下所示:

<style name="Theme.MyTheme" parent="@style/Theme.AppCompat.Light.DarkActionBar">
</style>

如果删除DetailFragment的背景,操作栏和选项卡实际上会出现在DetailFragment后面。在您的FragmentTransaction中调用replace时,在主布局中创建您自己的容器并使用R.id.yourcontent,而不是android.R.id.content。通过做出这一改变,我在2.3.3和4+上成功了

似乎2.3.3将ActionBar添加到根视图元素,其中4+将其添加到根视图之外

sft.replace(R.id.yourcontent, mFragment).commit();
你应该看报纸

不能在每个回调中为片段事务调用commit()。系统会为您调用它,如果您自己调用它,它可能会引发异常。您也不能将这些片段事务添加到后堆栈中


你的应用程序使用哪个主题?@Ahmad,它使用的是动作条compat主题。正如我所提到的,我在应用程序中有其他视图使用ActionBar,这很好,只是一个没有显示选项卡的视图。你能为4.x+和2.3.7粘贴样式文件吗?@OnurA。我已经包括了主题。你们两个都使用相同的风格吗?我的意思是,value-v11和values-v14文件夹的样式文件都是相同的?谢谢您的回答。节省了我很多工作。真是太棒了。