ActionBar上的动态TextView

时间:2014-03-21 08:49:07

标签: android menu bluetooth android-actionbar

我需要在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状态,并且不显示任何内容。然后,当状态发生变化且textview必须更新时,它会抛出 NPE

2 个答案:

答案 0 :(得分:20)

您可以在

中手动添加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作为类变量。

答案 1 :(得分:1)

万一有人仍然需要这个:

您可以通过调用菜单项上的setTitle("Your new string or String resource id")方法动态设置菜单项的text属性。这样,您就不必将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);
}