ViewPager внутри фрагмента, который является частью вкладок в FragmentActivity

Я пытаюсь построить что-то, в чем я не уверен, возможно ли это. У меня есть вкладки фрагментов (используя FragmentActivity, TabHost и TabWidget в качестве контейнера вкладок фрагментов), и в каждом из фрагментов я хочу иметь в качестве верхней панели другие фрагменты. Вы можете посмотреть на это как на нижнюю панель, состоящую из типов элементов, и верхнюю панель, которая будет фильтрами. Я хочу переключаться между фильтрами обычным жестом.

Поведение моего приложения следующее: я вижу основное действие, в котором находится первый фрагмент, я вижу верхнюю/нижнюю панель, но я не вижу представление (фрагмент) первой категории верхней панели. Когда я пытаюсь привязаться к другой категории, ничего не происходит.

Это код фрагмента:

Public class Tab1Fragment extends Fragment {

private ViewPager _mViewPager;
private ViewPagerAdapter _adapter;
private View child;

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {
    if (container == null) {
        return null;
    }

    child = inflater.inflate(R.layout.tab_frag1_layout, container);

    _mViewPager = (ViewPager) child.findViewById(R.id.viewPager);
    _adapter = new ViewPagerAdapter(GlobalContext.getAppContext(),getFragmentManager());
    _mViewPager.setCurrentItem(0);

    new setAdapterTask().execute();

    return (LinearLayout) inflater.inflate(R.layout.tab_frag1_layout,
            container, false);
}

private class setAdapterTask extends AsyncTask<Void, Void, Void> {
    protected Void doInBackground(Void... params) {
        return null;
    }

    @Override
    protected void onPostExecute(Void result) {
        _mViewPager.setAdapter(_adapter);
        _mViewPager.setCurrentItem(0);
    }
}

public void onActivityCreated(Bundle bdl) {
    super.onActivityCreated(bdl);

    _mViewPager.setOnPageChangeListener(new OnPageChangeListener() {

        @Override
        public void onPageScrollStateChanged(int position) {
        }

        @Override
        public void onPageScrolled(int arg0, float arg1, int arg2) {
        }

        @Override
        public void onPageSelected(int position) {
            // TODO Auto-generated method stub
            switch (position) {
            case 0:
                child.findViewById(R.id.first_tab).setVisibility(
                        View.VISIBLE);
                child.findViewById(R.id.second_tab)
                        .setVisibility(View.GONE);
                break;

            case 1:
                child.findViewById(R.id.first_tab).setVisibility(View.GONE);
                child.findViewById(R.id.second_tab).setVisibility(
                        View.VISIBLE);
                break;
            }
        }

    });

}

}

Это 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:background="@color/white"
android:orientation="vertical" >  

<TableLayout
    style="@style/layout_f_w"
    android:stretchColumns="*" >
    <TableRow
        android:id="@+id/tableRow1"
        android:background="#dddddd"
        style="@style/layout_wrap">

          <!-- First Tab -->
            <LinearLayout
            style="@style/layout_f_w"
            android:id="@+id/first_text"
            android:orientation="vertical" >

                  <TextView
                    android:id="@+id/textView1"
                    style="@style/text_title"
                    android:text="Tab1" />
           </LinearLayout>

        <!-- Second Tab -->
            <LinearLayout
            style="@style/layout_f_w"
            android:id="@+id/second_text"
            android:orientation="vertical" >

                <TextView
                    android:id="@+id/textView1"
                    style="@style/text_title"
                    android:text="Tab2" />

           </LinearLayout>

    </TableRow>
 </TableLayout>
 <!-- Include Tab Indicator  -->
 <include layout="@layout/indicator" android:layout_width="fill_parent"
  android:layout_height="wrap_content"  />

<android.support.v4.view.ViewPager
    android:layout_width="fill_parent" android:layout_height="fill_parent"
    android:id="@+id/viewPager" />
</LinearLayout>

Это пример для моего фрагмента первой категории (категория фрагмента внутри первого фрагмента):

public class LayoutOne extends Fragment {


public static Fragment newInstance(Context context) {
    LayoutOne f = new LayoutOne();  

    return f;
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) {
    ViewGroup root = (ViewGroup) inflater.inflate(R.layout.layout_one, null);       
    return root;
}

}

Пожалуйста помогите :(

Это мой адаптер фрагмента:

public class ViewPagerAdapter extends FragmentStatePagerAdapter {
private Context _context;

public ViewPagerAdapter(Context context, FragmentManager fm) {
    super(fm);  
    _context=context;

    }
@Override
public Fragment getItem(int position) {
    Fragment f = new Fragment();
    switch(position){
    case 0:
        f=LayoutOne.newInstance(_context);  
        break;
    case 1:
        f=LayoutTwo.newInstance(_context);  
        break;
    }
    return f;
}
@Override
public int getCount() {
    return 2;
}
@Override
public boolean isViewFromObject(View arg0, Object arg1) {
    // TODO Auto-generated method stub
    return false;
}

}

person Nativ    schedule 17.10.2012    source источник


Ответы (2)


Наконец, у нас есть вложенные фрагменты в 4.2 и совместимость http://developer.android.com/about/versions/jelly-bean.html

person logcat    schedule 17.10.2012
comment
Вы действительно можете использовать вложенные фрагменты, если вручную управляете транзакцией фрагмента. Вложенные фрагменты не поддерживаются, но это просто означает, что API не может сделать это за вас. Никто никогда не говорил, что вы не можете делать вложенные фрагменты самостоятельно. У меня есть система меню, основанная на вложенных фрагментах, чтобы упростить настройку макетов между планшетом и телефоном без дублирования XML-кода макета. Работает нормально и развернут в маркете с 1,5 миллионами загрузок. Хитрость заключается в том, чтобы зафиксировать транзакцию родителя до начала транзакции в дочернем элементе. - person OldSchool4664; 22.10.2012
comment
Имейте то же самое, но лучше вместо того, чтобы указывать на ответ /questions/6847460/fragments-within-fragments/ Я бы предпочел указать на stackoverflow.com/a/7905095/289686 . - person logcat; 22.10.2012

и в каждом из фрагментов я хочу иметь в качестве верхней панели еще один фрагмент

Наличие фрагментов внутри фрагментов не поддерживается, извините.

Обновление. Вложенные фрагменты поддерживаются начиная с Android 4.2 (и библиотеки поддержки Android версии 11): http://developer.android.com/about/versions/android-4.2.html.#NestedFragments

person CommonsWare    schedule 17.10.2012
comment
Разве я не могу сделать это с помощью ViewPager? по этой ссылке вы можете найти решение для этого - stackoverflow.com/questions/9736053/. Знаете ли вы другие альтернативы для моего сценария? - person Nativ; 18.10.2012
comment
@powerX: я не могу сделать это с помощью ViewPager? -- Я понятия не имею, что это такое. - person CommonsWare; 18.10.2012
comment
Это то, чего я хочу добиться, поместив вкладки фрагментов внутри фрагмента. Все это написано в вопросе. - person Nativ; 18.10.2012
comment
@powerX: Как говорится в моем ответе здесь, и в моем ответе на вопрос, на который вы ссылались в комментарии, и в ответе Дайанны Хакборн, который я цитирую в обоих случаях, фрагменты, вложенные во фрагменты, не поддерживаются. Удалите один уровень фрагментов, используя вместо этого обычные представления. - person CommonsWare; 18.10.2012