寻找适用于 Android、HTC Sense、Samsung 等皮肤的通用 TabHost 样式

2023-11-25

Android TabHost 的默认样式适用于普通 Android 系统。然而,在 HTC Sense 上,他们在深色背景上使用深色文本,这是不可读的。

TabHost from HTC Sense UI

让 TabHost 在所有不同风格的 Android 皮肤中具有可见文本的最简单方法是什么?如果可能的话,我宁愿不必制作完全定制的外观和感觉。

我的 targetSDK 是 10,我的 minSDK 是 7。


我将建议您完全独立于 TabWidget 并创建自己的导航,您可以根据需要自定义导航,而不必为僵硬的 TabWidget 烦恼。我并不是要放弃很棒的 TabHost,因为通过自定义导航使用 TabHost 很容易:

首先将您的 TabWidget 设置为消失:

<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">
    <RelativeLayout
        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"
            android:visibility="gone"/>

然后创建您自己的导航来代替它。您还可以创建一个菜单(使用硬件菜单按钮)或类似的内容:

<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">
    <RelativeLayout
        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"
            android:visibility="gone"/>
        <!-- content of your tabs-->
        <FrameLayout
            android:id="@android:id/tabcontent"
            android:layout_width="fill_parent"
            android:layout_height="fill_parent"
            android:layout_above="@id/slider_stub"
            android:background="@color/overview_banner_bg_down"/>
        <!-- custom slider with horizontal scrollable radio buttons-->
        <com.example.WrappingSlidingDrawer
            android:id="@+id/tab_slider"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:layout_alignParentBottom="true"
            android:handle="@+id/tab_slider_handle"
            android:content="@+id/tab_scroller">
            <RelativeLayout
                android:id="@+id/tab_slider_handle"
                android:layout_width="fill_parent"
                android:layout_height="wrap_content"
                android:background="@drawable/def_slider">
            </RelativeLayout>
            <HorizontalScrollView
                android:id="@+id/tab_scroller"
                android:layout_width="fill_parent"
                android:layout_height="wrap_content"
                android:fadeScrollbars="false"
                android:scrollbarAlwaysDrawHorizontalTrack="true"
                android:scrollbarTrackHorizontal="@drawable/scrollbar_horizontal_track"
                android:scrollbarThumbHorizontal="@drawable/scrollbar_horizontal_thumb"
                android:fillViewport="true"
                android:scrollbarSize="3dip"
                android:fadingEdgeLength="80dp"
                android:background="#343534">
                <RelativeLayout
                    android:layout_width="fill_parent"
                    android:layout_height="wrap_content">
                    <RadioGroup
                        android:id="@+id/custom_tabs"
                        android:layout_width="fill_parent"
                        android:layout_height="wrap_content"
                        android:layout_centerHorizontal="true"
                        android:gravity="center"
                        android:orientation="horizontal"
                        android:checkedButton="@+id/tab_overview">
                        <RadioButton
                            android:id="@+id/tab_overview"
                            android:layout_height="55dp"
                            android:layout_width="55dp"
                            android:button="@null"
                            android:background="@drawable/def_checktab_overview"/>
                        <RadioButton
                            android:id="@+id/tab_news"
                            android:layout_height="55dp"
                            android:layout_width="55dp"
                            android:button="@null"
                            android:background="@drawable/def_checktab_news"/>
                            .....etc....your tabs......
                    </RadioGroup>
                </RelativeLayout>
            </HorizontalScrollView>
        </com.example.WrappingSlidingDrawer>
    </RelativeLayout>
</TabHost>

您现在需要在代码中做什么:

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main_tab_layout);

    setTabs();

    RadioGroup tabs = (RadioGroup) findViewById(R.id.custom_tabs);

    tabs.setOnCheckedChangeListener(new OnCheckedChangeListener() {
        @Override
        public void onCheckedChanged(RadioGroup group, int checkedId) {
            switch (checkedId) {
            case R.id.tab_overview:
                getTabHost().setCurrentTab(0);
                break;
            case R.id.tab_news:
                getTabHost().setCurrentTab(1);
                break;
            ....etc.....
            }
        }
    });
}

/**
 * Delegate tab creation and adding.
 */
private void setTabs() {
    // add the necessary tabs
    addTab(R.string.tab_overv_tag, OverviewActivityGroup.class);
    addTab(R.string.tab_news_tag, NewsActivityGroup.class);
            .....etc.....
}

/**
 * Create a tab with an Activity and add it to the TabHost
 *  
 * @param tagId
 *            resource id of the string representing the tag for finding the tab    
 * @param activity
 *            the activity to be added
 */
