onNavigationItemSelected не регистрируется выбор пользователя - PullRequest
0 голосов
/ 07 марта 2020

Я создал новый проект Android, начиная с шаблона действия NavigationDrawer, поэтому следующий код максимально приближен к поведению по умолчанию.

В настоящее время мой блок навигации содержит три записи по умолчанию: Home, Галерея и слайд-шоу. Когда я нажимаю на любой из них, отображается соответствующий фрагмент. Я хотел бы вызвать внешнюю активность, когда эти элементы нажаты, получить некоторые результаты, а затем отобразить результаты во фрагменте (вместо непосредственного вызова фрагмента).

Для этого это что я сделал:

  • Я реализовал NavigationView.OnNavigationItemSelectedListener в своей основной деятельности
  • Я добавил слушателя в навигационное представление: navigationView.setNavigationItemSelectedListener(this);
  • I переопределил метод onNavigationItemSelected в своей основной деятельности

Вот полный код для MainActivity.java (я пока не трогал другие файлы проекта):

package com.example.test;

import android.os.Bundle;
import android.support.annotation.NonNull;
import android.view.MenuItem;
import android.view.View;
import android.view.Menu;
import android.support.design.widget.FloatingActionButton;
import android.support.design.widget.Snackbar;
import android.support.design.widget.NavigationView;

import androidx.navigation.NavController;
import androidx.navigation.Navigation;
import androidx.navigation.ui.AppBarConfiguration;
import androidx.navigation.ui.NavigationUI;

import android.support.v4.widget.DrawerLayout;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.widget.Toast;

public class MainActivity extends AppCompatActivity implements NavigationView.OnNavigationItemSelectedListener {

    private AppBarConfiguration mAppBarConfiguration;
    private DrawerLayout drawer;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Toolbar toolbar = findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);
        FloatingActionButton fab = findViewById(R.id.fab);
        fab.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG)
                        .setAction("Action", null).show();
            }
        });
        drawer = findViewById(R.id.drawer_layout);
        NavigationView navigationView = findViewById(R.id.nav_view);
        navigationView.setNavigationItemSelectedListener(this);
        // Passing each menu ID as a set of Ids because each
        // menu should be considered as top level destinations.
        mAppBarConfiguration = new AppBarConfiguration.Builder(
                R.id.nav_home, R.id.nav_gallery, R.id.nav_slideshow)
                .setDrawerLayout(drawer)
                .build();
        NavController navController = Navigation.findNavController(this, R.id.nav_host_fragment);
        NavigationUI.setupActionBarWithNavController(this, navController, mAppBarConfiguration);
        NavigationUI.setupWithNavController(navigationView, navController);
    }

    @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;
    }

    @Override
    public boolean onSupportNavigateUp() {
        NavController navController = Navigation.findNavController(this, R.id.nav_host_fragment);
        return NavigationUI.navigateUp(navController, mAppBarConfiguration)
                || super.onSupportNavigateUp();
    }

    @Override
    public boolean onNavigationItemSelected(@NonNull MenuItem item) {
        // Handle navigation view item clicks here.
        switch (item.getItemId()) {

            case R.id.nav_gallery: {
                Toast.makeText(getApplicationContext(), "clicked", Toast.LENGTH_SHORT).show();
            }
        }
        //close navigation drawer
        drawer.closeDrawers();
        return true;
    }
}

Когда я нажимаю на пункт меню Галерея, должно появиться сообщение «Нажмите». Вместо этого соответствующий фрагмент называется. Как я могу заставить эту работу работать так, чтобы выбор пункта меню вызывал внешнюю активность, получал от нее результаты и отображал их в соответствующем фрагменте?

1 Ответ

0 голосов
/ 07 марта 2020

Есть несколько способов добиться этого. Самый простой способ:

  1. В своей деятельности определите функцию с модификатором доступа publi c, чтобы вы могли получить к ней доступ за пределами своего класса.
void someMethodOnMainActivity() {}
В вашем фрагменте:
Activity activity = requireActivity();
if (activity instanceof MainActivity) {
  ((MainActivity) activity).someMethodOnMainActivity();
}

Вы также можете вызвать onNavigationItemSelected() в своей основной деятельности.

...