我尝试自定义操作栏sherlock选项卡,以便它们显示选项卡图标下方的选项卡文本。在搜索和阅读有关该主题后,我仍然没有太多运气。
以下是我得到的结果:
选择了自定义标签1
未选择自定义选项卡1,选择了标准选项卡2
这是我到目前为止所做的:
创建了我自己的styles.xml,我在其中更改了一些操作栏设置:
<style name="SkoletubeTheme" parent="Theme.Sherlock">
<item name="actionBarSize">@dimen/st__action_bar_default_height</item>
<item name="actionBarTabStyle">@style/Skoletube.TabView</item>
<item name="actionBarTabTextStyle">@style/Skoletube.Tab.Text</item>
</style>
<style name="Skoletube.TabView" parent="Widget.Sherlock.ActionBar.TabView">
<item name="android:background">@drawable/abs__tab_indicator_holo</item>
<item name="android:paddingLeft">6dp</item>
<item name="android:paddingRight">6dp</item>
</style>
<style name="Skoletube.Tab.Text" parent="Widget.Sherlock.ActionBar.TabText">
<item name="android:textAppearance">@android:style/TextAppearance.Medium</item>
<item name="android:textColor">@android:color/primary_text_dark</item>
<item name="android:textSize">10sp</item>
</style>
创建了一个xml ressource,我在其中更改并为操作栏设置了一些文本设置。在这里,我增加了操作栏的高度,从而增加了标签的高度。我还减小了文本的大小,以便为选项卡中的图标和文本添加空间
<?xml version="1.0" encoding="utf-8"?>
<resources>
<!-- Default height of an action bar. -->
<dimen name="st__action_bar_default_height">58dip</dimen>
<!-- Text size for action bar titles -->
<dimen name="ab__action_bar_title_text_size">10dp</dimen>
<!-- Text size for action bar subtitles -->
<dimen name="ab__action_bar_subtitle_text_size">6dp</dimen>
<!-- Top margin for action bar subtitles -->
<dimen name="ab__action_bar_subtitle_top_margin">-3dp</dimen>
<!-- Bottom margin for action bar subtitles -->
<dimen name="ab__action_bar_subtitle_bottom_margin">5dip</dimen>
</resources>
然后我为要使用的标签定义了一个自定义布局,我将文本放在图标下方:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/customTabLayout"
android:layout_width="wrap_content"
android:layout_height="fill_parent"
android:orientation="vertical"
android:layout_weight="1"
android:focusable="true"
android:gravity="center"
style="?attr/actionBarTabStyle"
>
<ImageView
android:id="@+id/sk_abs__tab_icon"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:background="@android:color/transparent"
/>
<com.actionbarsherlock.internal.widget.ScrollingTextView
android:id="@+id/sk_abs__tab_txt"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@id/sk_abs__tab_icon"
android:layout_alignWithParentIfMissing="true"
android:layout_weight="1"
android:layout_centerHorizontal="true"
android:lines="1"
android:scrollHorizontally="true"
android:ellipsize="marquee"
android:marqueeRepeatLimit="marquee_forever"
style="@style/Skoletube.Tab.Text"
/>
<FrameLayout
android:id="@+id/abs__tab_custom"
android:layout_width="wrap_content"
android:layout_height="fill_parent"
android:padding="5dip"
android:layout_weight="1"
android:visibility="gone"
/>
仅作为记录,作为相对布局的样式传递的属性指向:
<style name="Widget.Sherlock.ActionBar.TabBar" parent="android:Widget"></style>
然后我将这些更改应用到我的应用程序,如下所示,第一个选项卡具有我的自定义实现,第二个选项卡具有标准实现:
final ActionBar actionBar;
actionBar = getSupportActionBar();
actionBar.setDisplayHomeAsUpEnabled(false);
actionBar.setDisplayUseLogoEnabled(true);
// Set up tabs
myMediaTab = actionBar.newTab();
myMediaTab.setCustomView(R.layout.skoletube_tab_layout);
ImageView myMediaImg = (ImageView) myMediaTab.getCustomView().findViewById(R.id.sk_abs__tab_icon);
myMediaImg.setImageResource(R.drawable.tab_mymedia);
ScrollingTextView myMediaText = (ScrollingTextView) myMediaTab.getCustomView().findViewById(R.id.sk_abs__tab_txt);
myMediaText.setText("Tab1");
myMediaTab.setTabListener(this);
myMediaTab.setTag("MyMediaTab");
actionBar.addTab(myMediaTab);
myChannelsTab = actionBar.newTab();
myChannelsTab.setIcon(drawable.tab_mychannels);
myChannelsTab.setText("Tab2");
myChannelsTab.setTabListener(this);
myChannelsTab.setTag("myChannelsTab");
actionBar.addTab(myChannelsTab);
虽然我认为我接近解决方案,但我认为我错过了某个地方。
显然文本后面/图像下面的蓝条不需要在那里,但我似乎也没有找到可以设置聚焦图像的位置(我希望img在选择标签时改变颜色)和文字颜色。我是否需要使imageview成为焦点并通过它来处理它?</ p>
我还是比较陌生,所以我采取的方法可能是错误的,如果有更好/更聪明的方法可以这样做,请说。
欣赏任何建议和想法。
答案 0 :(得分:6)
我已使用compound drawable:
解决了这个问题tv = new TextView(this);
tv.setText(R.string.tab_movies);
tv.setCompoundDrawablesWithIntrinsicBounds(0, R.drawable.nav_movies, 0, 0);
mBar.addTab(mBar
.newTab()
.setCustomView(tv)
.setTabListener(
new TabListenerImpl<TheatersTabActivity>(this, "theaters",
TheatersTabActivity.class)));
为了处理选定或未选择的图像,我使用选择器:
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android" >
<item
android:state_selected="true"
android:drawable="@drawable/nav_movies_on"/>
<item
android:state_selected="false"
android:drawable="@drawable/nav_movies_off"/>
</selector>
答案 1 :(得分:2)
我不知道您是否找到了答案或者尚未找到答案,但一个解决方案可能是修改标签图片以包含文字,GIMP或photoshop,然后只需设置这些图片在选项卡中,而不是图像和文本。这样做有点尴尬,但它会起作用。
希望这有帮助!