javaandroidandroid-fragmentsfragmentandroid-inflate

Android overlapping background fragment and inflate exception


I want to create an activity that can switch between two fragments with different background. I can switch between both fragment with two buttons.

I have my Activity setup like this when I start my activity : cardEditor

My fragment is in green, the four button are not in the fragment. By default, my fragment set is addCardEditor. When I click the button "ajouter", the app is supposed to put the addCardEditor fragment. And when I click the button "Voir", I am supposed to see my second fragment which is called viewCardEditor.

BUT when I start my activity, then when I push the "Voir" button, I have this

The background is still green without any button, but I have set the background to gray for my viewCardEditor fragment!

And when I push the "ajouter" button to have my addCardEditor displayed, it doesn't change anything! I still have the exact same thing. If I push any button, it always stay in this state! Both of my fragment are overlap by this green background.

Then when I try to rotate the smartphone, I have an error:

java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.jean.cartememoire/com.example.jean.cartememoire.CardEditor}: android.view.InflateException: Binary XML file line #65: Binary XML file line #65: Error inflating class fragment

I made research on stackoverflow and other website but I didn't found any solution to my problem. Thank you for helping me

My cardEditor activity and his xml:

package com.example.jean.cartememoire;

import android.support.v4.app.FragmentActivity;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentTransaction;
import android.view.View;

import layout.AddCardEditor;
import layout.ViewCardEditor;


public class CardEditor extends FragmentActivity {

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

public void switchFragment(View v)
{
    Fragment fg;
    FragmentManager fm;
    FragmentTransaction ft;
    if(v == findViewById(R.id.buttonAddCard))
    {
        fg = new AddCardEditor();
        fm = getSupportFragmentManager();

        ft = fm.beginTransaction();

        ft.replace(R.id.fragment_card_editor, fg);
        ft.commit();
    }
    if(v == findViewById(R.id.buttonViewCard))
    {
        fg = new ViewCardEditor();
        fm = getSupportFragmentManager();
        ft = fm.beginTransaction();
        ft.replace(R.id.fragment_card_editor, fg);
        ft.commit();
    }

}
}

Xml for cardEditor:

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:id="@+id/activity_card_editor"
        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.example.jean.cartememoire.CardEditor"
        android:orientation="vertical"
        android:weightSum="1"
        android:background="@android:color/black">

        <LinearLayout
            android:orientation="horizontal"
            android:layout_width="match_parent"
            android:layout_height="wrap_content">

            <Button
                android:text="@string/modifier"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:id="@+id/buttonModCard"
                android:padding="0dp"
                android:paddingBottom="0dp"
                android:layout_weight="1"
                android:onClick="switchFragment"
                tools:ignore="ButtonStyle,RtlSymmetry" />

            <Button
                android:text="@string/supprimer"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:id="@+id/buttonDeleteCard"
                android:padding="0dp"
                android:paddingBottom="0dp"
                android:layout_weight="1"
                android:onClick="switchFragment"
                tools:ignore="ButtonStyle,RtlSymmetry" />

            <Button
                android:text="@string/voir"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:id="@+id/buttonViewCard"
                android:onClick="switchFragment"
                tools:ignore="ButtonStyle" />

            <Button
                android:text="@string/ajouter"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:id="@+id/buttonAddCard"
                android:padding="0dp"
                android:paddingBottom="0dp"
                android:layout_marginLeft="12dp"
                android:layout_marginStart="12dp"
                android:layout_weight="1"
                android:onClick="switchFragment"
                tools:ignore="ButtonStyle,RtlSymmetry" />
        </LinearLayout>

        <fragment
            android:id="@+id/fragment_card_editor"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_marginTop="0dp"
            android:layout_marginBottom="0dp"
            android:name="layout.AddCardEditor"
            tools:layout="@layout/fragment_view_card_editor" />

    </LinearLayout>

Then there is my first Fragment:

package layout;



public class AddCardEditor extends Fragment {

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    // Inflate the layout for this fragment
    if (container != null) {
        container.removeAllViews();
    }
    return inflater.inflate(R.layout.fragment_add_card_editor, container, false);
}

}

