chility
chility

Reputation: 744

Application is crashing when changing fragments

I have this in my code:

public static class PlaceholderFragment extends Fragment {

    public PlaceholderFragment() {
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
        View rootView = inflater.inflate(R.layout.fragment_main, container,
                false);
        return rootView;
    }
}
public static class TheMapFrag extends Fragment {
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
        View rootView = inflater.inflate(R.layout.fragment_the_map, container,
                false);
        return rootView;
    }
}

Now these are supposed to show 2 fragments.

and my onCreate having 2 tabs:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    // Set up the action bar.
    final ActionBar actionBar = getActionBar();
    actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);

    ActionBar.Tab testTab = actionBar.newTab().setText("The test");
    ActionBar.Tab chatTab = actionBar.newTab().setText("Chat");

    testTab.setTabListener(this);
    chatTab.setTabListener(this);

    actionBar.addTab(testTab);
    actionBar.addTab(chatTab);

    if (savedInstanceState == null) {
        getSupportFragmentManager().beginTransaction()
                .add(R.id.container, new PlaceholderFragment()).commit();
    }
}

Everything is perfect by now, but when I'm changing tabs by using the below code:

@Override
    public void onTabSelected(Tab tab, FragmentTransaction arg1) {
        int position = tab.getPosition();
        switch(position){
        case 0:
            getSupportFragmentManager().beginTransaction()
            .add(R.id.container, new PlaceholderFragment()).commit();
           break;

        case 1:
                    getSupportFragmentManager().beginTransaction()
                    .add(R.id.container, new TheMapFrag()).commit();
          break;
     }
    }

The first time it works, but when I change to case 1 then to case 0 and then back to case 1 the app is crashing with these errors:

04-21 08:14:34.201: E/AndroidRuntime(2246): FATAL EXCEPTION: main
04-21 08:14:34.201: E/AndroidRuntime(2246): Process: com.gs.map, PID: 2246
04-21 08:14:34.201: E/AndroidRuntime(2246): android.view.InflateException: Binary XML file line #2: Error inflating class fragment
04-21 08:14:34.201: E/AndroidRuntime(2246):     at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:713)
04-21 08:14:34.201: E/AndroidRuntime(2246):     at android.view.LayoutInflater.inflate(LayoutInflater.java:469)
04-21 08:14:34.201: E/AndroidRuntime(2246):     at android.view.LayoutInflater.inflate(LayoutInflater.java:397)
04-21 08:14:34.201: E/AndroidRuntime(2246):     at com.gs.map.MainActivity$TheMapFrag.onCreateView(MainActivity.java:90)
04-21 08:14:34.201: E/AndroidRuntime(2246):     at android.support.v4.app.Fragment.performCreateView(Fragment.java:1500)
04-21 08:14:34.201: E/AndroidRuntime(2246):     at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:938)
04-21 08:14:34.201: E/AndroidRuntime(2246):     at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1115)
04-21 08:14:34.201: E/AndroidRuntime(2246):     at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:682)
04-21 08:14:34.201: E/AndroidRuntime(2246):     at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1478)
04-21 08:14:34.201: E/AndroidRuntime(2246):     at android.support.v4.app.FragmentManagerImpl$1.run(FragmentManager.java:446)
04-21 08:14:34.201: E/AndroidRuntime(2246):     at android.os.Handler.handleCallback(Handler.java:733)
04-21 08:14:34.201: E/AndroidRuntime(2246):     at android.os.Handler.dispatchMessage(Handler.java:95)
04-21 08:14:34.201: E/AndroidRuntime(2246):     at android.os.Looper.loop(Looper.java:136)
04-21 08:14:34.201: E/AndroidRuntime(2246):     at android.app.ActivityThread.main(ActivityThread.java:5017)
04-21 08:14:34.201: E/AndroidRuntime(2246):     at java.lang.reflect.Method.invokeNative(Native Method)
04-21 08:14:34.201: E/AndroidRuntime(2246):     at java.lang.reflect.Method.invoke(Method.java:515)
04-21 08:14:34.201: E/AndroidRuntime(2246):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779)
04-21 08:14:34.201: E/AndroidRuntime(2246):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595)
04-21 08:14:34.201: E/AndroidRuntime(2246):     at dalvik.system.NativeStart.main(Native Method)
04-21 08:14:34.201: E/AndroidRuntime(2246): Caused by: java.lang.IllegalArgumentException: Binary XML file line #2: Duplicate id 0x7f060040, tag null, or parent id 0x7f06003f with another fragment for com.google.android.gms.maps.MapFragment
04-21 08:14:34.201: E/AndroidRuntime(2246):     at android.app.Activity.onCreateView(Activity.java:4791)
04-21 08:14:34.201: E/AndroidRuntime(2246):     at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:689)
04-21 08:14:34.201: E/AndroidRuntime(2246):     ... 18 more

Also when I select case 0 it overlays the fragment shown in case 1

I know that I have to hide or destroy the showed fragment somehow, but as a beginner I can't achieve it. I'm sure that I'm missing something really small.

EDIT fragment_main.xml code:

<RelativeLayout 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:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context="com.gs.map.MainActivity$PlaceholderFragment" >

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/hello_world" />

</RelativeLayout>

Upvotes: 1

Views: 840

Answers (2)

Ritesh Gune
Ritesh Gune

Reputation: 16739

I think you are inflating fragments inside other fragments.

Instead of

getSupportFragmentManager().beginTransaction()
                    .add(R.id.container, new TheMapFrag()).commit();

use

getSupportFragmentManager().beginTransaction()
                    .replace(R.id.container, new TheMapFrag()).commit();

For difference between Add and Replace refer this

Upvotes: 1

Biraj Zalavadia
Biraj Zalavadia

Reputation: 28484

From the error it sounds like you are trying to add fragment inside fragment vi layout file.

But you can not specify fragment inside fragment layout file.

So If you want to add fragment inside fragment you must do at runtime.

How?

1) Remove <fragment> tag from fragment layout file.

2) Put a blank <LinearLyaout> instead <fragment>

3) Add fragment in that linearlayout at runtime.

Upvotes: 1

Related Questions