Динамический 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.
Ответы
Ответ 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);
}