2014-03-21 3 views
13

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

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

Вот ответ, который использует схему XML вместо: [TextView на панели действий] (http://stackoverflow.com/a/24716629/383414) –

ответ

18

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

+0

Если я сделаю это, я до сих пор для определения определенного элемента в menu.xml? Потому что я создаю элемент программно, и я не знаю, каковы рефери FILTER_ID def – masmic

+1

Спасибо. Очень точное и точное решение –

+3

что такое 'FILTER_ID'? –

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); 
} 
Смежные вопросы