LayoutInflater膨胀片段

时间:2015-03-24 21:35:25

标签: java android android-layout android-fragments

有数百个类似问题涉及Android SDK中的片段问题。我已经阅读了所有内容并尝试了样本,但我的程序无法正常工作。

我创建了NavigationActivityextends android.support.v4.app.FragmentActivity)来创建DrawerLayout。第一个孩子是主要内容(活动提供id)。抽屉的第二个孩子应该是导航的片段。由于一切都是动态的,我使用了许多小布局。这是我的片段布局(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方法,然后inflater尝试查找class android.view.fragment,当然这是错误的。为什么inflater将片段视为视图类?

我已经做过的是:

  • 使用ActionBarActivity
  • 使用Activity(不支持)
  • 使用FragmentActivity
  • 在fragment-tag
  • 中使用class attr
  • 在fragment-tag
  • 中使用android:name attr

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

    minSdkVersion 17
    targetSdkVersion 22

请帮帮我,谢谢。

2 个答案:

答案 0 :(得分:2)

据我所知,没有一类被称为android.view.fragment。有android.app.Fragmentandroid.support.v4.app.Fragment。看起来像我正在寻找的导入错误,但坦率地说,我不知道你怎么能在第一时间得到编译

错误源自您onCreate()的{​​{1}}方法,该方法尚未发布。

修改

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

NavigationActivity

而不是

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

如果第一次没有区别,请尝试卸载APK并再次从IDE运行应用程序。您使用的方法:以编程方式将android:name = "de.spinnerban.wildoak.view.fragments.NavigationFragment" 添加到Fragment也是正确的,但您的原始代码应该可以使用这一小改动。

答案 1 :(得分:1)

哦,伙计,我不知道为什么,但一切都在变化。我有想法使用Android Studio中的片段创建一个活动来查看代码,而且似乎没有<fragment> - 标签了。

解决方案:

  1. 创建一个容器视图(带有id或tag!)以添加片段
  2. 使用支持片段管理器并启动一个事务,将片段添加到ID或标签中(我不知道为什么,但是添加到视图中并且自那以后不起作用没有View参数,所以我们必须设置容器的ID或标记!)
  3. 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将参数传递给片段。

    我要感谢大家。我非常绝望。