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?
我已经做的是:
- 使用
ActionBarActivity
- 使用
Activity
(不支持)
- 使用
FragmentActivity
- 在 fragment-tag
中使用 class
属性
- 在 fragment-tag
中使用 android:name
属性
我的gradle编译com.android.support:appcompat-v7:22.0.0
minSdkVersion 17
targetSdkVersion 22
请帮助我,谢谢。
据我所知,没有 class 被称为 android.view.fragment
。有 android.app.Fragment
和 android.support.v4.app.Fragment
。从我正在寻找的地方看起来像是一个导入错误,但坦率地说,我不知道你是如何得到它的,甚至 compile 首先。
错误源自您 NavigationActivity
的 onCreate()
方法,您尚未发布。
编辑:
我确信您原始代码中的问题在于您正在使用
class = "de.spinnerban.wildoak.view.fragments.NavigationFragment"
而不是
android:name = "de.spinnerban.wildoak.view.fragments.NavigationFragment"
如果第一次没有什么不同,请尝试从 IDE 再次卸载 APK 和 运行 应用程序。您使用的方法:以编程方式将 Fragment
添加到 LinearLayout
也是正确的,但您的原始代码应该适用于这个小改动。
天哪,我不知道为什么,但一切都变了。我想用 Android Studio 中的片段创建一个 activity 来查看代码,但似乎不再有 <fragment>
标签了。
解决方法:
- 创建容器视图(带有 id 或标签!)以添加片段
- 使用支持片段管理器并启动事务以将片段添加到 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向片段传递参数。
在这里感谢大家。我很绝望。
有数百个类似的问题涉及 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?
我已经做的是:
- 使用
ActionBarActivity
- 使用
Activity
(不支持) - 使用
FragmentActivity
- 在 fragment-tag 中使用
- 在 fragment-tag 中使用
class
属性
android:name
属性
我的gradle编译com.android.support:appcompat-v7:22.0.0
minSdkVersion 17
targetSdkVersion 22
请帮助我,谢谢。
据我所知,没有 class 被称为 android.view.fragment
。有 android.app.Fragment
和 android.support.v4.app.Fragment
。从我正在寻找的地方看起来像是一个导入错误,但坦率地说,我不知道你是如何得到它的,甚至 compile 首先。
错误源自您 NavigationActivity
的 onCreate()
方法,您尚未发布。
编辑:
我确信您原始代码中的问题在于您正在使用
class = "de.spinnerban.wildoak.view.fragments.NavigationFragment"
而不是
android:name = "de.spinnerban.wildoak.view.fragments.NavigationFragment"
如果第一次没有什么不同,请尝试从 IDE 再次卸载 APK 和 运行 应用程序。您使用的方法:以编程方式将 Fragment
添加到 LinearLayout
也是正确的,但您的原始代码应该适用于这个小改动。
天哪,我不知道为什么,但一切都变了。我想用 Android Studio 中的片段创建一个 activity 来查看代码,但似乎不再有 <fragment>
标签了。
解决方法:
- 创建容器视图(带有 id 或标签!)以添加片段
- 使用支持片段管理器并启动事务以将片段添加到 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向片段传递参数。
在这里感谢大家。我很绝望。