Я создал новый проект 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;
}
}
Когда я нажимаю на пункт меню Галерея, должно появиться сообщение «Нажмите». Вместо этого соответствующий фрагмент называется. Как я могу заставить эту работу работать так, чтобы выбор пункта меню вызывал внешнюю активность, получал от нее результаты и отображал их в соответствующем фрагменте?