積み重ねられたタブを強制する方法はありますか? 横向きモードの場合でも、タブをアクションバー (2 行目) から分離したい。
私はそれを強制しようとしていますが、できません。たとえば、Android の Twitter アプリでは、横向きモードに変更すると、引き続き 2 つの行が表示されます (別の行にタブが表示され、スタック タブと呼ばれます)。
ありがとう!
積み重ねられたタブを強制する方法はありますか? 横向きモードの場合でも、タブをアクションバー (2 行目) から分離したい。
私はそれを強制しようとしていますが、できません。たとえば、Android の Twitter アプリでは、横向きモードに変更すると、引き続き 2 つの行が表示されます (別の行にタブが表示され、スタック タブと呼ばれます)。
ありがとう!
積み重ねられたタブを強制できないだけでなく、タブを強制することもできません。Androidは、一部の画面サイズと向きでのナビゲーション用に、タブをドロップダウンリストに置き換えることができます。
ViewPager
唯一の解決策は、やを使用するなどして、アクションバーのタブから離れることですPagerTabStrip
。
次のリフレクション「ハック」を使用して運が良かった:
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 );
}
}
私はこれを自分で考えていませんでしたが、この回答にあるコードを書き直しただけであることに注意してください:カスタムビューでアクションバータブを複製する
これを使用して、ActionBar の積み重ねまたは積み重ねられていないタブを Gingerbread から KitKat に強制しました。
Modded From: http://www.blogc.at/2014/01/23/android-tabs-appear-above-or-below-actionbar/
setHasEmbeddedTabs(mActionbar,false);
public static void setHasEmbeddedTabs(Object inActionBar, final boolean inHasEmbeddedTabs)
{
// get the ActionBar class
Class<?> actionBarClass = inActionBar.getClass();
// if it is a Jelly Bean implementation (ActionBarImplJB), get the super class (ActionBarImplICS)
if ("android.support.v7.app.ActionBarImplJB".equals(actionBarClass.getName()))
{
actionBarClass = actionBarClass.getSuperclass();
}
// if Android 4.3 >
if ("android.support.v7.app.ActionBarImplJBMR2".equals(actionBarClass.getName())){
actionBarClass = actionBarClass.getSuperclass().getSuperclass();
}
try
{
// try to get the mActionBar field, because the current ActionBar is probably just a wrapper Class
// if this fails, no worries, this will be an instance of the native ActionBar class or from the ActionBarImplBase class
final Field actionBarField = actionBarClass.getDeclaredField("mActionBar");
actionBarField.setAccessible(true);
inActionBar = actionBarField.get(inActionBar);
actionBarClass = inActionBar.getClass();
}
catch (IllegalAccessException e) {}
catch (IllegalArgumentException e) {}
catch (NoSuchFieldException e) {}
try
{
// now call the method setHasEmbeddedTabs, this will put the tabs inside the ActionBar
// if this fails, you're on you own <img class="wp-smiley" alt=";-)" src="http://www.blogc.at/wp-includes/images/smilies/icon_wink.gif">
final Method method = actionBarClass.getDeclaredMethod("setHasEmbeddedTabs", new Class[] { Boolean.TYPE });
method.setAccessible(true);
method.invoke(inActionBar, new Object[]{ inHasEmbeddedTabs });
}
catch (NoSuchMethodException e) {}
catch (InvocationTargetException e) {}
catch (IllegalAccessException e) {}
catch (IllegalArgumentException e) {}
}
電話とタブレットをサポートする必要があり、別の実装を使用したくない場合は、これをアクティビティに入れることができます。
@Override
public Resources getResources() {
if (mResourcesImpl == null) {
mResourcesImpl = new ResourcesImpl(super.getResources());
}
return mResourcesImpl;
}
class ResourcesImpl extends Resources {
private Resources mResources;
private Set<Integer> mActionBarEmbedTabsIds = new HashSet<Integer>();
ResourcesImpl(Resources resources) {
super(resources.getAssets(), resources.getDisplayMetrics(), resources.getConfiguration());
mResources = resources;
String packageName = getPackageName();
mActionBarEmbedTabsIds.add(mResources.getIdentifier("abc_action_bar_embed_tabs", "bool", packageName));
mActionBarEmbedTabsIds.add(mResources.getIdentifier("abc_action_bar_embed_tabs_pre_jb", "bool", packageName));
mActionBarEmbedTabsIds.add(mResources.getIdentifier("action_bar_embed_tabs", "bool", "android"));
mActionBarEmbedTabsIds.add(mResources.getIdentifier("action_bar_embed_tabs_pre_jb", "bool", "android"));
mActionBarEmbedTabsIds.remove(0);
}
@Override
public boolean getBoolean(int id) throws NotFoundException {
if (mActionBarEmbedTabsIds.contains(id)) {
return areActionBarTabsEmbed(); // stacked ot embed goes here
}
return super.getBoolean(id);
}
}