ActionBarナビゲーションタブの幅を管理する方法は?
ActionBarSherlockを使用していて、ナビゲーションタブが含まれるActionBarがあります。タブ内のテキストのサイズに基づいてタブのサイズを自動化したいのですが、どこかに最小サイズを使用せざるを得ないスタイルまたは設定があるようです。したがって、たとえばスクリーンショットでは、「Very Long Tab」タブには(適用したスタイルに従って)パディングがありませんが、「T」とマークされたタブには、パディングを0dpに設定したにもかかわらず、かなりのパディングがあります。
以下に示すように、いくつかのスタイルにさまざまな属性を設定してブルートフォースアプローチを試しましたが、まだ成功していません。
アクションバータブのパディング/幅を制御するにはどうすればよいですか?
<style
name="CustomActivity"
parent="@style/Theme.Sherlock"
>
<item name="actionBarTabStyle">@style/customActionBarTabStyle</item>
<item name="actionBarTabBarStyle">@style/customActionBarTabBarStyle</item>
<item name="actionBarTabTextStyle">@style/customActionBarTabTextStyle</item>
</style>
<style name="customActionBarTabStyle" parent="style/Widget.Sherlock.ActionBar.TabView">
<item name="Android:background">@drawable/tab_indicator</item>
<item name="Android:paddingLeft">0dp</item>
<item name="Android:paddingRight">0dp</item>
<item name="Android:layout_width">wrap_content</item>
<item name="Android:minWidth">0dp</item>
</style>
<style name="customActionBarTabBarStyle" parent="style/Widget.Sherlock.ActionBar.TabBar">
<item name="Android:paddingLeft">0dp</item>
<item name="Android:paddingRight">0dp</item>
<item name="Android:layout_width">wrap_content</item>
<item name="Android:minWidth">0dp</item>
</style>
<style name="customActionBarTabTextStyle" parent="style/Widget.Sherlock.ActionBar.TabText">
<item name="Android:paddingLeft">0dp</item>
<item name="Android:paddingRight">0dp</item>
<item name="Android:layout_width">wrap_content</item>
<item name="Android:minWidth">0dp</item>
</style>
そのスクリーンショットから、ICSでテストしているように見えます。これは、ActionBarSherlockのバグであると考えるのではなく、ネイティブアクションバーの動作を観察するためです。
基本的に、アクションバーは、タブが数個しかないときに見栄えを良くするために十分なスペースがある場合、タブを拡張して同じ量のスペースを占有しようとします。
actionBarTabTextStyle
パディングをゼロに設定すると、実際には問題が悪化します。これは、最初のタブのテキストの周囲に、仕切りや画面の端に触れるのを防ぐものが何もないためです。パディングを増やす(またはデフォルトに戻す)と、次の2つのいずれかが表示されます。
- テキストは2行に折り返されます。
- タブバーは、タブをコンテンツと同じ幅に変換し、水平方向のスクロールを可能にします。
前者は、2番目から4番目のタブの幅が非常に薄いために発生すると思いがちです。残念ながら、これはタブバーの動作であり、それに応じてその動作に対応する必要があります。
可能であれば、幅がより統一されたタブラベルを作成してみてください。これにより、上記の2番目の状態がトリガーされる可能性があります。 ICSでテストを続けると、表示されている動作がプラットフォームからのものであることを確認できます。その後、ICSより前で実行すると、ライブラリから同じ動作が得られるはずです。
プロジェクトActionBarSherlock./ActionbarSherlock/src/com/actionbarsherlock/internal/widget/ScrollingTabContainerView.Javaでこのクラスをオーバーライドします
@Override
public void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
Re-measure if we went beyond our maximum size.
if (mParent.mMaxTabWidth > 0 && getMeasuredWidth() > mParent.mMaxTabWidth) {
//do nothing , override by me for ActionBarTabs not rezize never
}
}
からの元のコード
@Override
public void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
// Re-measure if we went beyond our maximum size.
if (mParent.mMaxTabWidth > 0 && getMeasuredWidth() > mParent.mMaxTabWidth) {
super.onMeasure(MeasureSpec.makeMeasureSpec(mParent.mMaxTabWidth, MeasureSpec.EXACTLY),
heightMeasureSpec);
}
}
実行すると、Android 2.3.3のコードは、タブが破線でない場合は正常に機能しますが、Android 4.4では機能しません。
4.0より前のテーマを使用しているようですAndroid ActionBarSherlockのモード?
から http://actionbarsherlock.com/theming.html :
ミラーリングされた属性
Androidのテーマシステムの制限により、テーマのカスタマイズは2つの属性で宣言する必要があります。通常のAndroidプレフィックス付き属性は、テーマをネイティブアクションバーに適用し、プレフィックスなし属性はカスタム実装用です。両方のテーマAPIはまったく同じであるため、カスタマイズを2回実装するのではなく、2回参照するだけで済みます。
これが何を伴うかを正確に伝える最も簡単な方法は、例を使用することです。以下は、上記の「スタイル付き」の例の完全なテーマです。
<style name="Theme.Styled" parent="Theme.Sherlock.Light.DarkActionBar">
<item name="actionBarStyle">@style/Widget.Styled.ActionBar</item>
<item name="Android:actionBarStyle">@style/Widget.Styled.ActionBar</item>
</style>
<style name="Widget.Styled.ActionBar" parent="Widget.Sherlock.Light.ActionBar.Solid.Inverse">
<item name="background">@drawable/bg_striped</item>
<item name="Android:background">@drawable/bg_striped</item>
<item name="backgroundSplit">@drawable/bg_striped_split</item>
<item name="Android:backgroundSplit">@drawable/bg_striped_split</item>
</style>