大家都知道Tabhost中Tabwidget的布局是图标在上,文字在下的垂直布局。比如通讯录的布局。
这种布局在手机上的竖屏上用得最多,但在横屏则显得水平分布得不够紧凑。如何实现自定义的布局呢?
1:首先理解Tabhost的布局:
<?xml version="1.0" encoding="utf-8"?>
<TabHost xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@android:id/tabhost" android:layout_width="fill_parent"
android:layout_height="fill_parent">
<LinearLayout android:orientation="vertical"
android:layout_width="fill_parent" android:layout_height="fill_parent">
<TabWidget android:id="@android:id/tabs"
android:layout_width="fill_parent" android:layout_height="wrap_content" />
<FrameLayout android:id="@android:id/tabcontent"
android:layout_width="fill_parent" android:layout_height="0dip"
android:layout_weight="1">
</FrameLayout>
</LinearLayout>
</TabHost>
TabHost里面包含了一个<LinearLayout>,然后LinearLayout里面有一个TabWidget 这个存放每个“切换卡”,FrameLayout里面存放每个切换卡下面的内容,
TabWidget 理解:
1. TabWidget 为 horizontal 的 LinearLayout
2. 且 其包含的标签又是一个RelativeLayout
3. 每个标签RelativeLayout 里面包含2个View: TextView ImageView
有了这个理解,可以估计得到
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="horizontal"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<RelativeLayout
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="wrap_content">
<ImageView />
<TextView />
</RelativeLayout>
<RelativeLayout
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="wrap_content">
<ImageView />
<TextView />
</RelativeLayout>
..........多个RelativeLayout
</LinearLayout>
有了这个布局,就可以自定义自己的布局了,以图片在左,文字在右为例。
package com.android.customtabhost;
import android.app.TabActivity;
import android.content.Intent;
import android.os.Bundle;
import android.view.Gravity;
import android.view.View;
import android.view.Window;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.RelativeLayout;
import android.widget.TabHost;
import android.widget.TabWidget;
import android.widget.TextView;
public class CustomTabHost extends TabActivity {
private TabHost mTabHost;
private static final String TAB_SETTING_TAG_0 = "tab_setting0";
private static final String TAB_SETTING_TAG_1 = "tab_setting1";
private static final String TAB_SETTING_TAG_2 = "tab_setting2";
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
//setContentView(R.layout.main);
mTabHost = getTabHost();
// Setup the tabs
setupSettingTab(TAB_SETTING_TAG_0, 0);
setupSettingTab(TAB_SETTING_TAG_1, 1);
setupSettingTab(TAB_SETTING_TAG_2, 2);
}
private void setupSettingTab(String tag, int num) {
// TODO Auto-generated method stub
// Force the class since overriding tab entries doesn't work
Intent intent = new Intent();
intent.setClass(this, SettingActivity.class);
String name = getResources().getString(R.string.setting);
mTabHost.addTab(mTabHost.newTabSpec(tag).setIndicator("")
.setContent(intent));
addToTabHost(name, R.drawable.setting_background, num);
}
private void addToTabHost(String name, int image, int number) {
// TODO Auto-generated method stub
LinearLayout ll = (LinearLayout) mTabHost.getChildAt(0);
TabWidget tw = (TabWidget) ll.getChildAt(0);
RelativeLayout rl = (RelativeLayout) tw.getChildAt(number);
rl.addView(composeLayout(name, image), new LinearLayout.LayoutParams(
LinearLayout.LayoutParams.FILL_PARENT,
LinearLayout.LayoutParams.FILL_PARENT));
}
private View composeLayout(String name, int image) {
LinearLayout layout = new LinearLayout(this);
layout.setGravity(Gravity.CENTER);
layout.setOrientation(LinearLayout.HORIZONTAL);
ImageView iv = new ImageView(this);
iv.setImageResource(image);
layout.addView(iv, new LinearLayout.LayoutParams(
LinearLayout.LayoutParams.WRAP_CONTENT,
LinearLayout.LayoutParams.FILL_PARENT));
TextView tv = new TextView(this);
tv.setGravity(Gravity.CENTER);
tv.setSingleLine(true);
tv.setPadding(10, 0, 0, 0);
tv.setTextSize(18);
tv.setText(name);
layout.addView(tv, new LinearLayout.LayoutParams(
LinearLayout.LayoutParams.WRAP_CONTENT,
LinearLayout.LayoutParams.FILL_PARENT));
return layout;
}
}
分享到:
相关推荐
本教程将深入讲解如何使用TabHost在Android应用中实现自定义的页签页面。 首先,我们需要理解TabHost的基本结构。TabHost包含两个主要部分:TabWidget和FrameLayout。TabWidget是显示页签的地方,而FrameLayout...
本文将深入讲解如何在Android中使用TabHost,并通过一个简单实例来演示其基本用法。 首先,我们需要了解TabHost的基本结构。TabHost通常包含两个主要部分:TabWidget和FrameLayout。TabWidget负责显示和管理各个Tab...
本篇将深入讲解如何利用TabHost来构建一个简单的Android应用实例。 首先,我们需要了解TabHost的基本结构。TabHost由两部分组成:TabWidget和FrameLayout。TabWidget负责显示各个选项卡,而FrameLayout则承载每个...
本教程将深入讲解如何使用TabHost实现全面的功能,帮助开发者掌握这一核心组件。 首先,TabHost是一个容器,它允许你将多个TabWidget(选项卡)和一个FrameLayout(内容区域)组合在一起。TabWidget显示选项卡,而...
本教程将深入讲解如何在Android Studio中使用TabHost来设计应用程序。 首先,理解TabHost的基本概念是必要的。TabHost是一个容器,它可以容纳一个TabWidget(用于显示选项卡)和一个FrameLayout(用于展示被选中...
本文将深入讲解如何在Android应用程序中有效地使用TabHost。 一、TabHost概述 TabHost是Android SDK中的一个容器类,用于管理一组TabWidget(标签)和一个FrameLayout(帧布局),在这个帧布局中,我们可以切换显示...
在Android开发中,自定义组件是提升应用独特性和用户体验的关键技术之一。本示例主要讲解如何使用自定义的Button和TabHost来实现页面间的切换,从而创建一个具有个性化标签导航功能的应用。 首先,我们来看看...
本篇文章将深入探讨如何在Android中自定义TabHost,以实现美观且功能丰富的界面。 首先,让我们理解TabHost的基本结构。TabHost通常包含两个主要部分:TabWidget和FrameLayout。TabWidget是显示标签的部分,而...
在Android开发中,TabHost是实现标签栏(Tab)与内容区域交互的一种核心组件,它允许用户通过不同的标签切换不同的视图或者活动。本资源"android tabhost --android UI源码.rar"似乎提供了一个关于如何在Android应用...
这篇博客详细讲解了如何使用TabHost来实现这一功能,我们将深入探讨这个主题。 首先,TabHost是Android提供的一个容器,它允许我们在一个Activity中创建多个TabWidget(选项卡)和一个FrameLayout(帧布局),帧...
本教程将深入讲解如何实现自定义的`TabHost`,并提供一个底部的示例(`TabHostDemo`)来帮助你理解和实践这个功能。 ### 1. `TabHost`简介 `TabHost`是Android SDK中的一个容器,它用于管理多个`TabWidget`(选项卡...
本示例"Android应用源码之嵌套TabHost示例.zip"深入探讨了如何在Android应用中实现嵌套的TabHost,这通常发生在需要在每个Tab中再分层次展示内容时。下面将详细讲解这个知识点。 首先,TabHost是Android SDK提供的...
本文将深入探讨如何使用TabHost组件在同一Activity上实现简单的Android选项卡菜单。TabHost是Android SDK提供的一种用于构建多标签界面的容器,它允许我们在一个Activity内创建多个Tab,每个Tab对应一个单独的视图...
本实例将深入讲解如何使用TabHost来构建一个多页面的应用,让用户体验更加丰富和直观。 一、TabHost概述 TabHost是Android SDK中的一个类,它允许开发者在应用中实现多标签导航。通过TabHost,我们可以创建一个包含...
在"Android应用源码可以横向拖动的TabHost"这个项目中,我们可以深入学习如何实现一个支持横向滑动的TabHost,这对于构建用户友好的多视图应用程序至关重要。以下将详细讲解相关知识点。 1. TabHost基本概念:...
本文将深入讲解TabHost的使用方法,以及如何自定义它的显示样式。 首先,TabHost是Android系统提供的一个容器,它可以包含一个TabWidget(用于显示选项卡)和一个FrameLayout(用于显示每个选项卡的内容)。通常,...
本篇将详细讲解基于源码的"Android应用源码之封装的一个tabhost框架"。 首先,TabHost是Android SDK中的一个容器类,它允许开发者在同一个Activity中展示多个Fragments或Views,通过TabWidget(标签栏)和...
首先,TabHost是Android提供的一个容器,它允许开发者创建一个多标签的应用界面。每个标签对应一个单独的“宿主”(通常是一个FrameLayout或LinearLayout),在用户切换标签时,会显示对应的宿主中的内容。创建...
`TabHost`则是Android原生的标签栏组件,可以承载多个`TabSpec`,每个`TabSpec`对应一个`Intent`,用于启动不同的Activity或Fragment。`TabHost`上方的箭头动画效果是通过自定义布局和监听滑动事件实现的,这部分...