В этом уроке:

- вручную создаем содержимое вкладки

 

При работе с вкладками система предоставляет нам возможность самим создать View, которое будет использовано в качестве содержимого вкладки. Нам надо просто создать объект, реализующий интерфейс TabContentFactory, и накодить метод createTabContent. Этот метод на вход берет тэг, а выдать должен View.

View мы умеем создавать двумя способами: 1) непосредственно ручное создание объекта;  2) с помощью LayoutInflater.

 

Создадим проект:

Project name: P0781_TabContentFactory
Build Target: Android 2.3.3
Application name: TabContentFactory
Package name: ru.startandroid.develop.p0781tabcontentfactory
Create Activity: MainActivity

 

Пропишем текст в strings.xml:

<?xml version="1.0" encoding="utf-8"?>
<resources>
	<string name="app_name">TabContentFactory</string>
	<string name="text_tab">Это создано с помощью LayoutInflater </string>
</resources>

 

Экран main.xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
	xmlns:android="http://schemas.android.com/apk/res/android"
	android:layout_width="fill_parent"
	android:layout_height="fill_parent"
	android:orientation="vertical">
	<TabHost
		android:id="@android:id/tabhost"
		android:layout_width="match_parent"
		android:layout_height="match_parent">
		<LinearLayout
			android:layout_width="match_parent"
			android:layout_height="match_parent"
			android:orientation="vertical">
			<TabWidget
				android:id="@android:id/tabs"
				android:layout_width="match_parent"
				android:layout_height="wrap_content">
			</TabWidget>
			<FrameLayout
				android:id="@android:id/tabcontent"
				android:layout_width="match_parent"
				android:layout_height="match_parent">
			</FrameLayout>
		</LinearLayout>
	</TabHost>
</LinearLayout>

FrameLayout не заполняем, т.к. сами будем View создавать.

 

Создадим layout-файл tab.xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
	xmlns:android="http://schemas.android.com/apk/res/android"
	android:layout_width="match_parent"
	android:layout_height="match_parent"
	android:orientation="vertical">
	<TextView
		android:layout_width="wrap_content"
		android:layout_height="wrap_content"
		android:text="@string/text_tab">
	</TextView>
</LinearLayout>

Из него мы с помощью LayoutInflater будем получать View и устанавливать в качестве содержимого вкладки.

 

Кодим MainActivity.java:

package ru.startandroid.develop.p0781tabcontentfactory;

import android.app.TabActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.TabHost;
import android.widget.TextView;

public class MainActivity extends TabActivity {
  
  final String TABS_TAG_1 = "Tag 1";
  final String TABS_TAG_2 = "Tag 2";
  
  
    /** Called when the activity is first created. */
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        
        TabHost tabHost = getTabHost();
        
        TabHost.TabSpec tabSpec;
        
        tabSpec = tabHost.newTabSpec(TABS_TAG_1);
        tabSpec.setContent(tabFactory);
        tabSpec.setIndicator("Вкладка 1");
        tabHost.addTab(tabSpec);
        
        tabSpec = tabHost.newTabSpec(TABS_TAG_2);
        tabSpec.setContent(tabFactory);
        tabSpec.setIndicator("Вкладка 2");
        tabHost.addTab(tabSpec);
        
    }
    
    TabHost.TabContentFactory tabFactory = new TabHost.TabContentFactory() {
    
    @Override
    public View createTabContent(String tag) {
      if (tag.equals(TABS_TAG_1)) {
        return getLayoutInflater().inflate(R.layout.tab, null);
      } else if (tag.equals(TABS_TAG_2)) {
        TextView tv = new TextView(MainActivity.this);
        tv.setText("Это создано вручную");
        return tv;
      }
      return null;
    }
  }; 
}

Создание вкладок идет как обычно, только методу setContent на вход передаем объект, реализующий TabHost.TabContentFactory. Когда системе необходимо будет построить содержимое вкладки, она воспользуется этим объектом - вызовет его метод createTabContent. На вход ему пойдет тэг вкладки, на выходе должно получиться View.  И наша задача – реализовать это.

tabFactory – объект, реализующий интерфейс TabHost.TabContentFactory. В его методе createTabContent мы проверяем тэг. Если это тэг первой вкладки, то прогоняем tab.xml через LayoutInflater и возвращаем получившееся View. Если тэг второй вкладки, то вручную создаем TextView и возвращаем его.

 

Все сохраним и запустим приложение. Первая вкладка:

 

Вторая вкладка:

 

В итоге мы создали содержимое первой вкладки из layout-файла, а содержимое второй – сами, через создание объектов.

 

На следующем уроке:

- парсим XML с помощью XmlPullParser


Присоединяйтесь к нам в Telegram:

- в канале StartAndroid публикуются ссылки на новые статьи с сайта startandroid.ru и интересные материалы с хабра, medium.com и т.п.

- в чатах решаем возникающие вопросы и проблемы по различным темам: Android, Compose, Kotlin, RxJava, Dagger, Тестирование, Performance 

- ну и если просто хочется поговорить с коллегами по разработке, то есть чат Флудильня




Language

Автор сайта

Дмитрий Виноградов

Подробнее можно посмотреть или почитать.

Никакие другие люди не имеют к этому сайту никакого отношения и просто занимаются плагиатом.

Социальные сети

 

В канале я публикую ссылки на интересные и полезные статьи по Android

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



Группа ВКонтакте



Поддержка проекта

Яндекс
410011180491924

WebMoney
R248743991365
Z551306702056

Paypal