private void addTab(int tagId, Class<? extends ActivityGroup> activity) {
    // create an Intent to launch an Activity for the tab (to be reused)
    Intent intent = new Intent().setClass(this, activity);
    // initialize a TabSpec for each tab and add it to the TabHost
    TabHost.TabSpec spec = usedTabHost.newTabSpec(getString(tagId));
    // use layout inflater to get a view of the tab to be added
    View tabIndicator = getLayoutInflater().inflate(R.layout.tab_indicator, getTabWidget(), false);
    spec.setIndicator(tabIndicator);
    spec.setContent(intent);
    usedTabHost.addTab(spec);
}

顺便说一句,不需要整个指示器的东西。^^ 在您的活动组中,您必须设置适当的活动等。您知道这些东西。

您可以使用任何内容进行导航,并且仍然可以利用 TabHost 的优势。只是不再为那个 TabWidget 烦恼了。 ;)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

寻找适用于 Android、HTC Sense、Samsung 等皮肤的通用 TabHost 样式 的相关文章

  • 如何对这个字符串进行子串化

    我想得到这个字符串的 4 个部分 String string 10 trillion 896 billion 45 million 56873 我需要的4个部分是 10万亿 8960亿 4500万 和 56873 我所做的是删除所有空格 然
  • 使用workmanager时Firestore脱机持久性错误

    我正在使用一个WorkManger定期从我的中检索信息Firestore当应用程序处于后台和前台时的数据库 此信息用于根据状态更新 UI 因此不同的状态会添加或删除 UI 的不同部分 第一次运行时效果很好 但是 一旦应用程序处于后台并且Wo
  • Android 后退按钮无法与 Flutter 选项卡内的导航器配合使用

    我需要在每个选项卡内有一个导航器 因此当我推送新的小部件时 选项卡栏会保留在屏幕上 代码运行得很好 但是 android 后退按钮正在关闭应用程序而不是运行 Navigator pop import package flutter mate
  • 无法获取log.d或输出Robolectrict + gradle

    有没有人能够将 System out 或 Log d 跟踪从 robolectric 测试输出到 gradle 控制台 我在用Robolectric Gradle 测试插件 https github com robolectric robo
  • 计数物体和更好的填充孔的方法

    我是 OpenCV 新手 正在尝试计算物体的数量在图像中 我在使用 MATLAB 图像处理工具箱之前已经完成了此操作 并在 OpenCV Android 中也采用了相同的方法 第一步是将图像转换为灰度 然后对其进行阈值计算 然后计算斑点的数
  • Android 模拟器插件无法初始化后端 EGL 显示

    我在 Cloudbees 上设置了 Jenkins 作业 并且可以在那里成功签出并编译我的 Android 项目 现在我想在 android 模拟器中运行一些 JUnit 测试并添加 Android 模拟器插件 我将 显示模拟器窗口 选项设
  • 在 HTTPResponse Android 中跟踪重定向

    我需要遵循 HTTPost 给我的重定向 当我发出 HTTP post 并尝试读取响应时 我得到重定向页面 html 我怎样才能解决这个问题 代码 public void parseDoc final HttpParams params n
  • 是否有 ADB 命令来检查媒体是否正在播放

    我想使用 ADB 命令检查根植于终端的外部设备中是否正在播放音频 视频 我无法找到任何 ADB 命令 如果有 我尝试过 adb shell dumpsys media player 我想要一个命令来指定视频是否正在运行 您可以使用以下命令查
  • 在gradle插件中获取应用程序变体的包名称

    我正在构建一个 gradle 插件 为每个应用程序变体添加一个新任务 此新任务需要应用程序变体的包名称 这是我当前的代码 它停止使用最新版本的 android gradle 插件 private String getPackageName
  • 你的CPU不支持NX

    我刚刚下载了 android studio 但是我遇到了一个问题 当我运行它时 它说你的 cpu 不支持 NX 我应该怎么办 NX 或实际上是 NX 处理器位 是处理器的一项功能 有助于保护您的 PC 免受恶意软件的攻击 当此功能未启用并且
  • Ubuntu 16.04 - Genymotion:找不到 /dev/hw_random

    I install Genymotion on the Ubuntu 16 04 64Bit I created a virtual emulator for Android 6 0 then I run this emulator but
  • 错误:在根项目“projectName”中找不到项目“app”

    我有一个在 Eclipse 中开发的旧应用程序 现在尝试将其迁移到 Android Studio 我更新了库并遵循了基本步骤 现在 我收到此错误 Error Project app not found in root project pro
  • 我的设备突然没有显示在“Android 设备选择器”中

    我正在使用我的三星 Galaxy3 设备来测试过去两个月的应用程序 它运行良好 但从今天早上开始 当我将设备连接到系统时 它突然没有显示在 Android 设备选择器 窗口中 我检查过 USB 调试模式仅在我的设备中处于选中状态 谁能猜出问
  • .isProviderEnabled(LocationManager.NETWORK_PROVIDER) 在 Android 中始终为 true

    我不知道为什么 但我的变量isNetowrkEnabled总是返回 true 我的设备上是否启用互联网并不重要 这是我的GPSTracker class public class GPSTracker extends Service imp
  • 增加活动的屏幕亮度

    显然 Android 操作系统中至少有三种不同的技术可以改变屏幕亮度 其中两个在纸杯蛋糕之后不再起作用 而第三个被接受的技术显然有一个错误 我想在单视图活动开始时增加屏幕亮度 然后在活动结束时将亮度恢复为用户设置 没有按钮 没有第二个视图或
  • 在activity_main.xml中注释

    我是安卓新手 据我所知 XML 中的注释与 HTML 中的注释相同 使用 形式 我想在 Android 项目的 Activity main xml 配置文件中写一些注释 但它给了我错误 值得注意的是 我使用的是 Eclipse 但目前 我直
  • 如何确定对手机号码的呼叫是本地呼叫还是 STD 或 ISD

    我正在为 Android 开发某种应用程序 但不知道如何获取被叫号码是本地或 STD 的号码的数据 即手机号码检查器等应用程序从哪里获取数据 注意 我说的是手机号码 而不是固定电话 固定电话号码 你得到的数字是字符串类型 因此 您可以获取号
  • 实现滚动选择 ListView 中的项目

    我想使用 ListView 您可以在其中滚动列表来选择一个项目 它应该像一个 Seekbar 但拇指应该是固定的 并且您必须使用该栏来调整它 我面临的一个问题是 我不知道这种小部件是如何调用的 这使得我很难搜索 所以我制作了下面这张图片 以
  • 捕获的图像分辨率太大

    我在做什么 我允许用户捕获图像 将其存储到 SD 卡中并上传到服务器 但捕获图像的分辨率为宽度 4608 像素和高度 2592 像素 现在我想要什么 如何在不影响质量的情况下获得小分辨率图像 例如我可以获取或设置捕获的图像分辨率为原始图像分
  • android sdk 的位置尚未在 Windows 操作系统的首选项中设置

    在 Eclipse 上 我转到 windows gt Android SDK 和 AVD Manager 然后弹出此消息 Android sdk 的位置尚未在首选项中设置 进入首选项 在侧边栏找到 Android 然后会出现一个 SDK 位

