Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/188.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 试图使用ActionBarDrawerToggle的NullPointerException_Android_Kotlin_Material Design - Fatal编程技术网

Android 试图使用ActionBarDrawerToggle的NullPointerException

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

我正在尝试使用ActionBarDrawerToggle,但出现以下错误:

无法启动活动组件信息{com.cristianerm.bestflight/com.cristianerm.bestflight.MonitoredDestinationsActivity}:java.lang.NullPointerException:尝试在空对象引用上调用虚拟方法“void androidx.drawerlayout.widget.drawerlayout.addDrawerListener(androidx.drawerlayout.widget.drawerlayout$drawerlayout)”

在我尝试添加抽屉之前,工具栏正在工作。我在这里找到了一些答案,但什么也解决不了我的问题。如果有人能帮助我,谢谢你:)

我的代码:

监测目标活动

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


这里有一个你设置它的方法的例子

嗨,我按照教程,移动了代码,做了一些修改,它成功了。非常感谢。