Прослушиватель кликов Android Navigation View не работает

Я создал действие с помощью мастера. Я удалил то, что мне не интересно, например плавающую кнопку действия.

Создал свои пользовательские элементы в activity_main_drawer.xml

Мастер создал функцию onNavigationItemSelected (см. код ниже), и я добавил свой код, чтобы он завершал действие и возвращался к экрану входа.

Так что я не знаю почему, я не вижу ничего интересного в логарифме, так что это логическая проблема. Я новичок, и вид навигации меня очень пугает... Сообщите мне, если я пропустил что-то, что вам нужно.

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();
    }
}

Изменить:

Поэтому может возникнуть путаница, если я установлю видимость на исчезнувший и получу макет, который хочу, прямо в этом файле макета, потому что я получаю экран без панели инструментов, это что я хочу. И я хочу сохранить это также для административной части, чтобы позже проверить, является ли пользователь мной, и если да, я получаю новый элемент в ящике под названием «Активность администратора», который просто устанавливает видимость вещи на visible< /em> так что я получаю экран администратора.

Вот что вы попросили (@):

<?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_width="match_parent"
    android:layout_height="match_parent"
    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_width="match_parent"
        android:layout_height="match_parent"
        android:visibility="gone" />

    <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:headerLayout="@layout/nav_header_main"
        app:menu="@menu/activity_main_drawer" />

    <android.support.constraint.ConstraintLayout
        android:layout_width="wrap_content"
        android:layout_height="wrap_content">

        <Button
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            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>

person SKREFI    schedule 25.01.2019    source источник
comment
Пожалуйста, опубликуйте макет, в котором есть <DrawerLayout>.   -  person Mike M.    schedule 25.01.2019
comment
@МайкМ. Отредактировал вопрос, проверьте конец. Спасибо. :)   -  person SKREFI    schedule 26.01.2019
comment
Переместите <NavigationView> после <ConstraintLayout>. Ящик в <DrawerLayout> должен быть указан последним, чтобы он работал правильно. Кроме того, у вас действительно должен быть только один основной контент View. То есть вы должны как-то объединить эти <include> и <ConstraintLayout> в один. В противном случае один из них полностью закроет другой, и у вас, вероятно, возникнут проблемы при взаимодействии с тем, что сзади.   -  person Mike M.    schedule 26.01.2019
comment
@МайкМ. navigationView.bringToFront(); Нашел это по уже заданному вопросу (действительно искал, но не нашел этот вопрос). Итак, проблема была в том, что это был не первый случай. Это... вау... Спасибо!   -  person SKREFI    schedule 26.01.2019
comment
Да, вы можете сделать это в коде, но это довольно хакерски, и если вы правильно расположите макет, вам вообще не нужно этого делать. Anyhoo, рад, что у вас это работает. Ваше здоровье!   -  person Mike M.    schedule 26.01.2019


Ответы (1)


Вы вызываете finish() перед тем, как начать свою активность, тогда как вы должны вызывать ее после начала активности входа в систему. Следующий код запустит действие входа и закроет основное действие.

@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;
}
person 113408    schedule 25.01.2019
comment
На самом деле выполняется вся функция, она не работает как return или что-то в этом роде, [здесь] (stackoverflow.com/questions/10847526/) - это то, что делает finish(). Я использую свой способ в других видах деятельности, поэтому я знаю, что это не проблема. Тем не менее, учитывая это, почему не отображается тост? - person SKREFI; 26.01.2019