Как изменить текст вкладки Android на лету? - PullRequest
15 голосов
/ 08 сентября 2010

Кажется, это должно быть просто, но я не могу придумать, как это сделать. Мне нужна вкладка, чтобы иметь начальный текст, но затем изменить этот текст после того, как пользователь выбирает элемент из списка. Я знаю, как изменить фон и цвет вкладок с помощью

mTabHost.getChildAt(index).setBackgroundColor();

но нет возможности изменить индикатор вкладки. Я пытался использовать EditText.

private EditText tabName;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.statistics);

    comm = new Communicator();

    tabName = new EditText(this);
    tabName.setText("BeginningText");

    mTabHost = getTabHost();
    mTabHost.addTab(mTabHost
                   .newTabSpec("tab_1_stat")
                   .setIndicator(User)
                   .setContent(R.id.meStatsTab));
    mTabHost.addTab(mTabHost
                   .newTabSpec("tab_2_stat")
                   .setIndicator(tabName.getText())
                   .setContent(R.id.themStatsTab));
    mTabHost.addTab(mTabHost
                   .newTabSpec("tab_3_stat")
                   .setIndicator("Archive")
                   .setContent(R.id.archiveStatsTab));
    mTabHost.setOnTabChangedListener(this);
    getTabWidget().getChildAt(1).setOnClickListener(new onThemTabClicked());
    mTabHost.setCurrentTab(0);

    onTabChanged("tab_1_stat");

}

.....

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent intent) {
    super.onActivityResult(requestCode, resultCode, intent);

    tabName.setText("ChangedTabText");
    Bundle extras = intent.getExtras();
    themStats = extras.getStringArray("themStats");
    mTabHost.setCurrentTab(1);
    onTabChanged("tab_2_stat");
}

Это не сработало, наряду с несколькими другими попытками. Есть идеи? Спасибо заранее!

Ответы [ 7 ]

8 голосов
/ 09 сентября 2010

Ничего себе. Хорошо, это была боль. Очевидно, что TabWidget делает что-то необычное с RelativeLayout, и каждый раз, когда я пытался что-то делать с решением radek-k, оно взрывалось ошибкой RelativeLayout. Таким образом, в основном решение проблемы заключается в следующем. Он также позволяет изменять шрифт, размер шрифта, цвет шрифта и т. Д.

TabWidget vTabs = getTabWidget();
RelativeLayout rLayout = (RelativeLayout) vTabs.getChildAt(tabIndex);
((TextView) rLayout.getChildAt(textIndex)).setText("NewTabText");

или в одну строку ...

((TextView)((RelativeLayout)getTabWidget().getChildAt(tabIndex)).getChildAt(textIndex)).setText("NewTabText");

где "textIndex" - индекс текстового поля. В данном случае это 1. Если на вкладке есть значок или пользовательские изменения, индекс может измениться.

Еще раз спасибо Радек-К. Ты определенно указал мне правильное направление.

6 голосов
/ 19 июня 2017

Попробуйте этот самый простой способ, который работает для меня:

tabLayout.getTabAt(index).setText("TabName");
5 голосов
/ 13 марта 2012

Вы можете сделать это, не зная магический индекс TextView, используя findViewById:

TabWidget vTabs = getTabWidget();
View indicatorView = vTabs.getChildAt(tabIndex);
((TextView) indicatorView.findViewById(android.R.id.title)).setText("NewTabText");
2 голосов
/ 08 сентября 2010
TabWidget vTabs = .....;

// get desired tab view  
View vTab = vTabs.getChildAt(i);

// I guess vTab is instance of TextView
TextView vText = (TextView) vTab;

vText.setText(...);
0 голосов
/ 01 апреля 2019

Вот ваш макет:

<com.google.android.material.tabs.TabLayout
    android:id="@+id/ref_tabs"
    android:layout_width="match_parent"
    android:layout_height="wrap_content">

    <com.google.android.material.tabs.TabItem
        android:id="@+id/ref_book"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

    <com.google.android.material.tabs.TabItem
        android:id="@+id/ref_chpter"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

    <com.google.android.material.tabs.TabItem
        android:id="@+id/ref_verse"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

</com.google.android.material.tabs.TabLayout>

Вот ваш код:

TabLayout tabLayout = findViewById(R.id.ref_tabs);
tabLayout.getTabAt(0).setText("BOOK"));
tabLayout.getTabAt(1).setText("CHAPTER"));
tabLayout.getTabAt(2).setText("VERSE"));
0 голосов
/ 17 ноября 2018

Это просто и легко. Попытайся. Это работает.

TabWidget tab = (TabWidget) findViewById (R.id.tab1);
((TextView)tab.getChildTabViewAt (1)).setText ("New name here");
0 голосов
/ 18 августа 2013

Вы можете сделать это так

TabHost tabHost = getTabHost();
TextView tv = (TextView) tabHost.getTabWidget().getChildAt(0).findViewById(android.R.id.title);
tv.setText("New Tab Text");

Где android.R.id.title - Сгенерированная системой, просто измените ChildIndex и Текст в соответствии с вашими потребностями

...