Android 试图使用ActionBarDrawerToggle的NullPointerException
我正在尝试使用ActionBarDrawerToggle,但出现以下错误: 无法启动活动组件信息{com.cristianerm.bestflight/com.cristianerm.bestflight.MonitoredDestinationsActivity}:java.lang.NullPointerException:尝试在空对象引用上调用虚拟方法“void androidx.drawerlayout.widget.drawerlayout.addDrawerListener(androidx.drawerlayout.widget.drawerlayout$drawerlayout)” 在我尝试添加抽屉之前,工具栏正在工作。我在这里找到了一些答案,但什么也解决不了我的问题。如果有人能帮助我,谢谢你:) 我的代码: 监测目标活动Android 试图使用ActionBarDrawerToggle的NullPointerException,android,kotlin,material-design,Android,Kotlin,Material Design,我正在尝试使用ActionBarDrawerToggle,但出现以下错误: 无法启动活动组件信息{com.cristianerm.bestflight/com.cristianerm.bestflight.MonitoredDestinationsActivity}:java.lang.NullPointerException:尝试在空对象引用上调用虚拟方法“void androidx.drawerlayout.widget.drawerlayout.addDrawerListener(andr
class MonitoredDestinationsActivity : AppCompatActivity(), NavigationHost,
NavigationView.OnNavigationItemSelectedListener {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_monitored_destinations)
if (savedInstanceState == null) {
supportFragmentManager
.beginTransaction()
.add(R.id.container_monitored_destinations, MonitoredDestinationsFragment())
.commit()
}
val actionBarDrawerToggle = ActionBarDrawerToggle(
this,
drawer_layout,
app_bar_monitored_destinations,
R.string.open_drawer,
R.string.close_drawer
)
drawer_layout.addDrawerListener(actionBarDrawerToggle)
actionBarDrawerToggle.syncState()
nav_view.setNavigationItemSelectedListener(this)
}
override fun navigateTo(fragment: Fragment, addToBackstack: Boolean) {
val transaction = supportFragmentManager
.beginTransaction()
.replace(R.id.container_monitored_destinations, fragment)
if (addToBackstack) {
transaction.addToBackStack(null)
}
transaction.commit()
}
override fun onNavigationItemSelected(item: MenuItem): Boolean {
TODO("Not yet implemented")
}
}
监视目标碎片
class MonitoredDestinationsFragment : Fragment() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setHasOptionsMenu(true)
}
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
// Inflate the layout for this fragment
val view = inflater.inflate(R.layout.fragment_monitored_destinations, container, false)
// Set up the toolbar.
/*(activity as AppCompatActivity).setSupportActionBar(view.app_bar_monitored_destinations)
view.app_bar_monitored_destinations.setNavigationOnClickListener {
Toast.makeText(context, "Test", Toast.LENGTH_LONG).show();
}*/
view.app_bar_monitored_destinations.setOnMenuItemClickListener { menuItem ->
when (menuItem.itemId) {
R.id.menu_icon_more -> {
Toast.makeText(context, "Test item clicked", Toast.LENGTH_LONG).show();
true
}
else -> false
}
}
return view
}
override fun onCreateOptionsMenu(menu: Menu, menuInflater: MenuInflater) {
menuInflater.inflate(R.menu.toolbar_menu, menu)
super.onCreateOptionsMenu(menu, menuInflater)
}
}
fragment_monitored_destinations.xml
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout 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"
tools:context=".MonitoredDestinationsFragment">
<androidx.drawerlayout.widget.DrawerLayout 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"
tools:context=".MonitoredDestinationsFragment"
android:id="@+id/drawer_layout"
>
<androidx.coordinatorlayout.widget.CoordinatorLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
<com.google.android.material.appbar.AppBarLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<androidx.appcompat.widget.Toolbar
android:id="@+id/app_bar_monitored_destinations"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
app:title="Best Flight"
app:navigationIcon="@drawable/ic_menu"
style="@style/Widget.MaterialComponents.Toolbar.Primary"/>
</com.google.android.material.appbar.AppBarLayout>
</androidx.coordinatorlayout.widget.CoordinatorLayout>
<com.google.android.material.navigation.NavigationView
android:layout_width="wrap_content"
android:layout_height="match_parent"
app:menu="@menu/nav_menu"
android:id="@+id/nav_view"
android:layout_gravity="start"
/>
</androidx.drawerlayout.widget.DrawerLayout>
</FrameLayout>
我不知道您是否正在使用视图绑定功能来自动将
抽屉布局作为变量分配(而不是执行findViewById
),但该视图和ID是在片段中定义的,而不是在活动中定义的。显示它实际上并没有检查传递给构造函数的DrawerLayout
是否为null,因此当您试图调用它的addDrawerListener
方法时,它只是崩溃了
您可能不想在等待片段膨胀时乱来,这样您就可以查看并找到drawer\u布局
,所以我只想说,通常的建议是将DrawerLayout
放在包含活动中,用一个容器来粘贴实际内容(如片段)。这样一来,它就是一个一致的UI,而不是每次添加片段时都会更改,DrawerLayout
将在活动的onCreate
这里有一个你设置它的方法的例子嗨,我按照教程,移动了代码,做了一些修改,它成功了。非常感谢。