Android Toolbar/ActionBar 设置查看初始状态
Android Toolbar/ActionBar set View initial state
我的应用程序有一个工具栏,用作操作栏,带有在 onCreateOptionsMenu() 中膨胀的菜单。其中一个菜单项显示了我们使用的服务的状态。我可以毫无问题地更改该视图的文本和颜色,但我无法可靠地设置初始状态,因为当我尝试设置初始状态时, findViewById(R.id.menu_listening_item) returns 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() 中再次调用它,但是其中 none 是在视图存在时调用的。出于显而易见的原因,我想避免自旋循环。
视图存在后运行什么时候合适?
由于 Android 没有我能找到的任何好的方法来做到这一点,我通过创建自定义 button/view 来解决这个问题。该视图在创建时订阅服务,然后在删除时取消订阅。
在我的 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
}
我省略了几个创建自定义视图对象的步骤,但这些步骤很容易找到,而且每个人的情况都有点不同。我希望这对其他人有帮助。
我的应用程序有一个工具栏,用作操作栏,带有在 onCreateOptionsMenu() 中膨胀的菜单。其中一个菜单项显示了我们使用的服务的状态。我可以毫无问题地更改该视图的文本和颜色,但我无法可靠地设置初始状态,因为当我尝试设置初始状态时, findViewById(R.id.menu_listening_item) returns 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() 中再次调用它,但是其中 none 是在视图存在时调用的。出于显而易见的原因,我想避免自旋循环。
视图存在后运行什么时候合适?
由于 Android 没有我能找到的任何好的方法来做到这一点,我通过创建自定义 button/view 来解决这个问题。该视图在创建时订阅服务,然后在删除时取消订阅。
在我的 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
}
我省略了几个创建自定义视图对象的步骤,但这些步骤很容易找到,而且每个人的情况都有点不同。我希望这对其他人有帮助。