Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/196.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 我可以在自定义选项卡视图中使用默认选项卡样式吗?_Android_Tabs_Android Tabhost - Fatal编程技术网

Android 我可以在自定义选项卡视图中使用默认选项卡样式吗?

Android 我可以在自定义选项卡视图中使用默认选项卡样式吗?,android,tabs,android-tabhost,Android,Tabs,Android Tabhost,我的主要活动是选项卡活动,但我的选项卡不需要图标。我知道我可以使用重载的TabHost.TabSpec.setIndicator(CharSequence标签)方法忽略图标,如中所述 但图标所在的空间仍然保留,因此浪费了大量空间。这一点已在本报告中提到。看来我不能降低标签的高度。我必须为自己的视图提供TabHost.TabSpec.setIndicator(视图视图)重载 很好,但我想确保其余的样式(背景/颜色)在所有设备上保持一致的“android”,就像我使用了默认的标签指示器一样。所以我不

我的主要活动是
选项卡活动
,但我的选项卡不需要图标。我知道我可以使用重载的
TabHost.TabSpec.setIndicator(CharSequence标签)
方法忽略图标,如中所述

但图标所在的空间仍然保留,因此浪费了大量空间。这一点已在本报告中提到。看来我不能降低标签的高度。我必须为自己的
视图提供
TabHost.TabSpec.setIndicator(视图视图)
重载

很好,但我想确保其余的样式(背景/颜色)在所有设备上保持一致的“android”,就像我使用了默认的标签指示器一样。所以我不想提供我自己的颜色

我发现
@android:color/tab\u indicator\u text
,并将其用于
TextView
s文本颜色,似乎可以按预期工作。但是我不知道在哪里可以得到默认的标签背景颜色。我还发现了
@android:style/Widget.TabWidget
样式,但将其应用于
TextView
或周围的
LinearLayout
似乎都没有帮助

这是我的选项卡指示器视图xml文件,摘自一些教程:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/tabLayout"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:gravity="center"
    android:padding="12dip" >

    <TextView
        android:id="@+id/tabText"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textColor="@android:color/tab_indicator_text" />
</LinearLayout>

如何在这个页面上获得“android默认”选项卡样式


编辑:接下来,我试图通过
setIndicator(CharSequence)
添加一个默认选项卡,获取其指示器视图的
getBackground
可绘制选项卡,清除所有选项卡,添加我的自定义视图(见上文),然后将检索到的可绘制选项卡放入新指示器的
setBackground

结果看起来有点对也有点错。首先,它们又太高了,所以我一无所获。另一方面,所有选项卡的背景状态现在以某种方式链接(活动、高亮显示、选中等)。在可绘图文件上使用
mutate()
,根本没有帮助。下一个技巧:我添加了三个默认选项卡,获取它们的所有背景,清除它们,并为我自己的三个选项卡分别提供一个背景

这就解决了第二个问题。他们的国家不再有联系。但还是太高了。因此,我使用
updateViewLayout
降低了
TabWidget
的高度。这可以工作,但会在选项卡指示器的顶部留下一个变色条


实际上,我的结果与使用
TabHost.TabSpec.setIndicator(CharSequence标签)
方法时的情况相同。不管怎么说,这些黑客让我觉得自己很脏。有没有一种优雅的方法可以在自定义视图上获得默认的android样式?

我不确定这是否会使文本居中,但您可以在不更改默认android背景的情况下更改选项卡的高度

试试这个:

TabHost tabs = //initialize your TabHost here
tabs.setup();
TabSpec tspec1 = tabs.newTabSpec("First Tab");
tspec1.setIndicator("Actions");
tabs.addTab(tspec1);


tabs.getTabWidget.getChildAt(0).getLayoutParams().height = (int) (35 * 1.5);
其中35是以像素为单位的高度,乘以1.5表示高度35dp


祝你好运。

我认为最好的选择是使用称为选择器的xml文件(您将放在“drawable”文件夹中)自定义tab_indicator.xml,在“layout”文件夹中自定义tab_indicator.xml,文本样式和使用这种样式的主题

这是tab_indicator_selector.xml,位于“drawable”文件夹中,是tab_indicator.xml所必需的:

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <!-- Non focused states ... -->
    <!-- Focused states ... -->
    <!-- Pressed -->
    <item android:state_selected="true" android:state_pressed="true"    android:drawable="@drawable/tab_pressed" />
    <item android:state_pressed="true" android:drawable="@drawable/tab_pressed" />
</selector>
我希望有帮助。这是一个很长的解决方案,但是当应用程序增长时,或者当你想在版本2上改变它的外观时,使用主题和样式是非常方便的


最后,我建议您查看新的SDK版本14和Holo主题。Holo上的标签既适用于平板电脑,也适用于手机,您可以制作有图标和无图标的标签。

