I'm trying to make an app that contains an ActionBar with 3 tabs: "Map", "Destinatiosn" and "About Us". Basically i'm using ViewPager as main layout and for individual pager views i use Fragments.

  • activity_main.xml

    <android.support.v4.view.ViewPager xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/pager"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    </android.support.v4.view.ViewPager>
    
  • MainActivity.java

    public class MainActivity extends FragmentActivity implements ActionBar.TabListener {   
    private ViewPager viewPager;
    private TabsPagerAdapter mAdapter;
    private ActionBar actionBar;
    // Tab titles
    private String[] tabs = { "Maps", "Destinations", "About us" };
    
    /***************************************************************************************
     * 
     */
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    
        // Initialization
        //tabs = getResources().getStringArray(R.array.tabs_titles);
        viewPager = (ViewPager) findViewById(R.id.pager);
        actionBar = getActionBar();
        mAdapter = new TabsPagerAdapter(getSupportFragmentManager());
    
        viewPager.setAdapter(mAdapter);
        //actionBar.setHomeButtonEnabled(false);
        actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);        
    
        // Adding Tabs
        for (String tab_name : tabs) {
            actionBar.addTab(actionBar.newTab().setText(tab_name).setTabListener(this));
        }
    
        /**
         * on swiping the viewpager make respective tab selected
         * */
        viewPager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() {
    
            @Override
            public void onPageSelected(int position) {
                // on changing the page
                // make respected tab selected
                actionBar.setSelectedNavigationItem(position);
            }
    
            @Override
            public void onPageScrolled(int arg0, float arg1, int arg2) {
            }
    
            @Override
            public void onPageScrollStateChanged(int arg0) {
            }
        });
    }
    
    /***************************************************************************************
     * 
     */
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }
    
    /***************************************************************************************
     * 
     */
    @Override
    public void onTabReselected(Tab tab, android.app.FragmentTransaction arg1) {
    
    
    }
    
    /***************************************************************************************
     * 
     */
    @Override
    public void onTabSelected(Tab tab, android.app.FragmentTransaction arg1) {
        // on tab selected
        // show respected fragment view
        viewPager.setCurrentItem(tab.getPosition());
    
    }
    
    /***************************************************************************************
     * 
     */
    @Override
    public void onTabUnselected(Tab tab, android.app.FragmentTransaction arg1) {
        // TODO Auto-generated method stub
    
    }
    

    }

I am creating a FragmentPagerAdapter class to provide views to tab fragments.

public class TabsPagerAdapter extends FragmentPagerAdapter {

public TabsPagerAdapter(FragmentManager fm) {
    super(fm);
}

@Override
public Fragment getItem(int index) {
    switch (index) {
    case 0:
        // Map fragment activity
        return new MapFragment();
    case 1:
        // Destinations fragment activity
        return new DestinationsFragment();
    case 2:
        // About Us fragment activity
        return new AboutUsFragment();
    }

    return null;
}

@Override
public int getCount() {
    // get item count - equal to number of tabs
    return 3;
}

}

Every one of the items have a layout file with his activity class.

  1. Map

    • fragment_map Layout

      <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
      xmlns:tools="http://schemas.android.com/tools"
      android:layout_width="match_parent"
      android:layout_height="match_parent"
      android:orientation="vertical" >
      
      <fragment
          android:id="@+id/map"
          android:name="com.google.android.gms.maps.SupportMapFragment"
          android:layout_width="match_parent"
          android:layout_height="match_parent"/>
      
      </LinearLayout>
      
    • MapFragment class

      public class MapFragment extends Fragment {
      GoogleMap mapa;
      @Override
      public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {    
      
      try{
          if(mapa == null){
              mapa = ((SupportMapFragment) getChildFragmentManager().findFragmentById(R.id.map)).getMap(); 
          }             
          View rootView = inflater.inflate(R.layout.fragment_map, container, false);          
          return rootView;
      }catch(Exception e){
          View rootView = inflater.inflate(R.layout.fragment_map, container, false);
      
          e.printStackTrace();
          return rootView;
      }
      

      } }

    • Destinations (just a Relative Layout with a Text view for now)

Layout

        <?xml version="1.0" encoding="utf-8"?>
        <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical"
        android:background="#ff8400" >

            <TextView 
                android:layout_width="fill_parent"
                android:layout_height="wrap_content"
                android:gravity="center"
                android:text="Destinations Screen"
                android:textSize="20sp"
                android:layout_centerInParent="true"/>
        </RelativeLayout>

class

public class DestinationsFragment extends Fragment {

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {


        Log.d("", "CESAR");
        View rootView = inflater.inflate(R.layout.fragment_destinations, container, false);

        return rootView;
    }
}
  • About Us (just a Relative Layout with a Text view for now)

layout

        <?xml version="1.0" encoding="utf-8"?>
        <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:orientation="vertical"
            android:background="#17df0d">

        <TextView android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:gravity="center"
            android:text="Diseñar la pantalla de About Us"
            android:textSize="20sp"
            android:layout_centerInParent="true"/>

        </RelativeLayout>

class

        public class AboutUsFragment extends Fragment {

        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {

        View rootView = inflater.inflate(R.layout.fragment_about_us, container, false);

        return rootView;
     }
     }

