我正在尝试实现导航抽屉(based on this tutorial)。
当点击抽屉中的某个项目时,我想打开一个片段。这是我的MainActivity.java中的一些代码
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
int editedPosition = position + 1;
Toast.makeText(MainActivity.this, "You selected item " + editedPosition, Toast.LENGTH_SHORT).show();
switch(position){
case 0:
Log.d("SWITCH", "Case 0");
if (!(getSupportFragmentManager().getFragments().get(0) instanceof NewLogFragment)) {
getSupportFragmentManager().beginTransaction()
.replace(R.id.contentFrame, Fragment
.instantiate(MainActivity.this, Fragments.ONE.getFragment()))
.commit();
}
break;
case 1:
if (!(getSupportFragmentManager().getFragments().get(0) instanceof LogFragment)) {
getSupportFragmentManager().beginTransaction()
.replace(R.id.contentFrame, Fragment
.instantiate(MainActivity.this, Fragments.ONE.getFragment()))
.commit();
}
break;
}
mDrawerLayout.closeDrawer(mDrawerList);
}
});
这是我的activity_main.xml
<LinearLayout 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"
android:orientation="vertical"
tools:context=".MainActivity">
<android.support.v7.widget.Toolbar
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
android:background="@color/primary"
app:popupTheme="@style/Theme.AppCompat"
app:theme="@style/ToolbarTheme" />
<!-- Main layout -->
<android.support.v4.widget.DrawerLayout
android:id="@+id/drawer"
android:layout_width="match_parent"
android:layout_height="match_parent">
<FrameLayout
android:id="@+id/contentFrame"
android:layout_width="match_parent"
android:layout_height="match_parent"></FrameLayout>
<!-- Nav drawer -->
<ListView
android:id="@android:id/list"
android:layout_width="305dp"
android:layout_height="match_parent"
android:layout_gravity="start"
android:background="@android:color/white" />
</android.support.v4.widget.DrawerLayout>
</LinearLayout>
另外,这是我的Fragments.java
public enum Fragments {
ONE(NewLogFragment.class),TWO(LogFragment.class);
final Class<? extends Fragment> fragment;
private Fragments(Class<? extends Fragment> fragment) {
this.fragment = fragment;
}
public String getFragment() {
return fragment.getName();
}}
当我运行时,我得到了
java.lang.NullPointerException at sleeping_vityaz.fivethreeone_trainer.MainActivity$1.onItemClick(MainActivity.java:117)
第111行是这一行
`if (!(getSupportFragmentManager().getFragments().get(0) instanceof LogFragment)) {`
更多详情:
Fragment
(android.support.v4.app.Fragment)那么为什么我得到这个空指针异常?
编辑我已经应用了Rohit的建议,不再有任何错误。但是布局不会改变。可能有什么不对?
编辑@ 我想出来......首先没有将片段添加到活动中......所以没有什么可以取代duh :) 谢谢大家!
答案 0 :(得分:0)
您的问题是getFragments()
方法,它返回空指针。如果您查看Android API文档,那么该方法就没有一个单词。如果官方API中没有提到某些内容,请不要指望它会起作用xD
修改强> 在第二种情况下,您希望:
instantiate(MainActivity.this, Fragments.TWO.getFragment()))
而不是
instantiate(MainActivity.this, Fragments.ONE.getFragment()))
编辑2 好吧,让我们尝试使用这样的开关:
switch(position){
case 0:
Log.d("SWITCH", "Case 0");
getSupportFragmentManager().beginTransaction()
.replace(R.id.contentFrame, Fragment
.instantiate(MainActivity.this, Fragments.ONE.getFragment()))
.commit();
break;
case 1:
getSupportFragmentManager().beginTransaction()
.replace(R.id.contentFrame, Fragment
.instantiate(MainActivity.this, Fragments.TWO.getFragment()))
.commit();
break;
}
答案 1 :(得分:-1)
替换
if (!(getSupportFragmentManager().getFragments().get(0) instanceof NewLogFragment))
带
if (!(getSupportFragmentManager().findFragmentById(R.id.contentFrame) instanceof NewLogFragment))
同样改变案例1
修改强>
替换
Fragments.ONE.getFragment()
带
Fragments.TWO.getFragment()
案例0