Android导航视图点击监听器不起作用[重复]

Posted

技术标签:

【中文标题】Android导航视图点击监听器不起作用[重复]【英文标题】:Android Navigation View click listener not working [duplicate] 【发布时间】:2019-06-19 16:20:25 【问题描述】:

我使用向导创建了活动。 我删除了我不感兴趣的部分,例如浮动操作按钮。

activity_main_drawer.xml

中创建了我的自定义项目

向导创建了 onNavigationItemSelected 函数(参见下面的代码),我添加了我的代码,以便它退出活动并返回登录屏幕。

所以我不知道为什么,我在 logcat 中看不到任何有趣的东西,所以这是一个逻辑问题。我是新手,导航视图让我很害怕...如果我错过了您需要的任何内容,请告诉我。

package com.skrefi.googleplaycopy;

import android.content.Intent;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.design.widget.FloatingActionButton;
import android.support.design.widget.Snackbar;
import android.view.View;
import android.support.design.widget.NavigationView;
import android.support.v4.view.GravityCompat;
import android.support.v4.widget.DrawerLayout;
import android.support.v7.app.ActionBarDrawerToggle;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.Toast;

import com.google.firebase.auth.FirebaseAuth;

public class MainActivity extends AppCompatActivity
        implements NavigationView.OnNavigationItemSelectedListener 

    private FirebaseAuth firebaseAuth;

    @Override
    protected void onCreate(Bundle savedInstanceState) 
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        firebaseAuth = FirebaseAuth.getInstance();

        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);

        DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
        ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(
                this, drawer, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close);
        drawer.addDrawerListener(toggle);
        toggle.syncState();

        NavigationView navigationView = (NavigationView) findViewById(R.id.nav_view);
        navigationView.setNavigationItemSelectedListener(this);

    


    //Don't know what this is
    @Override
    public void onBackPressed() 
        DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
        if (drawer.isDrawerOpen(GravityCompat.START)) 
            drawer.closeDrawer(GravityCompat.START);
         else 
            super.onBackPressed();
        
    

    //Don't know what this is either
    @Override
    public boolean onCreateOptionsMenu(Menu menu) 
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    

    //In case I need it for the admin activity >> the 3 dots pop down thingy <<
    @Override
    public boolean onOptionsItemSelected(MenuItem item) 
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.

        MakeToast("SOMETHING");

        switch (item.getItemId())
            case R.id.action_settings:
                MakeToast("Settings button clicked");
                return true;
        

        return super.onOptionsItemSelected(item);
    


    @SuppressWarnings("StatementWithEmptyBody")
    @Override
    public boolean onNavigationItemSelected(MenuItem item) 
        // Handle navigation view item clicks here.
        switch(item.getItemId())
            case R.id.item_signout:
                firebaseAuth.getInstance().signOut();
                MakeToast("Signed out!");
                finish();
                startActivity(new Intent(MainActivity.this, LoginActivity.class));
                break;
        

        //DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
        //drawer.closeDrawer(GravityCompat.START);
        return true;
    

    public void MakeToast(String text) 
        Toast.makeText(this, text, Toast.LENGTH_LONG).show();
    

编辑:

因此,如果我将 可见性设置为 gone 并且我可以在此布局文件中使用我想要的布局,因为我得到的屏幕没有工具栏, 这就是我要的。并且我想为管理部分保留它,以便稍后检查用户是否是我,如果是,我会在抽屉中获得一个名为 Admin Activity 的新项目,它只是将事物的可见性设置为 visible 所以我得到了管理屏幕。

这是您 (@) 要求的内容:

<?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"
    android:id="@+id/drawer_layout"
    android:layout_
    android:layout_
    android:fitsSystemWindows="true">

    <!--This is for a potential admin screen-->

    <include
        android:id="@+id/include_toolbar_with_threedots_settings"
        layout="@layout/app_bar_main"
        android:layout_
        android:layout_
        android:visibility="gone" />

    <android.support.design.widget.NavigationView
        android:id="@+id/nav_view"
        android:layout_
        android:layout_
        android:layout_gravity="start"
        android:fitsSystemWindows="true"
        app:headerLayout="@layout/nav_header_main"
        app:menu="@menu/activity_main_drawer" />

    <android.support.constraint.ConstraintLayout
        android:layout_
        android:layout_>

        <Button
            android:layout_
            android:layout_
            android:text="This is for test"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toTopOf="parent" />

    </android.support.constraint.ConstraintLayout>

</android.support.v4.widget.DrawerLayout>

【问题讨论】:

请发布包含&lt;DrawerLayout&gt; 的布局。 @MikeM。编辑问题,检查结尾。谢谢你。 :) &lt;NavigationView&gt; 移动到&lt;ConstraintLayout&gt; 之后。 &lt;DrawerLayout&gt; 中的抽屉必须最后列出才能正常工作。另外,你真的应该只有一个主要内容View。也就是说,您应该以某种方式将&lt;include&gt;&lt;ConstraintLayout&gt; 合并为一个。否则,其中一个将完全覆盖另一个,您可能会在与后面的一个交互时遇到问题。 @MikeM。 navigationView.bringToFront(); 在已经提出的问题上找到了这个(确实搜索过但没有找到那个问题)。所以实际的问题是它不是“第一个”那是......哇......谢谢! 是的,你可以在代码中做到这一点,但它有点 hacky,如果你正确地安排你的布局,你根本不需要这样做。 Anyhoo,很高兴你让它工作。干杯! 【参考方案1】:

您在实际开始活动之前调用finish(),而您应该在开始登录活动后调用它。以下代码将启动 Login 活动并关闭 Main 活动。

@SuppressWarnings("StatementWithEmptyBody")
    @Override
    public boolean onNavigationItemSelected(MenuItem item) 
        // Handle navigation view item clicks here.
        switch(item.getItemId())
            case R.id.item_signout:
                firebaseAuth.getInstance().signOut();
                MakeToast("Signed out!");
                startActivity(new Intent(MainActivity.this, LoginActivity.class));
                finish();
                break;
        

    //DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
    //drawer.closeDrawer(GravityCompat.START);
    return true;

【讨论】:

其实整个函数都执行完了,不像return什么的,[这里](***.com/questions/10847526/…)就是finish()做的。我在其他活动中使用我的方式,所以我知道这不是问题。即使如此,既然如此,为什么 Toast 没有显示?

以上是关于Android导航视图点击监听器不起作用[重复]的主要内容,如果未能解决你的问题,请参考以下文章

ANDROID:简单的向上导航不起作用

视图控制器之间的导航不起作用

侧面导航抽屉项目单击不起作用

Android Studio 本机代码导航不起作用

如果堆栈大小> 1,则弹出后 SwiftUI3 导航链接不起作用

重复淡入淡出效果不起作用