#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. «Скоро» — это относительно, но да, я это исправлю. 😉