此代码取自android源代码tab_indicator.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="0dip"
    android:layout_height="64dip"
    android:layout_weight="1"
    android:layout_marginLeft="-3dip"
    android:layout_marginRight="-3dip"
    android:orientation="vertical"
    android:background="@android:drawable/tab_indicator">

    <ImageView android:id="@+id/icon"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerHorizontal="true"
    />

    <TextView android:id="@+id/title"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        android:layout_centerHorizontal="true"
        style="?android:attr/tabWidgetStyle"
    />

</RelativeLayout>
然后可以降低卡舌的高度:

RelativeLayout parent = ((RelativeLayout) tv.getParent());
ViewGroup.LayoutParams vglp = parent.getLayoutParams();
vglp.height = android.view.ViewGroup.LayoutParams.WRAP_CONTENT;
parent.setLayoutParams(vglp);

结果将是:

您是否可以尝试以下示例代码,这些代码取自default tab_indicator.xml,并根据您描述的需求进行轻微修改。 谢谢


您可以在/path to android sdk/platforms/下找到每个平台的res-color文件,您可以使用@android:style/或@android:color/从XMLs访问默认资源

但正如您所提到的,您知道TabWidgets和其他Android UI视图的颜色和样式会随着版本的不同以及设备品牌的不同而变化

即使你可以做你想做的事情,你的标签在不同版本和品牌的设备上也会有所不同。。。什么是不平常的


我将使用给定的解决方案之一实现我自己的选项卡样式。祝你好运

你能发布一张确切问题的图片吗?我真的倾向于说,这可能是因为填充物在各个方向都是12dp,尽管这可能是一个非常愚蠢的答案。我已经使用了与你描述的几乎相同的方法好几次了,但我从来没有遇到过这样的问题。再说一遍,我没有用填充法。你用过几次哪种方法?你到底没有什么问题?:-)我已经描述了几种可能的方法和几个问题。在阅读了我的评论和你最初的问题后,我不得不承认我真的不知道我指的是什么。一定是我在午夜发布的睡眠不足的帖子之一。请忽略它,它对你没有帮助;)希望你能找到解决问题的方法!谢谢,但我已经试过了,它有以下问题:*它不会垂直居中。*它会在标签顶部留下一个变色的条。我已经做过类似的事情了。但我担心这并不能解决我的问题,那就是:在不提供自己的颜色的情况下,如何在自定义选项卡指示器上获得默认的android选项卡样式?您在那里使用的是一个
@drawable/tab\u indicator\u选择器。但我不知道如何编写它来实现我的目标。我正是想让你对选择器进行更多的研究。。。但它来了。(我将修改我的答案以包含它)。我知道如何使用选择器。但你还是
private void setTabs(){
    tabHost = getTabHost();
    addTab(R.string.tab_title_something, R.drawable.tab_something_selector, new Intent().setClass(this, PlacesNearbyTab.class));
}

private void addTab(int labelId, int drawableId, Intent intent) {
    TabHost.TabSpec spec = tabHost.newTabSpec("tab" + labelId);
    View tabIndicator = LayoutInflater.from(this).inflate(R.layout.tab_indicator, getTabWidget(), false);
    TextView title = (TextView) tabIndicator.findViewById(R.id.tab_title);
    title.setText(labelId);
    spec.setIndicator(tabIndicator);
    spec.setContent(intent);
    tabHost.addTab(spec);

}
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="0dip"
    android:layout_height="64dip"
    android:layout_weight="1"
    android:layout_marginLeft="-3dip"
    android:layout_marginRight="-3dip"
    android:orientation="vertical"
    android:background="@android:drawable/tab_indicator">

    <ImageView android:id="@+id/icon"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerHorizontal="true"
    />

    <TextView android:id="@+id/title"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        android:layout_centerHorizontal="true"
        style="?android:attr/tabWidgetStyle"
    />

</RelativeLayout>
TabSpec tc = getTabHost().newTabSpec("tag");
tc.setIndicator("indicator1");
tc.setContent(content);
getTabHost().addTab(tc);
getTabHost().findViewById(android.R.id.icon).setVisibility(View.GONE);
TextView tv = (TextView) getTabHost().findViewById(android.R.id.title);
RelativeLayout.LayoutParams rllp = new RelativeLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
rllp.addRule(RelativeLayout.CENTER_IN_PARENT);
tv.setLayoutParams(rllp);
RelativeLayout parent = ((RelativeLayout) tv.getParent());
ViewGroup.LayoutParams vglp = parent.getLayoutParams();
vglp.height = android.view.ViewGroup.LayoutParams.WRAP_CONTENT;
parent.setLayoutParams(vglp);
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="0dip"
android:layout_height="64dip"
android:layout_weight="1"
android:layout_marginLeft="-3dip"
android:layout_marginRight="-3dip"
android:gravity="center"
android:background="@android:drawable/tab_indicator">

    <TextView
        android:id="@+id/title"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        style="?android:attr/tabWidgetStyle">
    </TextView>

</LinearLayout>