Подтвердить что ты не робот

Динамический TextView на ActionBar

Мне нужно реализовать TextView в ActionBar. Этот TextView показывает статус соединения Bluetooth, поэтому он будет обновляться в зависимости от этого состояния.

Я не говорю об изменении названия 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.

4b9b3361

Ответ 1

Вы можете добавить 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 как переменную класса.

Ответ 2

На всякий случай кому-то все еще нужно:

Вы можете динамически установить свойство текста элемента меню, вызвав метод 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);
}