Search code examples
androidandroid-fragmentsandroid-tabhostandroid-viewpager

Android ViewPager and fragments design


I have a ViewPager with 3 fragments into it. Everything works fine with two of them. The problem is with the third pager This one is a TabHost, in which there is one fragment in each tab. But I've read that it's is not possible to put a Tabhost inside a Fragment. Nested fragments are forbidden.

Anyone has any idea of what can I do for resolving my problem? Any alternatives?


Solution

  • This is what i've done for resolving my problem.

    I've done one "custom" Tabhost". I say "custom" because it is not a Tabhost, it seems to only. In one of my fragements inside the ViewPager, i've 4 images on top of the fragment. And the rest of the fragment is one FrameLayout. Each time i touch on the images, i replace the fragment which is in the frame for the respective fragemnt.

    I add some code:

    <LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <LinearLayout 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content"
    android:orientation="horizontal">
    <TableLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <TableRow >
    <LinearLayout android:id="@+id/button1"
    android:orientation="vertical"
    android:layout_width="0dip"
    android:layout_height="wrap_content"
    android:layout_weight="1"
    android:onClick="button1Click"
    >
    <ImageView android:id="@+id/iv1"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:src="@drawable/ic1"/>
    <TextView android:id="@+id/tv1"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:gravity="center"
    android:text="@string/text1"/>
    </LinearLayout>
    <LinearLayout android:id="@+id/button2"
    android:orientation="vertical"
    android:layout_width="0dip"
    android:layout_height="wrap_content"
    android:layout_weight="1"
    android:onClick="button2Click"
    >
    <ImageView android:id="@+id/iv2"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:src="@drawable/ic2"/>
    <TextView android:id="@+id/tv2"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:gravity="center"
    android:text="@string/text2"/>
    </LinearLayout>
    <LinearLayout android:id="@+id/button3"
    android:orientation="vertical"
    android:layout_width="0dip"
    android:layout_height="wrap_content"
    android:layout_weight="1"
    android:onClick="button3Click"
    >
    <ImageView android:id="@+id/iv3"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:src="@drawable/ic3"/>
    <TextView android:id="@+id/tv3"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:gravity="center"
    android:text="@string/text3"/>
    </LinearLayout>
    <LinearLayout android:id="@+id/button4"
    android:orientation="vertical"
    android:layout_width="0dip"
    android:layout_height="wrap_content"
    android:layout_weight="1"
    android:onClick="button4Click"
    >
    <ImageView android:id="@+id/iv4"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:src="@drawable/ic4"/>
    <TextView android:id="@+id/tv4"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:gravity="center"
    android:text="@string/text4"/>
    </LinearLayout>
    
    </TableRow>
    </TableLayout>
    </LinearLayout>
    
    
    <FrameLayout android:id="@+id/layout_actual"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    
    </FrameLayout>
    
    </LinearLayout>
    

    In the FragmentActivity:

    public void boton1Click(View v){
        mFragmentInViewPager.changeFragment(BUTTON1);
    }
    
    public void boton2Click(View v){
        mFragmentInViewPager.changeFragment(BUTTON2);
    }
    
    public void boton3Click(View v){
        mFragmentInViewPager.changeFragment(BUTTON3);
    }
    public void boton4Click(View v){
        mFragmentInViewPager.changeFragment(BUTTON4);
    }
    

    And finally in the FragmentInViewPager (the one which contains the other 4 fragments)

    public void changeFragment(int fragmentId)
    {
    if(mCurrentFragmentId != fragmentId) {
    
    switch(fragmentId) {
    case BUTTON1:
    
        mFTransaction = mFManager.beginTransaction();
        mFTransaction.replace(R.id.layout_actual, mFragment1);
        mFTransaction.commit();
        mIv1.setImageResource(R.drawable.ic1_sel);
        mIv2.setImageResource(R.drawable.ic2);
        mIv3.setImageResource(R.drawable.ic3);
        mIv4.setImageResource(R.drawable.ic4);
        break;
    
    case BUTTON2:
        mFTransaction = mFManager.beginTransaction();
        mFTransaction.replace(R.id.layout_actual, mFragment2);
        mFTransaction.commit();
        mIv1.setImageResource(R.drawable.ic1);
        mIv2.setImageResource(R.drawable.ic2_sel);
        mIv3.setImageResource(R.drawable.ic3);
        mIv4.setImageResource(R.drawable.ic4);
        break;
    
    case BUTTON3:
        mFTransaction = mFManager.beginTransaction();
        mFTransaction.replace(R.id.layout_actual, mFragment3);
        mFTransaction.commit();
        mIv1.setImageResource(R.drawable.ic1);
        mIv2.setImageResource(R.drawable.ic2);
        mIv3.setImageResource(R.drawable.ic3_sel);
        mIv4.setImageResource(R.drawable.ic4);
        break;
    
    case BUTTON4:
        mFTransaction = mFManager.beginTransaction();
        mFTransaction.replace(R.id.layout_actual, mFragment4);
        mFTransaction.commit();
        mIv1.setImageResource(R.drawable.ic1);
        mIv2.setImageResource(R.drawable.ic2);
        mIv3.setImageResource(R.drawable.ic3);
        mIv4.setImageResource(R.drawable.ic4_sel);
        break;
    
    }
    
    mCurrentFragmentId = fragmentId;
    }
    
    }
    

    I hope of have explained myself well. If anyone needs more info, just tell me.