Прослушиватель кликов 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();
    }
}

Редактировать:

So it may be confusing if I set the видимость ушел, и я получаю нужный мне макет прямо в этом файле макета, потому что я получаю экран без панели инструментов, это то, что я хочу. И я хочу сохранить это также для административной части, чтобы позже проверить, является ли пользователь мной, и если это так, я получаю новый элемент в ящике под названием «Активность администратора», который просто устанавливает видимость вещи на видимый, поэтому я получаю экран администратора.

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

<?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>

Пожалуйста, опубликуйте макет, в котором есть <DrawerLayout>.

Mike M. 25.01.2019 20:54

@МайкМ. Отредактировал вопрос, проверьте конец. Спасибо. :)

SKREFI 25.01.2019 22:14

Переместите <NavigationView> после <ConstraintLayout>. Ящик в <DrawerLayout> должен быть указан последним, чтобы он работал правильно. Кроме того, у вас действительно должен быть только один основной контент View. То есть вы должны как-то объединить эти <include> и <ConstraintLayout> в один. В противном случае один из них полностью закроет другой, и у вас, вероятно, возникнут проблемы при взаимодействии с тем, что сзади.

Mike M. 25.01.2019 22:22

@МайкМ. navigationView.bringToFront(); Нашел это по уже заданному вопросу (действительно искал, но не нашел этот вопрос). Так что на самом деле проблема была в том, что это был не «первый». Это... вау... Спасибо!

SKREFI 25.01.2019 22:27

Да, вы можете сделать это в коде, но это довольно хакерски, и если вы правильно расположите макет, вам вообще не нужно этого делать. Anyhoo, рад, что у вас это работает. Ваше здоровье!

Mike M. 25.01.2019 22:29
1
5
1 711
1

Ответы 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;
}

На самом деле выполняется вся функция, она не работает как возврат или что-то в этом роде, [здесь] (stackoverflow.com/questions/10847526/…) это то, что делает финиш(). Я использую свой способ в других видах деятельности, поэтому я знаю, что это не проблема. Тем не менее, учитывая это, почему не отображается тост?

SKREFI 25.01.2019 22:21

Другие вопросы по теме