Изменение текста вкладки на вкладке панели действий Honeycomb после ее создания

#android #tabs #android-3.0-honeycomb #android-actionbar #settext

#Android #вкладки #android-3.0-honeycomb #android-панель действий #settext

Вопрос:

Я пытаюсь освоиться с Android Honeycomb, создав простое приложение для редактирования текста, которое использует панель действий и вкладки. Однако я сталкиваюсь с досадной проблемой. После того, как вкладка была создана и добавлена на панель действий, я хотел бы изменить текст, отображаемый на вкладке. Я думал, что использование следующего метода ActionBar.Tab.setText(CharSequence arg0) помогло бы, однако, похоже, что он не изменяет видимый текст. Что еще более странно, так это то, что если бы я вызвал getText (), он возвращает текст, на который я изменил вкладку. Ниже приведен фрагмент кода, который я использую для изменения текста вкладки:

 int currentTabIndex = ab.getSelectedNavigationIndex();
currentTabTitle = (String) ab.getTabAt(currentTabIndex).getText();  // just to check
ab.getTabAt(currentTabIndex).setText(fileName);                     // change tab text
currentTabTitle = (String) ab.getTabAt(currentTabIndex).getText();  // just to check
  

Я действительно в недоумении и искал везде. Я был бы очень признателен за любой совет, который у кого-либо есть. Спасибо за ваше время.

Комментарии:

1. Пользователи интернет-поиска, пожалуйста, проголосуйте за этот вопрос: code.google.com/p/android/issues /…

Ответ №1:

Это своего рода глупая проблема, и добавление и удаление вкладок — плохая идея, потому что, если вы используете фрагменты, вы в конечном итоге удалите и повторно добавите свой фрагмент с его вкладкой. Использование пользовательского представления, похоже, работает намного лучше и в качестве дополнительного бонуса предлагает вам более широкие возможности настройки.

Вот как создать вкладку с пользовательским представлением, которое выглядит и ведет себя идентично вкладкам по умолчанию:

 ActionBar bar = getActionBar();

TabListener tabListener = new TabListener() {

    @Override
    public void onTabReselected(Tab tab, FragmentTransaction ft) {
        // TODO Auto-generated method stub

    }

    @Override
    public void onTabSelected(Tab tab, FragmentTransaction ft) {
        // TODO Auto-generated method stub

    }

    @Override
    public void onTabUnselected(Tab tab, FragmentTransaction ft) {
        // TODO Auto-generated method stub

    }
};

Tab tab1 = bar.newTab()
          .setText("Info")
          .setTabListener(tabListener)
          .setCustomView(makeTabDummy("Info", android.R.drawable.ic_menu_info_details));

bar.addTab(tab1);
  

и вот пиксельный фиктивный вид:

 private TextView makeTabDummy(String text, int icon) {

    TextView tv = new TextView(this);
    tv.setText(text);
    tv.setTextColor(0xffffffff);
    tv.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 18);
    tv.setLayoutParams(new ViewGroup.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.FILL_PARENT));
    tv.setCompoundDrawablesWithIntrinsicBounds(icon, 0, 0, 0);
    tv.setGravity(Gravity.CENTER);

    return tv;
}
  

Отсюда мы можем изменять значки и текст на вкладке вообще без каких-либо проблем. Пример:

 TextView tv = (TextView) tab1.getCustomView();          
tv.setText("change the text!");
tv.setCompoundDrawablesWithIntrinsicBounds(android.R.drawable.btn_star_big_on, 0, 0, 0);
  

… и все работает так, как должно

Комментарии:

1. Я вижу эту проблему после изменения ориентации в пакете совместимости (Api 18), поэтому буду использовать это решение.

Ответ №2:

Попробуйте удалить вкладку и повторно добавить ее с нужным индексом после изменения текста. (Это ошибка. Связанный вид не обновляется, когда вы устанавливаете текст после добавления.)

Комментарии:

1. Спасибо за информацию! Я попробую это немного позже. Надеюсь, они скоро исправят это в обновлении.

2. «Скоро» — это относительно, но да, я это исправлю. 😉