2

我创建了一个包含操作栏和两个选项卡的应用程序。应用程序的选项卡和标题与屏幕截图中的相同。我希望标签位于标题下方的行中并且具有相同的权重。请查看下面的代码并帮助我。谢谢。

package com.example.myproj;

import java.util.ArrayList;

import android.os.Bundle;
import android.app.ActionBar;
import android.app.Activity;
import android.app.Fragment;
import android.app.FragmentTransaction;
import android.app.ActionBar.Tab;
import android.content.Context;
import android.view.Menu;
import android.widget.Toast;

public class MainActivity1 extends Activity {
    public static Context appContext;
    static ArrayList<String> myarray = new ArrayList();
    static ArrayList<String> myarray1;
    static ArrayList<String> myarray2 = new ArrayList();
    static ArrayList<String> myarray21;
    static int check1 = 0;
    static int check2 = 0;
    static int stcount = 0;
    static int csicount = 0;
    static ActionBar.Tab PlayerTab;
    static ActionBar.Tab StationsTab;

    /** Called when the activity is first created. */
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        appContext = getApplicationContext();

        ActionBar actionbar = getActionBar();
        actionbar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);

        PlayerTab = actionbar.newTab().setText("ST");
        StationsTab = actionbar.newTab().setText("CSI");
        // settab1("Testing");
        Fragment PlayerFragment = new AFragment();
        Fragment StationsFragment = new BFragment();

        PlayerTab.setTabListener(new MyTabsListener(PlayerFragment));
        StationsTab.setTabListener(new MyTabsListener(StationsFragment));

        actionbar.addTab(PlayerTab);
        actionbar.addTab(StationsTab);

    }

    public static void settab1(String text) {
        PlayerTab.setText(text);
    }

    public static void settab2(String text) {
        StationsTab.setText(text);
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.activity_main, menu);
        return true;
    }

}

class MyTabsListener implements ActionBar.TabListener {
    public Fragment fragment;

    public MyTabsListener(Fragment fragment) {
        this.fragment = fragment;
    }

    @Override
    public void onTabReselected(Tab tab, FragmentTransaction ft) {
        Toast.makeText(MainActivity1.appContext, "Reselected!",
                Toast.LENGTH_LONG).show();
    }

    @Override
    public void onTabSelected(Tab tab, FragmentTransaction ft) {
        ft.replace(R.id.fragment_container, fragment);
    }

    @Override
    public void onTabUnselected(Tab tab, FragmentTransaction ft) {
        ft.remove(fragment);
    }

}

在此处输入图像描述

4

4 回答 4

6

我很幸运使用了以下反射“hack”:

private void forceStackedTabs() {
    ActionBar ab = getSupportActionBar();
    if ( ab instanceof ActionBarImpl ) {
        // Pre-ICS
        disableEmbeddedTabs( ab );
    } else if ( ab instanceof ActionBarWrapper ) {
        // ICS
        try {
            Field abField = ab.getClass().getDeclaredField( "mActionBar" );
            abField.setAccessible( true );
            disableEmbeddedTabs( abField.get( ab ) );
        } catch (NoSuchFieldException e) {
            Log.e( TAG, "Error disabling actionbar embedded", e );
        } catch (IllegalArgumentException e) {
            Log.e( TAG, "Error disabling actionbar embedded", e );
        } catch (IllegalAccessException e) {
            Log.e( TAG, "Error disabling actionbar embedded", e );
        }
    }
}
private void disableEmbeddedTabs(Object ab) {
    try {
        Method setHasEmbeddedTabsMethod = ab.getClass().getDeclaredMethod("setHasEmbeddedTabs", boolean.class);
        setHasEmbeddedTabsMethod.setAccessible(true);
        setHasEmbeddedTabsMethod.invoke(ab, false);
    } catch (Exception e) {
        Log.e( TAG, "Error disabling actionbar embedded", e );
    }
}

请注意,我自己没有想到这一点,只是简单地重写了这个答案中给出的代码:replicate ActionBar Tab(s) with custom view

于 2013-04-08T09:18:35.293 回答
0

这是本机操作栏的行为。

单独的操作栏决定是否将标签放在第二行,我们无法影响它。(通常在平板电脑中的标签是内联的,在手机中是下面)

如果您想确保您的选项卡始终是选项卡,并且始终位于操作栏下方,请从操作栏中删除选项卡并切换到使用 ViewPager 作为您的内容,使用 PagerTabStrip(来自 Android 支持包,ViewPager 来自from) 或来自 ViewPagerIndicator 项目的选项卡指示器,用于选项卡本身。作为一个附带的好处,您的内容现在可以水平滑动以在选项卡之间移动,这是一种流行的方法。

只是一个注释。这不是正确的模式。 http://developer.android.com/design/patterns/pure-android.html

于 2013-01-29T06:44:33.080 回答
0

这是一个可能对您有所帮助的演示!我在操作栏中使用了一个自定义视图,其中包含一个 TabHost,它可以像上图一样运行良好,但我没有在不同的屏幕尺寸下测试它。

https://github.com/shellshy/actionbar

于 2013-10-14T14:19:52.860 回答
0

在 ActionBarImpl.java 的setHasEmbeddedTabs(boolean hasEmbeddedTabs)方法中,更改值:

mHasEmbeddedTabs = hasEmbeddedTabs;

到:

mHasEmbeddedTabs = false;
于 2013-12-03T16:48:20.763 回答