我的应用程序具有一个工具栏,它用作操作栏,其菜单在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;
....
由于最初是由服务代码调用的,因此如果视图为null,我将存储该值。然后,当视图不为null时,我将再次调用此代码,但是如何?
我尝试过在onResume(),onCreateOptionsMenu()和onPrepareOptionsMenu()中再次调用它,但是当视图存在时,不会调用它们。由于明显的原因,我想避免旋转循环。
该视图存在后的正确时间是何时运行?
答案 0 :(得分:0)
由于我没有找到可以执行此操作的好方法,因此我通过创建自定义按钮/视图来解决此问题。该视图在创建后订阅该服务,然后在删除后取消订阅。
在我的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
}
我省略了创建自定义视图对象的几个步骤,但是这些步骤很容易找到,每个人的情况都有些不同。我希望这对其他人有帮助。