Android修行手册 - TabHost回忆

举报
芝麻粒儿 发表于 2022/09/27 15:25:27 2022/09/27
【摘要】 👉关于作者众所周知,人生是一个漫长的流程,不断克服困难,不断反思前进的过程。在这个过程中会产生很多对于人生的质疑和思考,于是我决定将自己的思考,经验和故事全部分享出来,以此寻找共鸣!!!专注于Android/Unity和各种游戏开发技巧,以及各种资源分享(网站、工具、素材、源码、游戏等)欢迎关注公众号【空名先生】获取更多资源和交流! 👉前提这是小空坚持写的Android新手向系列,欢迎...

👉关于作者

众所周知,人生是一个漫长的流程,不断克服困难,不断反思前进的过程。在这个过程中会产生很多对于人生的质疑和思考,于是我决定将自己的思考,经验和故事全部分享出来,以此寻找共鸣!!!

专注于Android/Unity和各种游戏开发技巧,以及各种资源分享(网站、工具、素材、源码、游戏等)

欢迎关注公众号【空名先生】获取更多资源和交流!

👉前提

这是小空坚持写的Android新手向系列,欢迎品尝。

新手(√√√)

大佬(√)

👉实践过程

Hello,大家好啊,我是小空,大家在开发中一定遇见过切换卡(聊天类软件底部的切换),不论是自己写还是三方优秀框架实现方式有很多种,但其实官方为我们有提供这个组件,只是兼容性差不被人常用而已。

TabHost是个容器,包含TabWidget和FrameLayout(其内有多个布局)。

TabWidget代表的是用来点击切换选项卡的按钮,你的FrameLayout内部有几个一级布局,这个就有几个选项卡

TabSpec :布局写好之后就需要管理,而管理靠的是TabSpec

先说总结:该控件已经被遗弃了,不怎么用了,使用TabLayout替代,如果还想学习,可以继续。

😜属性方法

TabHost的常用方法

  • public TabHost (Context context): 创建TabHost类对象
  • public void addTab(TabHost.TabSpec tabSpec):为TabHost增加一个tab
  • public TabHost.TabSpec newTabSpec(String tag):创建一个TabHost.TabSpec对象,并且关联到TabHost
  • public View getCurrentView():取得当前的View对象
  • public String getCurrentTabTag():获得当前标签选项卡的Tag选项内容
  • public int getCurrentTab():获取当前标签选项卡的ID
  • public void setCurrentTab(int index):设置当前显示的Tab编号
  • public View getCurrentTabView():获取当前标签选项卡的视图
  • public void setCurrentTabByTag(String tag):设置当前显示的Tab名称
  • public void setOnTabChangedListener(TabHost.OnTabChangeListener l):设置选项监听事件
  • public void setup():使用findViewById()加载TabHost,在新增一个标签选项卡之前,必须调用它,即使是kotlin
  • public FrameLayout getTabContentView():获取并保存标签选项卡内容
  • public void clearAllTabs():清除所有关联到当前TabHost的标签选项卡

TabWidget常用属性

  • android:divider: 可绘制对象,被绘制在选项卡窗口间充当分割物
  • android:tabStripEnabled:确定是否在选项卡中绘制
  • android:tabStripLeft:用来绘制选项卡下面的分割线左边部分的可视化对象
  • android:tabStripRight: 用来绘制选项卡下面的分割线右边部分的可视化对象

TabWidget常用方法

  • public TabWidget (Context context):创建TabWidget 实例
  • public int getTabCount(): 返回标签选项卡的数量
  • public void addView(View child):向TabWidget增加view
  • public void focusCurrentTab(int index):设置当前标签选项卡并且使其获得焦点
  • public void setCurrentTab(int index):设置当前标签选项卡

TabHost.TabSpec类定义的常用方法

  • public TabHost.TabSpec setContent(int viewId):设置要Layout中的组件id
  • public TabHost.TabSpec setContent(Intent intent):指定一个activity的Intent对象作为选项卡内容,会跳转,相当差劲,因为这个影响很大
  • public TabHost.TabSpec setIndicator(View view):设置一个view为选项卡
  • public TabHost.TabSpec setIndicator(CharSequence label):设置一个选项卡为文本
  • public TabHost. setIndicator (ChaSequence label ,Drawable icon):设置选项卡包含文本和图标
  • **public String getTag():获取tag选项字符串

😜示例

<?xml version="1.0" encoding="utf-8"?>
<TabHost xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/idTabHost"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">
    <!--TabWidget   每个Tab的选项,即Tab标签,如果想要放到底部,则可用android:layout_gravity="bottom"-->
    <TabWidget
        android:id="@android:id/tabs"
        android:layout_width="match_parent"
        android:layout_height="50dp" />
    <FrameLayout
        android:id="@android:id/tabcontent"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_marginTop="50dp">
        <!--Tab页1-->
        <LinearLayout
            android:id="@+id/tab_1"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:gravity="center_horizontal"
            android:background="@color/color_00ff00"
            android:orientation="vertical">
            <Button
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="芝麻粒儿:标签一" />
        </LinearLayout>
        <!--Tab页2-->
        <LinearLayout
            android:id="@+id/tab_2"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:gravity="center_horizontal"
            android:background="@color/color_ff0000"
            android:orientation="vertical">
            <Button
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="芝麻粒儿:标签二" />
        </LinearLayout>
        <!--Tab页3-->
        <LinearLayout
            android:id="@+id/tab_3"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:gravity="center_horizontal"
            android:background="@color/color_0000ff"
            android:orientation="vertical">
            <Button
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="芝麻粒儿:标签三" />
        </LinearLayout>
    </FrameLayout>
</TabHost>

其中【@+id/tabhost】有两种情况:如果你的activity是继承的非TabActivity(这个是系统内置的),则id可以随便取,如果是继承的TabActivity则可以将id设置为内置的【android:id="@android:id/tabhost"】,在代码中直接使用getHost()方法获取到TabHost对象。

其他id如:【"@android:id/tabs】【"@android:id/tabcontent】都是内置的且建议这样用。

class ActivityTabHost : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_tab_host)
        idTabHost.setup();
        val page1 = idTabHost.newTabSpec("tab1").setIndicator("这是").setContent(R.id.tab_1)
        idTabHost.addTab(page1)
        val page2 = idTabHost.newTabSpec("tab2").setIndicator("标签").setContent(R.id.tab_2)
        idTabHost.addTab(page2)
        val page3 = idTabHost.newTabSpec("tab3").setIndicator("选项卡").setContent(R.id.tab_3)
        idTabHost.addTab(page3);
    }
}

如果继承的普通Acitivity,则必须适应tabHost的setup方法,如果继承的是TabActivity则不用。

image.png

👉其他

📢作者:小空和小芝中的小空

📢转载说明-务必注明来源:芝麻粒儿 的个人主页 - 专栏 - 掘金 (juejin.cn)

📢这位道友请留步☁️,我观你气度不凡,谈吐间隐隐有王者霸气💚,日后定有一番大作为📝!!!旁边有点赞👍收藏🌟今日传你,点了吧,未来你成功☀️,我分文不取,若不成功⚡️,也好回来找我。

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。