【问题标题】:Dynamic TextView on ActionBarActionBar 上的动态 TextView
【发布时间】:2014-04-28 12:59:41
【问题描述】:

我需要在 ActionBar 中实现一个 TextView。此 TextView 显示蓝牙连接的状态,因此它将根据此状态进行更新。

我不是在谈论更改 ActionBar 的标题,而是添加一个 textview f.e.在标题下方或右侧。

目前,我所做的是在 menu.xml 中创建一个项目:

<item
    android:id="@+id/statusTextview"
    android:actionViewClass="android.widget.TextView"
    android:showAsAction="ifRoom"
    android:title="Disconected" />

然后在mainActivity上添加:

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.bluetooth, menu);
    return true;
}
@Override
public boolean onPrepareOptionsMenu(final Menu menu) {
    final MenuItem menuItem = menu.findItem(R.id.statusTextview);
    tvStatus = (TextView) menuItem.getActionView();
    return super.onPrepareOptionsMenu(menu);
}

但它不能正常工作。第一次应该显示Disconnected 状态并且不显示任何内容。然后当状态改变并且文本视图必须更新时,它会抛出一个NPE

【问题讨论】:

标签: android menu bluetooth android-actionbar


【解决方案1】:

以防万一还有人需要这个:

您可以通过在菜单项上调用setTitle("Your new string or String resource id") 方法来动态设置菜单项的文本属性。这样,您不必将 ActionView 转换为 TextView。例如:

@Override
public boolean onPrepareOptionsMenu(Menu menu) {

    String bluetoothStatus = "Connected"; //get from source

   menu.findItem(R.id.the_id_of_the_menu_item).setTitle(bluetoothStatus);
    return super.onPrepareOptionsMenu(menu);
}

【讨论】:

    【解决方案2】:

    您可以在

    中手动添加TextView
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
    

    通过以下代码。

    TextView tv = new TextView(this);
                tv.setText(getString(R.string.matchmacking)+"  ");
                tv.setTextColor(getResources().getColor(R.color.WHITE));
                tv.setOnClickListener(this);
                tv.setPadding(5, 0, 5, 0);
                tv.setTypeface(null, Typeface.BOLD);
                tv.setTextSize(14);
                menu.add(0, FILTER_ID, 1, R.string.matchmacking).setActionView(tv).setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS);
    

    如果您想访问文本视图,请将 tv 设为类变量。

    【讨论】:

    • 如果我这样做,我仍然需要在 menu.xml 中维护项目的定义吗?因为这种方式我正在以编程方式创建项目,但我不知道 FILTER_ID def 的引用是什么
    • 谢谢。非常精确和准确的解决方案
    • 什么是“FILTER_ID”?
    • FILTER_ID 似乎不是预定义的常量。检查doc。如果您不需要项目的唯一 ID,则可以将 0 作为第二个参数传递给 add()
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-24
    • 1970-01-01
    • 1970-01-01
    • 2011-05-07
    • 1970-01-01
    相关资源
    最近更新 更多