0

I'm trying to build something that I'm not sure if it's possible. I have Fragment tabs (using FragmentActivity, TabHost and TabWidget as my fragment tabs container) and in each of the fragments I want to have, as top bar, another fragments. You can look at this as - bottom bar constructed of types of items, and top bar that would be filters. I want to snap between the filters in regular gesture.

The behavior of my app is the following: I can see the main activity in which the first fragment sits, i can see the top/bottom bar, but i can't see the view(fragment) of the first top bar category. When I'm trying to snap to the other category nothing happens.

This is the code for the fragment:

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;
            }
        }

    });

}

}

This is the xml for the outer Fragment:

<?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>

This is an example for my first category fragment(the fragment category that inside the first fragment):

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;
}

}

Please help me :(

This is my Fragment Adapter:

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;
}

}
Nativ
  • 3,092
  • 6
  • 38
  • 69

2 Answers2

3

Finally we have nested fragments in 4.2 and compatibility http://developer.android.com/about/versions/jelly-bean.html

logcat
  • 3,435
  • 1
  • 29
  • 44
  • You can indeed use nested fragments if you manually manage your fragment transaction. Nested fragments are "not supported", but that just means the API can't do it for you. Nobody ever said you can't do nested fragments yourself. I have a menu system that relies on nested fragments in order to make it easier for me to customize the layouts between the tablet and phone, without duplicating any layout XML code. Works fine and is deployed in the market with 1.5 million downloads. The trick is to commit the parent's transaction before beginning a transaction on the child. – OldSchool4664 Oct 22 '12 at 18:04
  • Have the same too, but better instead of pointing to answer http://stackoverflow.com/questions/6847460/fragments-within-fragments/6847770#6847770 I'd rather pointed to http://stackoverflow.com/a/7905095/289686 . – logcat Oct 22 '12 at 18:17
0

and in each of the fragments I want to have, as top bar, another fragments

Having fragments inside of fragments is not supported, sorry.

Update: Nested fragments are supported as of Android 4.2 (and Android Support Library rev 11) : http://developer.android.com/about/versions/android-4.2.html#NestedFragments

Community
  • 1
  • 1
CommonsWare
  • 986,068
  • 189
  • 2,389
  • 2,491
  • Can't I do it using ViewPager? on this link you can find a solution for this - http://stackoverflow.com/questions/9736053/is-there-any-alternative-to-nested-fragments. Do you know if the other alternatives for my scenario? – Nativ Oct 17 '12 at 20:30
  • @powerX: "Can't I do it using ViewPager?" -- I have no idea what "it" is. – CommonsWare Oct 17 '12 at 20:31
  • 1
    "It" is what I want to achieve by putting fragment tabs inside fragment..It's all written in the question – Nativ Oct 17 '12 at 20:34
  • @powerX: As my answer here states, and my answer in the question you linked to in the comment states, and in Dianne Hackborn's answer that I cite in both cases, fragments nested in fragments is not supported. Eliminate one level of fragments, using ordinary views instead. – CommonsWare Oct 17 '12 at 20:47