有数百个类似问题涉及Android SDK中的片段问题。我已经阅读了所有内容并尝试了样本,但我的程序无法正常工作。
我创建了NavigationActivity
(extends 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
class
attr
android:name
attr
我的gradle编译com.android.support:appcompat-v7:22.0.0
minSdkVersion 17
targetSdkVersion 22
请帮帮我,谢谢。
答案 0 :(得分:2)
据我所知,没有一类被称为android.view.fragment
。有android.app.Fragment
和android.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>
- 标签了。
解决方案:
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将参数传递给片段。
我要感谢大家。我非常绝望。