Android - 在运行时更改自定义标题视图

2024-04-10

我在应用程序中为每个活动使用自定义标题视图。在其中一项活动中,根据按钮点击,我需要更改自定义标题视图。现在,每次我调用 setFeatureInt 时,这都可以正常工作。

但是,如果我尝试更新自定义标题中的任何项目(例如更改标题上的按钮文本或文本视图),则更新不会发生。

通过代码调试显示文本视图和按钮实例不为空,我还可以看到自定义标题栏。但文本视图或按钮上的文本不会更新。还有其他人遇到过这个问题吗? 我该如何解决?

Thanks.

EDIT

这是我尝试过的。即使调用 postInvalidate 也不会更新。

    getWindow().setFeatureInt(Window.FEATURE_CUSTOM_TITLE, R.layout.text_title);

    TextView databar = (TextView) findViewById(R.id.title_text);
    databar.setText("Some Text");
    databar.postInvalidate();

    Button leftButton = (Button) findViewById(R.id.left_btn);
    leftButton.setOnClickListener(mLeftListener);
    leftButton.setText("Left Btn");
    leftButton.postInvalidate();

    Button rightBtn = (Button) findViewById(R.id.right_btn);
    rightBtn.setOnClickListener(mRightListener);
    rightBtn.postInvalidate();

问题是唯一的Window http://developer.android.com/reference/android/view/Window.html执行 (PhoneWindow http://android.git.kernel.org/?p=platform/frameworks/policies/base.git;a=blob_plain;f=phone/com/android/internal/policy/impl/PhoneWindow.java;hb=HEAD)使用一个LayoutInflater http://developer.android.com/reference/android/view/LayoutInflater.html in its setFeatureInt方法并实例化新布局inflate http://developer.android.com/reference/android/view/LayoutInflater.html and attachToRoot=true。因此,当你打电话时setFeatureInt,新的布局不是replaced but attached到内部标题容器,因此绘制在彼此之上。

您可以使用以下辅助方法来解决此问题,而不是setFeatureInt。在设置新的自定义标题功能之前,助手只是从内部标题容器中删除所有视图:


private void setCustomTitleFeatureInt(int value) {
    try {
        // retrieve value for com.android.internal.R.id.title_container(=0x1020149)
        int titleContainerId = (Integer) Class.forName(
            "com.android.internal.R$id").getField("title_container").get(null);

        // remove all views from titleContainer
        ((ViewGroup) getWindow().findViewById(titleContainerId)).removeAllViews();

        // add new custom title view 
        getWindow().setFeatureInt(Window.FEATURE_CUSTOM_TITLE, value);

    } catch(Exception ex) {
        // whatever you want to do here..
    }
}

我不确定当前是否setFeatureInt行为是有意为之的,但它肯定没有以某种方式记录下来,这就是为什么我会将其带给 Android 开发人员;)

EDIT

正如评论中指出的,上述解决方法并不理想。而不是依赖于com.android.internal.R.id.title_container常数你可以简单地hide每当您设置新标题时,都会使用旧的自定义标题。

假设您有两个自定义标题布局:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout android:id="@+id/custom_title_1" ...

and

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout android:id="@+id/custom_title_2" ...

你想更换custom_title_1 with custom_title_2,你可以隐藏前者并使用setFeatureInt添加后者:

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

Android - 在运行时更改自定义标题视图 的相关文章