with his xml:

    <android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:context="layout.AddCardEditor"
        android:background="@android:color/holo_green_light">

        <TextView
            android:text="@string/ajouter_une_carte"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:id="@+id/textView5"
            android:textAppearance="@style/TextAppearance.AppCompat.Body1"
            android:elevation="0dp"
            tools:ignore="UnusedAttribute"
            tools:layout_constraintTop_creator="1"
            android:layout_marginStart="129dp"
            android:layout_marginTop="16dp"
            tools:layout_constraintLeft_creator="1"
            app:layout_constraintLeft_toLeftOf="parent"
            app:layout_constraintTop_toTopOf="parent"
            android:layout_marginLeft="129dp" />

        <TextView
            android:text="@string/difficult"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:id="@+id/textView11"
            tools:layout_constraintBottom_creator="1"
            app:layout_constraintBottom_toBottomOf="parent"
            tools:layout_constraintLeft_creator="1"
            android:layout_marginBottom="80dp"
            app:layout_constraintLeft_toLeftOf="parent" />

        <TextView
            android:text="@string/th_me"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:id="@+id/textView8"
            tools:ignore="UnknownId"
            tools:layout_constraintBottom_creator="1"
            app:layout_constraintBottom_toTopOf="@+id/textView9"
            tools:layout_constraintLeft_creator="1"
            android:layout_marginBottom="32dp"
            app:layout_constraintLeft_toLeftOf="parent"
            app:layout_constraintHorizontal_bias="1.0"
            app:layout_constraintRight_toRightOf="@+id/textView9" />

        <TextView
            android:text="@string/question"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:id="@+id/textView9"
            tools:ignore="MissingConstraints"
            tools:layout_constraintTop_creator="1"
            android:layout_marginTop="104dp"
            tools:layout_constraintLeft_creator="1"
            app:layout_constraintLeft_toLeftOf="parent"
            app:layout_constraintTop_toTopOf="parent" />

        <TextView
            android:text="@string/r_ponse"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:id="@+id/textView10"
            tools:layout_constraintLeft_creator="1"
            app:layout_constraintLeft_toLeftOf="parent"
            tools:layout_constraintTop_creator="1"
            tools:layout_constraintBottom_creator="1"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintTop_toTopOf="parent" />

        <EditText
            android:layout_width="279dp"
            android:inputType="textPersonName"
            android:ems="10"
            android:id="@+id/editTheme"
            tools:ignore="MissingConstraints"
            android:layout_height="wrap_content"
            android:layout_marginTop="8dp"
            app:layout_constraintTop_toBottomOf="@+id/textView5"
            android:layout_marginStart="8dp"
            tools:layout_constraintLeft_creator="1"
            app:layout_constraintLeft_toRightOf="@+id/textView9"
            android:layout_marginLeft="8dp" />

        <EditText
            android:layout_width="281dp"
            android:layout_height="126dp"
            android:inputType="textMultiLine"
            android:ems="10"
            android:id="@+id/editQuestion"
            android:layout_marginStart="8dp"
            app:layout_constraintTop_toTopOf="@+id/textView9"
            app:layout_constraintLeft_toRightOf="@+id/textView8"
            android:layout_marginLeft="8dp" />

        <EditText
            android:layout_width="281dp"
            android:layout_height="136dp"
            android:inputType="textMultiLine"
            android:ems="10"
            android:id="@+id/editReponse"
            android:layout_marginTop="24dp"
            app:layout_constraintTop_toBottomOf="@+id/editQuestion"
            app:layout_constraintLeft_toLeftOf="@+id/editQuestion" />

        <RatingBar
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:id="@+id/ratingBar"
            android:layout_marginTop="8dp"
            app:layout_constraintTop_toBottomOf="@+id/editReponse"
            app:layout_constraintLeft_toLeftOf="@+id/editReponse" />

    </android.support.constraint.ConstraintLayout>

Then the second fragment:

package layout;

public class ViewCardEditor extends Fragment {

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    // Inflate the layout for this fragment
    if (container != null) {
        container.removeAllViews();
    }

    return inflater.inflate(R.layout.fragment_view_card_editor, container, false);
}


}

with his xml:

    <FrameLayout 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"
        tools:context="layout.ViewCardEditor"
        android:background="@android:color/darker_gray" />

Solution

  • I want to create an activity that can switch between two fragments with different background.

    If by "switch" you mean adding/removing fragments, then none of these fragments can be part of your XML layout - in general you can consider XML based structure as (kind of) read-only. So in your project you need to replace your <Fragment> by view group container, i.e. <FrameLayout>, then instantiate your Fragments from code at runtime and add to said container. And since these fragments were not part of the XML, you will be able to remove them (or replace) later w/o any problems.