Вкладки и фрагменты, отдельные задние стеки - PullRequest
2 голосов
/ 15 февраля 2012

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

Во время моего исследования я нашел эту тему: https://stackoverflow.com/a/7480080/792407

Пример, который он приводит, имеет большой смысл, но я не могу отобразить фрагменты. Итак, позвольте мне объяснить, что я делаю, чтобы убедиться, что я правильно понимаю:

У меня есть основная вкладка, которая расширяет FragmentActivity и обрабатывает вкладки. Макет выглядит так:

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

            <FrameLayout
                android:id="@+android:id/realtabcontent"
                android:layout_width="fill_parent"
                android:layout_height="0dp"
                android:layout_weight="1"/>
        </LinearLayout>
    </TabHost>
</LinearLayout>

В рамках этого действия я инициализирую свои вкладки:

mTabHost = getTabHost();        
Resources res = getResources();
Intent intent;        
TabHost.TabSpec spec; 

//search tab
intent = new Intent().setClass(this, searchFragmentStack.class);
spec = mTabHost.newTabSpec("search").setIndicator("Search",res.getDrawable(R.drawable.ic_tab_search)).setContent(intent);        
mTabHost.addTab(spec);

//home tab
intent = new Intent().setClass(this, homeFragmentStack.class);
spec = mTabHost.newTabSpec("home").setIndicator("Home",res.getDrawable(R.drawable.ic_tab_home)).setContent(intent);        
mTabHost.addTab(spec);

Используемые мной классы стека выглядят так:

public class searchFragmentStack extends ActivityInTab {
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            navigateTo(new search());
        }
}

Абстрактный класс ActivityInTab - это тот же код, который он использовал в потоке:

abstract class ActivityInTab extends FragmentActivity { // FragmentActivity is just Activity for the support library.

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.tabs_layout);
    }

    /**
     * Navigates to a new fragment, which is added in the fragment container
     * view.
     * 
     * @param newFragment
     */
    protected void navigateTo(Fragment newFragment) {
        FragmentManager manager = getSupportFragmentManager();
        FragmentTransaction ft = manager.beginTransaction();
        ft.add(R.id.content, newFragment);
        ft.addToBackStack(null);
        ft.commit();
    }

    @Override
    public void onBackPressed() {
        FragmentManager manager = getSupportFragmentManager();
        if (manager.getBackStackEntryCount() > 0) {
            // If there are back-stack entries, leave the FragmentActivity
            // implementation take care of them.
            super.onBackPressed();
        } else {
            // Otherwise, ask user if he wants to leave :)
            //showExitDialog();
        }
    }

}

и макет стека снова основан на его примере:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/content"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:isScrollContainer="true">
</RelativeLayout>

И это во многом. Все, что я получаю, это черные экраны на вкладках, которые заставляют меня думать, что это проблема с макетом или я просто делаю это неправильно Имеет ли это смысл? Есть ли способ лучше? Я что-то пропустил? Любая помощь будет принята с благодарностью.

Ответы [ 2 ]

2 голосов
/ 17 февраля 2012

Я понял это после запуска фиктивного проекта и выполнения всего с нуля:

Деятельность, которую я использовал для обработки вкладок, должна быть TabActivity и подразумеваться, как если бы я создавал обычные вкладки с помощьюДействия, за исключением того, что я буду использовать отдельные «стеки» FragmentActivity для управления содержимым каждой вкладки.Кроме того, макет, который я использовал для действия Tab, был неправильным для того, что я делал, сейчас я использую:

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

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

Отдельные стеки фрагментов во вкладках

РЕДАКТИРОВАТЬ

Забыл упомянуть, что TabActivity устарела, поэтому не стоит полагаться на этот метод для будущих версий Android.Я не понял, как реализовать это с помощью FragmentActivity.Тем не менее, это работает для моих текущих потребностей и дает мне время, чтобы выяснить, как сделать это по-новому.

0 голосов
/ 21 октября 2014

Я экспериментировал с вкладками в активности фрагментов.Так что, может быть, стоит посмотреть

FragmentTabHost с собственным стеком фрагментов для каждой вкладки

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...