随机推荐

  • 将项目添加到 ListView,保持滚动位置并且看不到滚动跳跃

    我正在构建一个类似于 Google Hangouts 聊天界面的界面 新消息将添加到列表底部 向上滚动到列表顶部将触发加载以前的消息历史记录 当历史记录从网络传入时 这些消息将添加到列表的顶部 并且不应从触发加载时用户停止的位置触发任何类型
  • 无法确定 Architect 命令 Angular 的项目或目标

    C Users muhiuddin TOWERTECH test testapp gt ng build target production or C Users muhiuddin TOWERTECH test testapp gt ng
  • 如何在开发环境中使用 MobileIron 的 Web@Work 进行测试?

    我有一个可以在任何浏览器中完美运行的网站 现在我想使用 MobileIron 的 Web Work 浏览器将该网站用作书签 以创建一个通过 MobileIron 打包的基本 iOS 应用程序 Web Work的基本介绍在这里 https w
  • java标准序列化顺序

    我想知道以下示例类的属性将按什么顺序序列化 public class Example implements Serializable private static final long serialVersionUID 8845294179
  • 底层提供商无法打开

    HI 我正在使用 VS2010 并使用 Microsoft Entity Framework 4 0 我正在开发一个 Windows 应用程序 我在我的应用程序中绑定了几个组合 工作正常 void BindNatureOfIndustryC
  • 为什么我的 javascript getter/setter 需要下划线?

    执行 Get 或 Put 操作a抛出一个 RangeError 指出Maximum call stack size exceeded指向this a在吸气剂和 在设置器中 let someObject get a return this a
  • apollo graphql 架构 React-admin 初学者

    这些技术是全新的 到目前为止我所看到的让我非常兴奋 我很难找到我所坚持的东西的例子 React admin 的文档建议我的模式说 Posts 遵循 allPosts 和 allPostsMeta allPosts 部分工作没有问题 但自然
  • 如何从自定义视图中访问layout_height?

    我有一个自定义视图 我只是希望访问 xml 布局值layout height 我目前正在获取该信息并将其存储在 onMeasure 期间 但这仅在首次绘制视图时发生 我的视图是 XY 图 它需要尽早知道其高度 以便可以开始执行计算 该视图位
  • 悬停在父 div 上时更改子 div 的背景颜色吗? [复制]

    这个问题在这里已经有答案了 我想在父 div 悬停时更改子 div 的背景颜色 目前 我可以更改颜色 但只能将鼠标悬停在子 div 上 但是 我也想更改父 div 悬停时的颜色 div class content div class log
  • 如何使用 Selenium Safari Webdriver

    我正在尝试使用 Safari WebDriver 并且按照说明进行操作here https code google com p selenium wiki SafariDriverInternals构建 Safari 驱动程序 但现在我不知
  • 稍后如何在 SwiftUI 中访问内容视图的元素?

    假设我有一个像这样的内容视图 struct ContentView View State private var selection 0 var body some View TabView selection selection Cust
  • 不确定 openmp 循环中应该共享或私有什么

    我有一个更新矩阵 A 的循环 我想将其设为 openmp 但我不确定哪些变量应该共享和私有 我本以为只有 ii 和 jj 就可以工作 但事实并非如此 我想我也需要在某个地方进行 OMP ATOMIC UPDATE 该循环仅计算 N 和 N
  • 为什么我收到“参数从未使用过 [E0392]”?

    我正在尝试用 Rust 实现八叉树 八叉树在类型上是通用的 但有一个约束 即它应该实现通用特征 pub trait Generable u fn generate children self data U gt Vec u
  • QGraphicsItem移动事件-获取绝对位置

    我有一个QGraphicsEllipseItem我想要移动并在移动时触发信号 所以我子类化了QGraphicsEllipseItem and QObject并覆盖了itemChange方法来触发信号 这一切似乎都有效 但报告的位置似乎与该项
  • TWA - 数字资产链接正常,但地址栏仍然可见

    我开发了一个渐进式 Web 应用程序 我想将其作为可信 Web 活动在 Play 商店中发布 它是https www bagnoadriatico it https www bagnoadriatico it 遵循本指南https deve
  • 后退按钮文本没有改变

    对于我的视图控制器之一 扩展 UITableViewController 我需要将其后退按钮文本配置为 后退 但后退按钮仍然显示父视图控制器的标题 默认 void viewDidLoad self navigationItem backBa
  • Windows 编译器上的 timespec

    在 posix 上 可以使用 timespec 来计算准确的时间长度 如秒和毫秒 不幸的是 我需要使用 Visual Studio 编译器迁移到 Windows VS time h 库没有声明 timespec 所以我正在寻找其他选项 就搜
  • 企业库验证块的 Asp.Net MVC 2 客户端验证实现

    我找到了一个非常好的文章 http bradwilson typepad com blog 2009 10 enterprise library validation example for aspnet mvc 2 html关于如何在 M
  • TCP 代理:在后端不可用时保持连接

    在 Docker 设置的上下文中 我想使用类似大使的模式来允许某些容器 例如数据库服务器 正常重新启动 而不必重新启动所有依赖的容器 例如 Web 服务器 并且没有错误消息 因为 数据库服务器不可用 因此 我想知道 是否有一个 TCP 代理
  • Android - 在运行时更改自定义标题视图

    我在应用程序中为每个活动使用自定义标题视图 在其中一项活动中 根据按钮点击 我需要更改自定义标题视图 现在 每次我调用 setFeatureInt 时 这都可以正常工作 但是 如果我尝试更新自定义标题中的任何项目 例如更改标题上的按钮文本或