首页 > 解决方案 > Android Toolbar/ActionBar 设置查看初始状态

问题描述

我的应用程序有一个用作操作栏的工具栏,其中包含在 onCreateOptionsMenu() 中膨胀的菜单。其中一个菜单项显示了我们使用的服务的状态。我可以毫无问题地更改该视图的文本和颜色,但我无法可靠地设置初始状态,因为当我尝试设置初始状态时,findViewById(R.id.menu_listening_item) 返回 null。

这是我设置视图状态的代码:

final TextView statusView = findViewById(R.id.menu_item);
    if(statusView == null) {
         initialMode = newMode;
         return;
    }
    switch(newMode) {
         case SpeechDetector.FIRST_MODE:
               statusView.post(() -> {
                   statusView.setText(R.string.first_mode);
                   statusView.setTextColor(Color.WHITE);
                   statusView.setBackgroundColor(Color.BLUE);
                });
                break;
     ....

由于最初由服务代码调用,因此如果视图为空,我将存储该值。然后我会在视图不为空时再次调用此代码,但是如何?

我已经尝试在 onResume()、onCreateOptionsMenu() 和 onPrepareOptionsMenu() 中再次调用它,但是当视图存在时,这些都不会被调用。出于明显的原因,我想避免旋转循环。

视图存在后什么时候运行合适?

标签: androidandroid-actionbarandroid-toolbar

解决方案


由于Android没有任何我能找到的好方法来做到这一点,我通过创建一个自定义按钮/视图来解决它。该视图在创建时订阅服务,然后在删除时取消订阅。

在我的 menu.xml 中:

<item
    android:id="@+id/menu_custom_item"
    app:showAsAction="always|withText"
    android:title="@string/custom"
    app:actionLayout="@layout/custom_button">
</item>

这是由我的菜单工具栏拉入的。custom_button 布局是:

<com.company.package.views.CustomButton
     xmlns:android="http://schemas.android.com/apk/res/android"
     android:layout_height="wrap_content"
     android:layout_width="wrap_content" />

然后 CustomButton 的构造函数订阅该服务,该服务将告诉它何时更新。最后(而且很难找到),当 CustomButton 消失时,我需要取消订阅:

@Override
protected void onDetachedFromWindow() {
    super.onDetachedFromWindow();
    // Don't leak memory, unsubscribe from the Service here
}

我省略了创建自定义视图对象的几个步骤,但这些步骤很容易找到,而且每个人的情况都略有不同。我希望这对其他人有帮助。


推荐阅读