随机推荐

  • 包含所有私有成员的类可以是 POD 类吗?

    我之前听说过 POD 类型不能有私有数据 但根据 C 0x 草案 我的要求更宽松 强调我的 has the 相同的访问控制 第 11 条 对于所有非静态数据成员 这似乎表明私有数据只要是私有的就可以 我没有 C 03 的副本来检查 那么 W
  • 在完整框架 4.7 项目上添加对 .NET Core 2.0 DLL 的引用

    我在这里寻找这个问题但没有找到答案 我有一个针对 NET Core 2 0 的类库项目和一个针对 NET Full Framework 4 7 的 WPF 项目 我无法引用 WPF 项目上的类库 我收到以下错误 项目 xxxxxxxx 的目
  • 如何使用 IIS7 修复 CSS 文件内链接的 URL 重写

    我正在尝试为家里的朋友设置代理服务器 我目前正在关注网站上的教程 http blogs iis net carlosag archive 2010 04 01 setting up a reverse proxy using iis url
  • 将 NSTimer 的触发时间重置为从现在开始而不是上次触发

    我有一个NSTimer以 3 秒的间隔触发以减少值 当我执行增加该值的操作时 我想重新启动计时器 从该点开始计时 3 秒 例如 如果我增加该值并且计时器将在 1 秒内触发 我想更改它并让计时器在 3 秒内触发 我可以使计时器无效并重新创建它
  • 从Python中独立于操作系统的位置加载配置文件

    在Linux下我把我的配置放在 programname 中 我应该将其放置在 Windows 中的什么位置 在 python 中打开独立于操作系统的配置文件的推荐方法是什么 谢谢 内森 在 Windows 上 您将其存储在os enviro
  • 如何制作一个通过其他两个枚举器进行延迟迭代的 ruby​​ 枚举器?

    假设我有两个枚举器 enum1 and enum2必须延迟迭代 因为它们有副作用 如何构造第三个枚举器enum3 where enum3 each x x would lazily返回相当于enum1 enum2 在我的现实用例中 我正在流
  • 正确使用JTidy净化HTML

    我正在尝试使用 JTidy jtidy r938 jar 来清理输入 HTML 字符串 但我似乎无法正确设置默认设置 通常 诸如 hello world 之类的字符串在整理后最终会变成 helloworld 我想展示我在这里所做的事情 任何
  • 缓存一致性协议如何强制原子性?

    我知道原子性可以在诸如xsub 不使用LOCK前缀 依靠缓存一致性协议 MESI MESIF 1 缓存一致性协议如何做到这一点 这让我想知道缓存一致性协议是否可以强制原子性 为什么我们需要特殊的原子类型 指令等 2 如果MOSI实现跨多核系
  • Ruby on Rails+PostgreSQL:自定义序列的使用

    假设我有一个模型叫Transaction其中有一个 transaction code属性 我希望该属性自动填充一个序列号 该序列号可能不同于id 例如 与id 1可以有transaction code 1000 我尝试在 postgres
  • 是否有一个不使用回调的 $getJSON 版本?

    我正在为 3rdParty javascript 库实现回调 我需要返回该值 但我需要从服务器获取该值 我需要做这样的事情 3rdPartyObject getCustomValue function return getJSON myUr
  • 表视图控制器每一行连接到不同的视图控制器

    我正在尝试开发一个表视图控制器 其中行连接到多个View Controllers 文本字段 文本视图 表格视图 日期选择器 图像视图等 因此 如果我单击任何行 它应该打开Intermediate View并将适当的控制器放置在一个公共位置
  • Common Lisp 中对象的内存使用情况

    有没有办法找出类或基本数据类型的实例一般使用了多少内存 我在 cl 中有一个玩具网络框架 它使用代表 html 标签及其属性的类实例创建和管理网页 并且由于它们应该创建一个 html 页面 因此它们在称为 children 的插槽中拥有子级
  • 寻找一种方法来动态添加更多列表到 jQuery Mobile 列表视图的底部

    我正在寻找一种在向下滚动后将更多列表添加到列表视图底部的方法 例如 我最初退货了 20 件商品 我打算使用分页 只返回从查询中返回的尽可能多的内容 但我宁愿返回 15 20 然后在滚动结束时自动向此列表添加更多内容 或者有一个按钮显示 查看
  • Angular 2 rc3 路由器弃用包问题

    欢迎 Angular 2 rc 3 I use project json from 5 分钟快速入门配置我的项目 但是当我运行时npm install我收到以下错误 No compatible version found angular e
  • C++20 范围适配器的递归应用导致编译时无限循环

    C 20 中的范围库支持表达式 auto view r std views drop n 删除第一个n范围的元素r与范围适配器drop 但是 如果我递归地从范围中删除元素 编译器将进入无限循环 最小工作示例 在 GCC 10 中编译需要无限
  • TYPO3 - 调用另一个存储库

    是否可以在不同的控制器中调用一个函数 我需要打电话FindByCategoryGrouped catId 在 designRepository php 和getCategories catId 来自categoryRepository ph
  • Terraform:从命令行提供列表输入值?

    有没有办法从命令行提供列表值 地图有变量合并 但它似乎不适用于列表 我希望有类似的东西 但没有运气 谢谢 terraform apply var listvar abc1 var listvar abc2 或者可能 terraform ap
  • Django - 使用从类似 REST 的 API 检索的数据构建报告的应用程序

    我一直在构建一个 Django 应用程序 它使用来自扩展的类似 REST 的 API 的数据 API 是使用 NET 构建的 哎呀 不是我的选择 因为我宁愿挖出我的眼球也不愿学习 Microsoft 工具 我是一个 nix OSX 人 而且
  • 如何设计灵活的Erlang协议栈创建API

    我对当前的方法不满意 只是尝试重新设计在 Erlang 中构建协议栈的方式 该功能按重要性排序 表现 添加新协议变体的灵活性和实施速度 它将有助于开发从 shell 探索协议变体 我当前的型号 这个问题已经描述过除了通过函数调用发送 和通过
  • 寻找适用于 Android、HTC Sense、Samsung 等皮肤的通用 TabHost 样式

    Android TabHost 的默认样式适用于普通 Android 系统 然而 在 HTC Sense 上 他们在深色背景上使用深色文本 这是不可读的 让 TabHost 在所有不同风格的 Android 皮肤中具有可见文本的最简单方法是