The problem is that when I change from tab "About Us" to any other tab, the app stops working and crashes. But this doesn't happen when i change from tab "Destinations" to the tab of "Map" and backwards. This error came when I added the MapFragment, before that, the map layout was just a RelativeLayout with a text view and worked well. The Map works.

  • Excption stacktrace

    04-10 00:35:23.070: W/System.err(16428): android.view.InflateException: Binary XML file line #7: Error inflating class fragment
    04-10 00:35:23.070: W/System.err(16428):    at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java)
    04-10 00:35:23.070: W/System.err(16428):    at android.view.LayoutInflater.rInflate(LayoutInflater.java)
    04-10 00:35:23.070: W/System.err(16428):    at android.view.LayoutInflater.inflate(LayoutInflater.java)
    04-10 00:35:23.075: W/System.err(16428):    at android.view.LayoutInflater.inflate(LayoutInflater.java)
    04-10 00:35:23.075: W/System.err(16428):    at com.bikes.touristtest.MapaFragment.onCreateView(MapaFragment.java:22)
    04-10 00:35:23.075: W/System.err(16428):    at android.support.v4.app.Fragment.performCreateView(Fragment.java:1500)
    04-10 00:35:23.075: W/System.err(16428):    at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:938)
    04-10 00:35:23.075: W/System.err(16428):    at android.support.v4.app.FragmentManagerImpl.attachFragment(FragmentManager.java:1291)
    04-10 00:35:23.080: W/System.err(16428):    at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:672)
    04-10 00:35:23.080: W/System.err(16428):    at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1478)
    04-10 00:35:23.080: W/System.err(16428):    at android.support.v4.app.FragmentManagerImpl.executePendingTransactions(FragmentManager.java:478)
    04-10 00:35:23.080: W/System.err(16428):    at android.support.v4.app.FragmentPagerAdapter.finishUpdate(FragmentPagerAdapter.java:141)
    04-10 00:35:23.080: W/System.err(16428):    at android.support.v4.view.ViewPager.populate(ViewPager.java:1068)
    04-10 00:35:23.085: W/System.err(16428):    at android.support.v4.view.ViewPager.setCurrentItemInternal(ViewPager.java:550)
    04-10 00:35:23.085: W/System.err(16428):    at android.support.v4.view.ViewPager.setCurrentItemInternal(ViewPager.java:509)
    04-10 00:35:23.085: W/System.err(16428):    at android.support.v4.view.ViewPager.setCurrentItem(ViewPager.java:490)
    04-10 00:35:23.085: W/System.err(16428):    at com.bikes.touristtest.MainActivity.onTabSelected(MainActivity.java:92)
    04-10 00:35:23.090: W/System.err(16428):    at com.android.internal.app.ActionBarImpl.selectTab(ActionBarImpl.java)
    04-10 00:35:23.090: W/System.err(16428):    at com.android.internal.app.ActionBarImpl$TabImpl.select(ActionBarImpl.java)
    04-10 00:35:23.090: W/System.err(16428):    at com.android.internal.widget.ScrollingTabContainerView$TabClickListener.onClick(ScrollingTabContainerView.java)
    04-10 00:35:23.090: W/System.err(16428):    at android.view.View.performClick(View.java)
    04-10 00:35:23.090: W/System.err(16428):    at android.view.View$PerformClick.run(View.java)
    04-10 00:35:23.090: W/System.err(16428):    at android.os.Handler.handleCallback(Handler.java)
    04-10 00:35:23.095: W/System.err(16428):    at android.os.Handler.dispatchMessage(Handler.java)
    04-10 00:35:23.095: W/System.err(16428):    at android.os.Looper.loop(Looper.java)
    04-10 00:35:23.095: W/System.err(16428):    at android.app.ActivityThread.main(ActivityThread.java)
    04-10 00:35:23.095: W/System.err(16428):    at java.lang.reflect.Method.invokeNative(Native Method)
    04-10 00:35:23.095: W/System.err(16428):    at java.lang.reflect.Method.invoke(Method.java:511)
    04-10 00:35:23.095: W/System.err(16428):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java)
    04-10 00:35:23.100: W/System.err(16428):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java)
    04-10 00:35:23.100: W/System.err(16428):    at dalvik.system.NativeStart.main(Native Method)
    04-10 00:35:23.100: W/System.err(16428): Caused by: java.lang.IllegalArgumentException: Binary XML file line #7: Duplicate id 0x7f050040, tag null, or parent id 0x0 with another fragment for com.google.android.gms.maps.SupportMapFragment
    04-10 00:35:23.105: W/System.err(16428):    at android.support.v4.app.FragmentActivity.onCreateView(FragmentActivity.java:296)
    04-10 00:35:23.105: W/System.err(16428):    ... 31 more
    
share|improve this question
    
Post the entire exception stacktrace. – Luksprog Apr 10 '14 at 3:30
    
added, hope this helps!! thanks for replying. – flagg327 Apr 10 '14 at 3:43
    
You can't use that fragment tag in the xml layout(fragment_map Layout) if it's going to be the layout of another fragment. Instead use the MapView class. – Luksprog Apr 10 '14 at 4:50
    
why you are using viewPager ? – Ando Masahashi Apr 10 '14 at 5:48
    
Go to project property> java build path> Order and Export> set your android-suppport-v4.jar in top by Up button. – Sanjay Bhimani Nov 13 '14 at 9:28

Check out Android, google maps fragment and viewpager - Error inflating class fragment

I am still working on implementing that solution, but it seems viable.

share|improve this answer

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.