打开片段时带有 onItemClick 的 NullPointerException
NullPointerException with onItemClick when opening a fragment
我正在尝试实现导航抽屉 (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.onItemClick(MainActivity.java:117)
111行就是这一行
`if (!(getSupportFragmentManager().getFragments().get(0) instanceof LogFragment)) {`
更多详情:
- MainActivity 扩展了 ActionBarActivity
- 我的片段扩展
Fragment
(android.support.v4.app.Fragment) 无处不在
那么为什么我会得到这个空指针异常?
EDIT 我已经应用了 Rohit 的建议并且不再出现任何错误。但是布局没有改变。有什么问题吗?
EDIT@ 我想通了...首先没有将片段添加到 activity...所以没有什么可以替换的呃 :)
谢谢大家!
替换
if (!(getSupportFragmentManager().getFragments().get(0) instanceof NewLogFragment))
和
if (!(getSupportFragmentManager().findFragmentById(R.id.contentFrame) instanceof NewLogFragment))
同样改变案例1
编辑
替换
Fragments.ONE.getFragment()
和
Fragments.TWO.getFragment()
万一0
您的问题是 getFragments()
方法 returns 空指针。如果您查看 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;
}
我正在尝试实现导航抽屉 (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.onItemClick(MainActivity.java:117)
111行就是这一行
`if (!(getSupportFragmentManager().getFragments().get(0) instanceof LogFragment)) {`
更多详情:
- MainActivity 扩展了 ActionBarActivity
- 我的片段扩展
Fragment
(android.support.v4.app.Fragment) 无处不在
那么为什么我会得到这个空指针异常?
EDIT 我已经应用了 Rohit 的建议并且不再出现任何错误。但是布局没有改变。有什么问题吗?
EDIT@ 我想通了...首先没有将片段添加到 activity...所以没有什么可以替换的呃 :) 谢谢大家!
替换
if (!(getSupportFragmentManager().getFragments().get(0) instanceof NewLogFragment))
和
if (!(getSupportFragmentManager().findFragmentById(R.id.contentFrame) instanceof NewLogFragment))
同样改变案例1
编辑
替换
Fragments.ONE.getFragment()
和
Fragments.TWO.getFragment()
万一0
您的问题是 getFragments()
方法 returns 空指针。如果您查看 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;
}