【问题标题】:Hi, Android overlapping background fragment and inflate exception嗨,Android 重叠背景片段和膨胀异常
【发布时间】:2016-12-18 18:55:12
【问题描述】:

我想创建一个可以在具有不同背景的两个片段之间切换的活动。我可以用两个按钮在两个片段之间切换。

当我开始我的活动时,我的活动设置是这样的: cardEditor

我的片段是绿色的,四个按钮不在片段中。默认情况下,我的片段集是 addCardEditor。当我单击“ajouter”按钮时,应用程序应该放置 addCardEditor 片段。当我点击“Voir”按钮时,我应该会看到我的第二个片段,它被称为 viewCardEditor

但是当我开始我的活动时,当我按下“Voir”按钮时,我有this

背景仍然是绿色,没有任何按钮,但我已将 viewCardEditor 片段的背景设置为灰色!

当我按下“ajouter”按钮以显示我的 addCardEditor 时,它不会改变任何东西!我仍然有完全相同的东西。如果我按下任何按钮,它总是保持这种状态!我的两个片段都被这个绿色背景重叠。

然后当我尝试旋转智能手机时,出现错误:

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

我对 stackoverflow 和其他网站进行了研究,但没有找到任何解决问题的方法。谢谢你帮助我

我的 cardEditor 活动和他的 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();
    }

}
}

cardEditor 的 XML:

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

然后是我的第一个片段:

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

}

用他的 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>

然后是第二个片段:

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


}

用他的 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" />

PS : 我在标题中放了 Hi,因为我无法在帖子开头添加 Hi,太奇怪了……抱歉英语不好

【问题讨论】:

  • 您不应该使用 标签通过 XML 对片段进行膨胀,这会导致许多无法追溯到其根源的错误。就像这个一样。我建议动态创建片段,然后将它们添加到布局中。如果出现任何错误,请将完整的堆栈跟踪放到我们可以更好地分析根本原因。
  • Stackoverflow 没有行查看器。请在 XML 文件中标记第 65 行

标签: java android android-fragments fragment android-inflate


【解决方案1】:

我想创建一个可以在两个不同背景的片段之间切换的活动。

如果“切换”是指添加/删除片段,那么这些片段都不能成为 XML 布局的一部分 - 通常,您可以将基于 XML 的结构视为(某种)只读的。所以在你的项目中,你需要用视图组容器替换你的&lt;Fragment&gt;,即&lt;FrameLayout&gt;,然后在运行时从代码中实例化你的片段并添加到所述容器中。由于这些片段不是 XML 的一部分,因此您可以在以后删除(或替换)它们而不会出现任何问题。

【讨论】:

  • 我做到了,现在可以了,不再出错了,谢谢!
猜你喜欢
  • 2017-05-20
  • 2023-04-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多