Событие onClick в навигационном ящике не работает - PullRequest
0 голосов
/ 04 января 2019

Отказ от ответственности: Я уже прочитал пост в Событие onClick в ящике навигации , но, к сожалению, оно не работает для меня.

Я довольно новичок в Android. Я просто делаю свое первое приложение на Kotlin и хотел интегрировать NavigationDrawer. В него я включил опцию «Сайт», которая должна просто запустить сайт. Просто когда я нажимаю на него, он закрывает ящик, но не запускает Намерение для сайта.

Мой код: (я удалил неважные части, которые нужны для остальной части приложения)

MainActivity.kt:

class MainActivity : AppCompatActivity(), NavigationView.OnNavigationItemSelectedListener {

private lateinit var drawerLayout: DrawerLayout
private lateinit var aToggle: ActionBarDrawerToggle

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(activity_main)
    createNotificationChannel()
    setNavigationViewListener()

    val toolbar: Toolbar = toolbar
    setSupportActionBar(toolbar)
    val actionbar: ActionBar? = supportActionBar
    actionbar?.apply {
        setDisplayHomeAsUpEnabled(true)
        setHomeAsUpIndicator(R.drawable.ic_menu)
    }

    drawerLayout = drawer_layout
    aToggle = ActionBarDrawerToggle(this, drawerLayout, toolbar, R.string.open, R.string.close)
    drawerLayout.addDrawerListener(aToggle)

    drawerLayout.addDrawerListener(
            object : DrawerLayout.DrawerListener {
                override fun onDrawerSlide(drawerView: View, slideOffset: Float) {

                }

                override fun onDrawerOpened(drawerView: View) {

                }

                override fun onDrawerClosed(drawerView: View) {

                }

                override fun onDrawerStateChanged(newState: Int) {

                }
            }
    )

    aToggle.syncState()
    val navigationView: NavigationView = findViewById(R.id.nav_view)
    navigationView.setNavigationItemSelectedListener { menuItem ->
        // set item as selected to persist highlight
        menuItem.isChecked = true
        // close drawer when item is tapped
        drawerLayout.closeDrawers()

        // Add code here to update the UI based on the item selected
        // For example, swap UI fragments here

        true
    }
}

private fun setNavigationViewListener() {
    val navigationView = nav_view
    navigationView.setNavigationItemSelectedListener(this)
}

override fun onCreateOptionsMenu(menu: Menu): Boolean {
    val inflater = menuInflater
    inflater.inflate(R.menu.drawer_view, menu)
    return true
}

override fun onOptionsItemSelected(item: MenuItem): Boolean {
    return when (item.itemId) {
        android.R.id.home -> {
            drawerLayout.openDrawer(GravityCompat.START)
            true
        }
        else -> super.onOptionsItemSelected(item)
    }
    if(aToggle.onOptionsItemSelected(item)) {
        return true
    }
}

override fun onNavigationItemSelected(item: MenuItem): Boolean {
    when (item.itemId) {
        R.id.website -> {
            val i = Intent(Intent.ACTION_VIEW).setData(Uri.parse("http://gym-wen.de/vp/"))
            startActivity(i)
            drawerLayout.closeDrawer(GravityCompat.START)
            return true
        }
        else -> {}
    }
    return true
}
}

activity_main.xml:

<?xml version="1.0" encoding="UTF-8"?>
<android.support.v4.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:id="@+id/drawer_layout"
android:layout_height="match_parent"
android:fitsSystemWindows="true"
tools:context=".MainActivity"
app:layout_behavior="@string/appbar_scrolling_view_behavior"
tools:showIn="@layout/activity_main">

<FrameLayout
    android:id="@+id/content_frame"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    app:layout_behavior="@string/appbar_scrolling_view_behavior">

    <android.support.v7.widget.Toolbar
        android:id="@+id/toolbar"
        android:layout_width="match_parent"
        android:layout_height="?attr/actionBarSize"
        android:background="?attr/colorPrimary"
        android:theme="@style/ThemeOverlay.AppCompat.ActionBar" />

    <ListView
        android:id="@+id/vertretungs_list"
        android:paddingTop="?attr/actionBarSize"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

</FrameLayout>

<android.support.design.widget.NavigationView
    android:id="@+id/nav_view"
    android:layout_width="wrap_content"
    android:layout_height="match_parent"
    android:layout_gravity="start"
    android:fitsSystemWindows="true"
    app:menu="@menu/drawer_view" />

box_view.xml (меню):

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
tools:showIn="navigation_view">
<group android:checkableBehavior="single">
    <item
        android:id="@+id/website"
        android:title="@string/website" />
    <item
        android:id="@+id/nav_gallery"
        android:title="2" />
    <item
        android:id="@+id/nav_slideshow"
        android:title="3" />
    <item
        android:id="@+id/nav_manage"
        android:title="4" />
</group>

Я почти уверен, что что-то забыл, но я просто не знаю, что это. Я прочитал много уроков и других постов, но я просто не знаю этого. Надеюсь, кто-нибудь может мне помочь :)

Привет

Ответы [ 2 ]

0 голосов
/ 04 января 2019

Ваш класс активности реализует NavigationView.OnNavigationItemSelectedListener,
поэтому вместо установки в качестве слушателя:

navigationView.setNavigationItemSelectedListener { menuItem ->
    // set item as selected to persist highlight
    menuItem.isChecked = true
    // close drawer when item is tapped
    drawerLayout.closeDrawers()

    // Add code here to update the UI based on the item selected
    // For example, swap UI fragments here

    true
}

Вам следует позвонить:

navigationView.setNavigationItemSelectedListener(this)

поэтому этот метод называется:

override fun onNavigationItemSelected(item: MenuItem): Boolean {
    when (item.itemId) {
        R.id.website -> {
            val i = Intent(Intent.ACTION_VIEW).setData(Uri.parse("http://gym-wen.de/vp/"))
            startActivity(i)
            drawerLayout.closeDrawer(GravityCompat.START)
            return true
        }
        else -> {}
    }
    return true
}

и в этом методе вы управляете закрытием ящика или отмеченных предметов.

0 голосов
/ 04 января 2019

Вы установили двух слушателей для одинаковых вещей. Один перезаписывает другой.

navigationView.setNavigationItemSelectedListener { menuItem ->
    // set item as selected to persist highlight
    menuItem.isChecked = true
    // close drawer when item is tapped
    drawerLayout.closeDrawers()

    // Add code here to update the UI based on the item selected
    // For example, swap UI fragments here

    true
}

который не запускает сайт и navigationView.setNavigationItemSelectedListener(this) который должен.

На вашем месте я бы удалил весь первый блок и реализовал все в override fun onOptionsItemSelected(item: MenuItem): Boolean

...