LayoutInflater 膨胀片段

LayoutInflater inflate fragment

有数百个类似的问题涉及 Android SDK 中的片段问题。我已经阅读了所有内容并尝试了示例,但我的程序无法运行。

我创建了一个 NavigationActivity (extends android.support.v4.app.FragmentActivity) 来创建一个 DrawerLayout。首先child是主要内容(activity提供那个id)。抽屉的第二个 child 应该是导航的片段。因为一切都是动态的,所以我使用了许多小布局。这是我的片段布局 (navigation_activity_fragment.xml):

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
>

    <fragment
        android:id="@+id/navigation"
        class="de.spinnerban.wildoak.view.fragments.NavigationFragment"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
    />
</LinearLayout>

在我的 NavigationActivity 中,我尝试合并视图:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    setContentView(R.layout.navigation_activity);

    drawerLayout = (DrawerLayout)findViewById(R.id.navigation_drawer);
    mainContent = LayoutInflater
            .from(getApplicationContext()) 
            .inflate(
               getContentResId(), // concrete activity returns id of the main content (abstract method)
               drawerLayout,
               false);

    navigationFragmentContainer = LayoutInflater
            .from(getApplicationContext())
            .inflate(R.layout.navigation_activity_fragment, drawerLayout, false); // EXCEPTION line 35 (XML above)

    drawerLayout.addView(mainContent);
    drawerLayout.addView(navigationFragmentContainer);
}

没有片段我的程序运行良好。现在有了碎片,我得到了这个。

Caused by: java.lang.ClassNotFoundException: Didn't find class "android.view.fragment" on path: DexPathList[[zip file "/data/app/de.spinnerban.wildoak-1/base.apk"],nativeLibraryDirectories=[/vendor/lib, /system/lib]]
            at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:56)
            at java.lang.ClassLoader.loadClass(ClassLoader.java:511)
            at java.lang.ClassLoader.loadClass(ClassLoader.java:469)
            at android.view.LayoutInflater.createView(LayoutInflater.java:571)
            at android.view.LayoutInflater.onCreateView(LayoutInflater.java:665)
            at com.android.internal.policy.impl.PhoneLayoutInflater.onCreateView(PhoneLayoutInflater.java:65)
            at android.view.LayoutInflater.onCreateView(LayoutInflater.java:682)
            at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:741)
            at android.view.LayoutInflater.rInflate(LayoutInflater.java:806)
            at android.view.LayoutInflater.inflate(LayoutInflater.java:504)
            at android.view.LayoutInflater.inflate(LayoutInflater.java:414)
            at de.spinnerban.wildoak.util.activity.NavigationActivity.onCreate(NavigationActivity.java:35)
            ...

Activity 的 onCreate 方法被调用,然后充气器试图找到 class android.view.fragment,当然这是错误的。为什么 inflater 将片段视为视图 class?

我已经做的是:

我的gradle编译com.android.support:appcompat-v7:22.0.0

    minSdkVersion 17
    targetSdkVersion 22

请帮助我,谢谢。

据我所知,没有 class 被称为 android.view.fragment。有 android.app.Fragmentandroid.support.v4.app.Fragment。从我正在寻找的地方看起来像是一个导入错误,但坦率地说,我不知道你是如何得到它的,甚至 compile 首先。

错误源自您 NavigationActivityonCreate() 方法,您尚未发布。

编辑:

我确信您原始代码中的问题在于您正在使用

class = "de.spinnerban.wildoak.view.fragments.NavigationFragment"

而不是

android:name = "de.spinnerban.wildoak.view.fragments.NavigationFragment"

如果第一次没有什么不同,请尝试从 IDE 再次卸载 APK 和 运行 应用程序。您使用的方法:以编程方式将 Fragment 添加到 LinearLayout 也是正确的,但您的原始代码应该适用于这个小改动。

天哪,我不知道为什么,但一切都变了。我想用 Android Studio 中的片段创建一个 activity 来查看代码,但似乎不再有 <fragment> 标签了。

解决方法:

  1. 创建容器视图(带有 id 或标签!)以添加片段
  2. 使用支持片段管理器并启动事务以将片段添加到 id 或标签(我不知道为什么,但是 'add to a view' 不起作用,因为没有 View参数,所以我们必须设置容器的id或标签!)

navigation_activity_fragment.xml:

<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="horizontal"
    android:id="@+id/navigation_container"
    android:layout_gravity="start"
>
</LinearLayout>

NavigationActivity.java:

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

这个解决方案还有一个很大的优势:我们可以通过ctor向片段传递参数。

在这里感谢大家。我很绝望。