2

是否可以仅使用 xml drawables创建类似 Holo 的 ActionBar 选项卡背景?如果是,如何?如果没有,有什么限制?

在此处输入图像描述

浏览 Android 源代码,我发现选项卡背景是使用tab_indicator_holo.xml中的可绘制选择器定义的:

<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <!-- Non focused states -->
    <item android:state_focused="false" android:state_selected="false" android:state_pressed="false" android:drawable="@drawable/tab_unselected_holo" />
    <item android:state_focused="false" android:state_selected="true"  android:state_pressed="false" android:drawable="@drawable/tab_selected_holo" />

    <!-- Focused states -->
    <item android:state_focused="true" android:state_selected="false" android:state_pressed="false" android:drawable="@drawable/tab_unselected_focused_holo" />
    <item android:state_focused="true" android:state_selected="true"  android:state_pressed="false" android:drawable="@drawable/tab_selected_focused_holo" />

    <!-- Pressed -->
    <!--    Non focused states -->
    <item android:state_focused="false" android:state_selected="false" android:state_pressed="true" android:drawable="@drawable/tab_unselected_pressed_holo" />
    <item android:state_focused="false" android:state_selected="true"  android:state_pressed="true" android:drawable="@drawable/tab_selected_pressed_holo" />

    <!--    Focused states -->
    <item android:state_focused="true" android:state_selected="false" android:state_pressed="true" android:drawable="@drawable/tab_unselected_pressed_holo" />
    <item android:state_focused="true" android:state_selected="true"  android:state_pressed="true" android:drawable="@drawable/tab_selected_pressed_holo" />
</selector>

然后为每个状态使用 9 个补丁可绘制对象,例如tab_selected_holo.9.png

我想知道是否可以将这 9 个补丁可绘制对象替换为图层列表可绘制对象、形状可绘制对象或组合,从而节省创建各种 PNG 文件的需要(根据我的计算,每个密度 6 个)。

我注意到ActionBarSherlock还使用了 9 个补丁可绘制对象,因此很可能这是唯一的方法。

4

2 回答 2

2

要完全自定义您的 ActionBar 选项卡,请尝试以下操作,创建一个名为“Home”的虚构选项卡。此布局包含图像和标签。

(1) 正常创建选项卡,但通过 ActionBar.Tab.setCustomView() 指定自定义布局

// Home tab
LayoutInflater inflater = (LayoutInflater) this.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
HomeFragment homeFragment = new HomeFragment();
RelativeLayout layoutView = (RelativeLayout)inflater.inflate(R.layout.layout_tab_home, null);
TextView title = (TextView)layoutView.findViewById(R.id.title);
ImageView img = (ImageView)layoutView.findViewById(R.id.icon);
ActionBar.Tab tabHome = mActionBar.newTab();
tabHome.setTabListener(homeFragment);
title.setText(this.getString(R.string.tabTitleHome));
img.setImageResource(R.drawable.tab_home);
tabHome.setCustomView(layoutView);
mActionBar.addTab(tabHome);

(2)为你的标签创建一个布局(layout_tab_home.xml)

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="wrap_content" android:layout_height="56dip" android:layout_weight="0" android:layout_marginLeft="0dip" android:layout_marginRight="0dip">
    <ImageView android:id="@+id/icon" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerHorizontal="true" android:paddingBottom="2dip" />
    <TextView android:id="@+id/title" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_below="@id/icon" android:paddingLeft="0dip" android:paddingRight="0dip" style="@style/tabText" />
</RelativeLayout>

(3) 为你的图片设置一个drawable

<?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/home_sel" />
    <item android:state_selected="false" android:drawable="@drawable/home_unsel" />
</selector>

在此示例中,我只有一个 PNG 图形,其中选定状态与未选定状态的颜色不同

您似乎对 Background drawable 最感兴趣,因此同样适用,但在您的 RelativeLayout 上设置一个背景可绘制对象,并使用与上述类似的选择器。

于 2012-07-25T20:22:07.417 回答
0

You can use inset drawables to create the line strip at the bottom. This xml will create a white rectangle with a blue line at the bottom like the one you posted. Then you can use state list drawables for its state.

<?xml version="1.0" encoding="utf-8"?>
<inset xmlns:android="http://schemas.android.com/apk/res/android"
android:insetBottom="0dp"
android:insetLeft="-5dp"
android:insetRight="-5dp"
android:insetTop="-5dp" >

<shape>
    <solid android:color="#FFF" />

    <stroke
        android:width="3dp"
        android:color="#00F" />
</shape>
</inset>

For more info you can have a look at this post: http://blog.stylingandroid.com/archives/1329

于 2012-12-03T15:26:16.853 回答