Viewpageindicator внутри фрагмента

С помощью SherlockActionBar я создал приятный интерфейс. В ландшафтном режиме вы видите как listfragment, так и «detailsfragment».

Теперь я хотел бы добавить индикатор страницы просмотра (https://github.com/JakeWharton/Android-ViewPagerIndicator) внутри фрейма деталей, поэтому я бы выглядел так:

--------------------------|
|_1___|TAB1 | TAB2 | ETC  |
|_2___|-------------------|
|_3___|Example: content   |
|_4___| TAB1 of listitem 1| 
|_5___|___________________|

Я надеюсь, что это ясно. Так что в основном я бы использовал FragmentManager/TabPageIndicator внутри фрагмента.

Я это возможно? не могу понять.. :(

Спасибо!


person user1255553    schedule 14.03.2012    source источник
comment
Итак, у вас есть ListViewFragment слева? Затем каждый элемент ListView будет загружать другой фрагмент RHS, который содержит: TabPageIndicator и ViewPager?   -  person Chris.Jenkins    schedule 14.03.2012


Ответы (2)


Вы не должны помещать Fragment внутри Fragment. Однако вы можете поместить ViewPager внутри фрагмента и получить результат, который вы ищете.

Некоторое время назад я столкнулся с той же проблемой для одного из моих приложений (только я хотел, чтобы ViewPager содержало несколько ListView). Это был конечный результат (см. строки; красный содержит Fragment, синий ViewPagerIndicator, зеленый ViewPager):

Пример ViewPager внутри фрагмента

Я сделал это, выполнив следующие шаги. Во-первых, для фрагмента деталей я создал следующий файл 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">

    <com.viewpagerindicator.TabPageIndicator
        android:id="@+id/viewpagerIndicator"
        android:layout_height="wrap_content"
        android:layout_width="match_parent" />
    <android.support.v4.view.ViewPager
        android:id="@+id/viewpager"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1" />

</LinearLayout>

Затем я настроил собственный PagerAdapter для заполнения ViewPager и TabPageIndicator:

public class MainPagerAdapter extends PagerAdapter implements TitleProvider {

    // constructor
    ...        

    @Override
    public void destroyItem(ViewGroup container, int position, Object object) {
        // remove the object (we don't want to keep it in memory as it will get recreated and cached when needed)

        ViewPager viewPager = (ViewPager) container;
        View view = (View) object;
        viewPager.removeView(view);
    }

    @Override
    public Object instantiateItem(View pager, final int position) {
        // inflate your 'content'-views here (in my case I added a listview here)
        // similar to a listadapter's `getView()`-method

        View wrapper = ... // inflate your layout
        ... // fill your data to the appropriate views

        ((ViewPager) pager).addView(wrapper);
    }

    public String getTitle(int position) {
        ... // return the title of the tab
    }
}

Далее в моем фрагменте я установил следующее:

public class MainFragment extends Fragment {

    private MainPagerAdapter pagerAdapter;
    private TabPageIndicator mIndicator;
    private ViewPager viewPager;

    @Override
    public void onActivityCreated(Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);

        View detailsFrame = context.findViewById(R.id.details_fragment);
        // setup your adapter: pass data, etc.
        this.pagerAdapter = new MainPagerAdapter(...);
        this.viewPager = (ViewPager) context.findViewById(R.id.viewpager);
        viewPager.setAdapter(pagerAdapter);

        this.mIndicator = (TabPageIndicator) context.findViewById(R.id.viewpagerIndicator);
        this.mIndicator.setViewPager(viewPager);
    }
}
person Reinier    schedule 14.03.2012
comment
Здравствуйте, пожалуйста, предоставьте полный код .. я не могу понять в какой-то момент спасибо заранее - person VENKI; 26.08.2014
comment
@Reinier, что это такое View detailsFrame = context.findViewById(R.id.details_fragment); что он представляет? В каком макете это i.d? - person Otieno Rowland; 11.06.2015

Вы не можете вкладывать фрагменты внутрь фрагментов. Он будет отображаться нормально, но произойдет сбой, когда вы захотите заменить некоторые из них с помощью транзакций.

Взгляните на это:

person Benoit Duffez    schedule 14.03.2012