2

アクション バーと 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

次のリフレクション「ハック」を使用して運が良かった:

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 );
    }
}

私はこれを自分で考えていませんでしたが、この回答にあるコードを書き直しただけであることに注意してください:カスタムビューでアクションバータブを複製する

于 2013-04-08T09:18:35.293 に答える
0

ActionBarImpl.java のsetHasEmbeddedTabs(boolean hasEmbeddedTabs)メソッドで、値を変更します。

mHasEmbeddedTabs = hasEmbeddedTabs;

に:

mHasEmbeddedTabs = false;
于 2013-12-03T16:48:20.763 に答える
0

これは、ネイティブ アクション バーの動作です。

タブを 2 番目の行に配置するかどうかは、アクション バーだけで決定されます。これに影響を与えることはできません (通常、タブレットのタブはインラインで、携帯電話のタブは下にあります)。

タブが常にタブであり、常にアクション バーの下にあることを確認したい場合は、アクション バーからタブを削除し、コンテンツに 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 に答える