Добавьте вкладки в приложение Android, используя файл layout/main.xml

Я начинаю с Android и хочу добавить вкладки в существующее приложение.

Прямо сейчас у меня есть только одно действие с макетом, определенным в файле XML. Теперь я хотел бы добавить другие вкладки.

Я просмотрел его и нашел http://developer.android.com/resources/tutorials/views/hello-tabwidget.html на сайте разработчиков Android; однако он не использует XML для определения макета вкладок.

Итак, как я могу легко добавить вкладки, используя файл XML только для макета?

Заранее спасибо.


person houbysoft    schedule 06.03.2011    source источник
comment
Вы пытаетесь указать отдельные вкладки в макете XML и не использовать tabHost.addTab(...);? Если это так, я не думаю, что это можно сделать с помощью существующего виджета вкладок.   -  person Farray    schedule 06.03.2011
comment
Да, в значительной степени. Моей главной задачей является повторное использование XML, который у меня уже есть для одной из вкладок, поскольку из учебника похоже, что мне придется создавать макет каждой из вкладок в коде (т.е. они объявляют TextView в коде, а не в XML).   -  person houbysoft    schedule 06.03.2011
comment
Подумал, что так оно и есть — я прошел через это в одном из своих приложений и обнаружил, что ненавижу встроенную реализацию TabHost/TabWidget. Я оставил ответ ниже с подробным описанием основ реализации собственных вкладок. Вы можете остаться СУХИМ с 1 макетом XML и 1 классом Java. Если вы собираетесь повторно использовать их во многих действиях, вы можете создать свой собственный TabActivity, который расширяет Activity и автоматически инициализирует ваш собственный макет вкладок.   -  person Farray    schedule 06.03.2011
comment
это руководство может помочь вам learnncode.wordpress. ком/2013/12/18/   -  person Prachi    schedule 23.12.2013


Ответы (3)


Я просмотрел его и нашел http://developer.android.com/resources/tutorials/views/hello-tabwidget.html на сайте разработчиков Android; однако он не использует XML для определения макета вкладок.

Да. См. шаг № 4.


ОБНОВЛЕНИЕ

Google реорганизовал свою документацию и избавился от этого руководства. Вы можете увидеть использование XML для определения вкладок в TabWidget в этом примере проекта. .

person CommonsWare    schedule 06.03.2011
comment
Да, но это только для интерфейса вкладок, а не для содержимого самих вкладок. TextViews создаются в коде Java, например: TextView textview = new TextView(this);.. - person houbysoft; 06.03.2011
comment
@houbysoft: В учебнике, на который вы ссылаетесь, нет new TextView. Если вы имеете в виду вызовы setIndicator(), вы не можете определить те в файле XML, которые имеют TabHost. - person CommonsWare; 06.03.2011
comment
@CommonsWare: спасибо, скоро попробую, похоже, это то, что я хочу. - person houbysoft; 06.03.2011
comment
@CommonsWare: отлично, это очень хорошо работает с моим существующим XML-макетом, еще раз спасибо. - person houbysoft; 06.03.2011
comment
URL-адрес перенаправляет меня на Common Layouts. Что случилось? developer.android.com/guide/topics/ui/ - person princepiero; 14.08.2013
comment
@princepiero: этому ответу около 2,5 лет, и Google тем временем избавился от этого руководства. Я обновил ответ, чтобы указать на мой текущий образец. - person CommonsWare; 14.08.2013
comment
Спасибо! Да, я заметил, что это было давно, поэтому я задал вопрос, потому что сегодня он все еще актуален. - person princepiero; 15.08.2013
comment
@CommonsWare Я хотел создать приложение на основе вкладок, в котором есть 12 действий с общим логотипом и текстовым представлением с автоматическим предложением, а внизу есть узел вкладок с 4 виджетами вкладок. как я могу это сделать, пожалуйста, руководство .. так как я не хочу делать один и тот же код на каждой странице для поиска и событий кликов табвиджетов - person Maveňツ; 07.03.2014

Я столкнулся с ситуацией, когда макет TabWidget не делал того, что мне нужно, поэтому я подделал его с помощью ViewFlipper и RadioGroup. Таким образом, я мог бы определить содержимое вкладок (каждое представление в ViewFlipper), используя включения (как в ответе Фаррея).

Сами вкладки были RadioButtons в RadioGroup - вы просто имеете OnCheckedChangeListener в своем коде и соответственно устанавливаете отображаемый дочерний элемент ViewFlipper. Вы можете определить макет RadioButton в XML (с текстом, изображениями или чем-то еще).

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

<LinearLayout>
    <ViewFlipper android:id="@+id/viewFlipper">
        <include android:id="@+id/tab1Content" layout="@layout/tab1Layout" />
        <include android:id="@+id/tab2Content" layout="@layout/tab2Layout" />
        <include android:id="@+id/tab3Content" layout="@layout/tab3Layout" />
    </ViewFlipper>
    <LinearLayout>
        <RadioGroup android:id="@+id/radgroup1" android:orientation="horizontal">
          <RadioButton android:id="@+id/rad1" android:button="@drawable/tab1" />
          <RadioButton android:id="@+id/rad2" android:button="@drawable/tab2" />
          <RadioButton android:id="@+id/rad3" android:button="@drawable/tab3" />
        </RadioGroup>
    </LinearLayout>
</LinearLayout>

А вот слушатель:

    private OnCheckedChangeListener onRadioButtonCheckedChanged = new OnCheckedChangeListener(){
    public void onCheckedChanged(RadioGroup group, int checkedId)
    {
        switch(checkedId)
        {
            case(R.id.rad2):
                viewFlipper.setDisplayedChild(1);
            break;
            case(R.id.rad3):
                viewFlipper.setDisplayedChild(2);
            break;
            default:
                viewFlipper.setDisplayedChild(0);
            break;
        }
    }
};
person E.Z. Hart    schedule 06.03.2011

Реализация TabWidget довольно жесткая — у вас нет большого контроля над компоновкой.

Если вы хотите создать свои собственные настраиваемые вкладки, лучше всего создать собственный макет и вызвать его из действий, для которых вы хотите иметь эти «вкладки». Вы можете вызвать повторно используемые макеты в XML с помощью <include layout="@layout/my_tab_layout" />, а затем написать свой собственный код инициализации в повторно используемом классе.

person Farray    schedule 06.03.2011