ActionBar选项卡,自定义视图不居中

时间:2014-02-04 08:23:32

标签: android tabs android-actionbar android-custom-view

我需要为我的标签使用自定义视图,问题是fill_parent不起作用(如here所示)。

所以我需要使用边距和内容,但为了让视图在所有配置(横向/纵向,或平板电脑中标签的高度都会发生变化)的标签内居中,这样做有点棘手

我不知道每个配置使用什么值。另外,我找不到系统用来开始的默认布局。

3 个答案:

答案 0 :(得分:5)

我建议你使用ActionBar标签样式。这很简洁。例如(在TabView上调零):

<style name="MyActionBar" parent="@style/android:Widget.Holo.ActionBar">
    <item name="android:titleTextStyle">@style/MyActionBarTitleText</item>
    <item name="android:attr/actionBarTabTextStyle">@style/MyActionBarTabText</item>
    <item name="android:attr/actionBarTabStyle">@style/MyActionBarTabStyle</item>
</style>

<!-- styling for the tabs -->
<style name="MyActionBarTabStyle" parent="@style/android:Widget.Holo.Light.ActionBar.TabView">
    <item name="android:background">@drawable/tab_bar_bg_master</item>
    <item name="android:gravity">center</item>
</style>

(我还会注意到,通过使用自定义Drawables,这些选项卡是高度可定制的。但这是另一天的主题!)

答案 1 :(得分:1)

所以,如果你想这样做,你需要做一些肮脏的事情。 由于fill_parent不起作用,您需要强制根视图的高度高于制表符高度,然后将您真正需要的内容居中。所以我的第一个LinearLayout是无用的,第二个将位于选项卡的中心。

这是我使用的。我只想要一个textview和另一个textview在它的右上角。

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical">
<LinearLayout
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:orientation="vertical"
    android:visibility="invisible">
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="TextView" />
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="TextView" />
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="TextView" />
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="TextView" />
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="TextView" />
</LinearLayout>
<LinearLayout
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_centerInParent="true"
    android:orientation="vertical">
    <TextView
        android:id="@+id/tv_tab_count"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_above="@+id/tv_tab_title"
        android:layout_gravity="right"
        android:background="@drawable/bg_notification"
        android:paddingLeft="2dp"
        android:paddingRight="2dp"
        android:text="1"
        android:gravity="center"
        android:minWidth="14dp"
        android:textStyle="bold"
        android:textColor="@color/blanc"
        android:textSize="8dp" />
    <TextView
        android:id="@+id/tv_tab_title"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="TextView"
        android:textColor="@color/noire"
        android:textSize="12dp"
        android:textStyle="bold" />
    <TextView //this has the same height as the `tv_tab_count` so it remains centered vertically
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_above="@+id/tv_tab_title"
        android:layout_gravity="right"
        android:background="#0f0"
        android:paddingLeft="2dp"
        android:paddingRight="2dp"
        android:text="1"
        android:textSize="8dp"
        android:visibility="invisible" />
</LinearLayout>

这项工作用于垂直对齐,但视图只有我在textview中放置的内容的宽度。因此,如果您需要使用完整的宽度,则应在其中一个不可见的文本视图中添加一个非常长的单词。

答案 2 :(得分:1)

来自@ Stephane-Mathis的上述回复是正确的,但我无法让它在我的代码中正常工作。这是一个使用相同概念的简单版本。

同样,我们的想法是强迫你的视图比标签本身高很多。

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="horizontal"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:paddingTop="3dp"
    android:paddingBottom="3dp">
    <View
        android:id="@+id/spacer_1"
        android:layout_width="0dp"
        android:layout_height="1000dp"
        android:layout_weight="1" />
    <ImageView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center_vertical"
        android:src="@drawable/ic_tabicon_1" />
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginLeft="6dp"
        android:layout_gravity="center_vertical"
        android:textColor="?accentColor"
        android:text="My Albums" />
    <View
        android:id="@+id/spacer_2"
        android:layout_width="0dp"
        android:layout_height="0dp"
        android:layout_weight="1" />
</LinearLayout>

存在 spacer_1 spacer_2 视图,以便在左侧和右侧均匀填充ImageView和TextView 。此外, spacer_1 的高度设置为荒谬的高(1000dp),因此强制父视图过高。然后,ImageView和TextView都设置为 center_vertical