Android 导航抽屉点击事件问题
Android Navigation Drawer click Event Issue
我正在创建一个包含 Navigation Drawer Activity 的应用程序。我正在主屏幕中加载不同的片段。现在,当我当时必须调用 Fragment 时,它工作正常,但是当我想调用某种服务(如调用、图像选择器)时,我添加了 setNavigationItemSelectedListener,它工作正常,但现在所有其他片段都没有加载。
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Toolbar toolbar = findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
drawer = findViewById(R.id.drawer_layout);
NavigationView navigationView = findViewById(R.id.nav_view);
// 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, R.id.nav_franchise,
R.id.nav_tieUP, R.id.nav_giftVoucher, R.id.nav_faq, R.id.nav_privacy_policy,
R.id.nav_tools, R.id.nav_send)
.setDrawerLayout(drawer)
.build();
NavController navController = Navigation.findNavController(this, R.id.nav_host_fragment);
NavigationUI.setupActionBarWithNavController(this, navController, mAppBarConfiguration);
NavigationUI.setupWithNavController(navigationView, navController);
navigationView.setNavigationItemSelectedListener(new NavigationView.OnNavigationItemSelectedListener() {
@Override
public boolean onNavigationItemSelected(@NonNull MenuItem menuItem) {
int id = menuItem.getItemId();
if (id == R.id.callUs) {
Intent intent = new Intent(Intent.ACTION_CALL);
intent.setData(Uri.parse("tel:" + "XXXxxxXXX"));
if (ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.CALL_PHONE) != PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(MainActivity.this, new String[]{Manifest.permission.CALL_PHONE},REQUEST_PHONE_CALL);
}
else
{
startActivity(intent);
}
}
drawer.closeDrawer(GravityCompat.START);
return true;
}
});
}
当您调用 NavigationUI.setupWithNavController(navigationView, navController)
时,您是说您希望 NavController
处理来自 NavigationView 的点击事件,根据 the NavigationUI documentation 导航到相关屏幕。这必然会在内部调用 setNavigationItemSelectedListener()
。
之后调用 setNavigationItemSelectedListener
,您将删除原来的侦听器,这就是为什么您的其他项目不再执行任何操作的原因。您可以通过调用 NavigationUI.onNavDestinationSelected()
来触发默认行为
@Override
public boolean onNavigationItemSelected(@NonNull MenuItem menuItem) {
int id = menuItem.getItemId();
if (id == R.id.callUs) {
Intent intent = new Intent(Intent.ACTION_CALL);
intent.setData(Uri.parse("tel:" + "XXXxxxXXX"));
if (ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.CALL_PHONE) != PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(MainActivity.this, new String[]{Manifest.permission.CALL_PHONE},REQUEST_PHONE_CALL);
}
else
{
startActivity(intent);
}
}
else
{
// Make your navController object final above
// or call Navigation.findNavController() again here
NavigationUI.onNavDestinationSelected(menuItem, navController);
}
drawer.closeDrawer(GravityCompat.START);
return true;
}
I tried to make a fragment and made a drawer here is my code:
import android.support.v4.app.FragmentManager;
import android.support.v4.app.Fragment;
import android.content.res.Configuration;
import android.support.design.widget.Snackbar;
import android.support.v4.widget.DrawerLayout;
import android.support.v7.app.ActionBarDrawerToggle;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.support.v7.widget.Toolbar;
import android.support.design.widget.NavigationView;
import android.view.View;
import android.widget.LinearLayout;
import android.widget.RelativeLayout;
public class MainActivity extends AppCompatActivity implements View.OnClickListener, NavigationView.OnNavigationItemSelectedListener{
private Toolbar mToolBar;
private NavigationView mDrawer;
private ActionBarDrawerToggle mdrawerToggle;
private DrawerLayout mDrawerLayout;
private RelativeLayout digitalFrontier;
private RelativeLayout forwardThinkers;
private RelativeLayout preferedActions;
private LinearLayout innerParent;
public String viewVar;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initViews();
digitalFrontier.setOnClickListener(this);
forwardThinkers.setOnClickListener(this);
preferedActions.setOnClickListener(this);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.menu_main, menu);
return true;
}
@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.
int id = item.getItemId();
//noinspection SimplifiableIfStatement
if (id == R.id.action_settings) {
return true;
}
return super.onOptionsItemSelected(item);
}
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
mdrawerToggle.onConfigurationChanged(newConfig);
}
private void initViews(){
mToolBar = (Toolbar) findViewById(R.id.app_bar);
setSupportActionBar(mToolBar);
mDrawer = (NavigationView) findViewById(R.id.main_drawer);
mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_parent);
mdrawerToggle = new ActionBarDrawerToggle(
this,
mDrawerLayout,
mToolBar,
R.string.drawer_open,
R.string.drawer_close);
mDrawerLayout.setDrawerListener(mdrawerToggle);
// indicator based on whether the drawerlayout is in open or closed
mdrawerToggle.syncState();
digitalFrontier = (RelativeLayout) findViewById(R.id.digital_frontier);
forwardThinkers = (RelativeLayout) findViewById(R.id.forward_thinkers);
preferedActions = (RelativeLayout) findViewById(R.id.prefered_actions);
innerParent = (LinearLayout) findViewById(R.id.inner_parent);
mDrawer.setNavigationItemSelectedListener(this);
}
@Override
public void onClick(View v) {
if(v.getId() == R.id.digital_frontier || v.getId() == R.id.forward_thinkers ||
v.getId() == R.id.prefered_actions ){
detailActivity(v);
}
}
private void detailActivity(View view){
switch (view.getId()){
case R.id.digital_frontier:
viewVar = "digital frontier";
break;
case R.id.forward_thinkers:
viewVar = "forward thinkers";
break;
case R.id.prefered_actions:
viewVar = "prefered actions";
break;
}
Snackbar.make(mDrawerLayout, viewVar , Snackbar.LENGTH_LONG).show();
}
@Override
public boolean onNavigationItemSelected(MenuItem menuItem) {
selectDrawerItem(menuItem);
return false;
}
public void selectDrawerItem(MenuItem menuItem) {
// Create a new fragment and specify the planet to show based on
// position
Fragment fragment = null;
Class fragmentClass = null;
switch(menuItem.getItemId()) {
case R.id.agency_menu_item:
fragmentClass = FragmentAgency.class;
break;
}
try {
fragment = (Fragment) fragmentClass.newInstance();
} catch (Exception e) {
e.printStackTrace();
}
// Insert the fragment by replacing any existing fragment
FragmentManager fragmentManager = this.getSupportFragmentManager();
fragmentManager.beginTransaction().replace(R.id.fragment_content,
fragment).commit();
// Highlight the selected item, update the title, and close the drawer
menuItem.setChecked(true);
setTitle(menuItem.getTitle());
//mDrawer.closeDrawers();
}
我正在创建一个包含 Navigation Drawer Activity 的应用程序。我正在主屏幕中加载不同的片段。现在,当我当时必须调用 Fragment 时,它工作正常,但是当我想调用某种服务(如调用、图像选择器)时,我添加了 setNavigationItemSelectedListener,它工作正常,但现在所有其他片段都没有加载。
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Toolbar toolbar = findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
drawer = findViewById(R.id.drawer_layout);
NavigationView navigationView = findViewById(R.id.nav_view);
// 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, R.id.nav_franchise,
R.id.nav_tieUP, R.id.nav_giftVoucher, R.id.nav_faq, R.id.nav_privacy_policy,
R.id.nav_tools, R.id.nav_send)
.setDrawerLayout(drawer)
.build();
NavController navController = Navigation.findNavController(this, R.id.nav_host_fragment);
NavigationUI.setupActionBarWithNavController(this, navController, mAppBarConfiguration);
NavigationUI.setupWithNavController(navigationView, navController);
navigationView.setNavigationItemSelectedListener(new NavigationView.OnNavigationItemSelectedListener() {
@Override
public boolean onNavigationItemSelected(@NonNull MenuItem menuItem) {
int id = menuItem.getItemId();
if (id == R.id.callUs) {
Intent intent = new Intent(Intent.ACTION_CALL);
intent.setData(Uri.parse("tel:" + "XXXxxxXXX"));
if (ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.CALL_PHONE) != PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(MainActivity.this, new String[]{Manifest.permission.CALL_PHONE},REQUEST_PHONE_CALL);
}
else
{
startActivity(intent);
}
}
drawer.closeDrawer(GravityCompat.START);
return true;
}
});
}
当您调用 NavigationUI.setupWithNavController(navigationView, navController)
时,您是说您希望 NavController
处理来自 NavigationView 的点击事件,根据 the NavigationUI documentation 导航到相关屏幕。这必然会在内部调用 setNavigationItemSelectedListener()
。
之后调用 setNavigationItemSelectedListener
,您将删除原来的侦听器,这就是为什么您的其他项目不再执行任何操作的原因。您可以通过调用 NavigationUI.onNavDestinationSelected()
@Override
public boolean onNavigationItemSelected(@NonNull MenuItem menuItem) {
int id = menuItem.getItemId();
if (id == R.id.callUs) {
Intent intent = new Intent(Intent.ACTION_CALL);
intent.setData(Uri.parse("tel:" + "XXXxxxXXX"));
if (ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.CALL_PHONE) != PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(MainActivity.this, new String[]{Manifest.permission.CALL_PHONE},REQUEST_PHONE_CALL);
}
else
{
startActivity(intent);
}
}
else
{
// Make your navController object final above
// or call Navigation.findNavController() again here
NavigationUI.onNavDestinationSelected(menuItem, navController);
}
drawer.closeDrawer(GravityCompat.START);
return true;
}
I tried to make a fragment and made a drawer here is my code:
import android.support.v4.app.FragmentManager;
import android.support.v4.app.Fragment;
import android.content.res.Configuration;
import android.support.design.widget.Snackbar;
import android.support.v4.widget.DrawerLayout;
import android.support.v7.app.ActionBarDrawerToggle;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.support.v7.widget.Toolbar;
import android.support.design.widget.NavigationView;
import android.view.View;
import android.widget.LinearLayout;
import android.widget.RelativeLayout;
public class MainActivity extends AppCompatActivity implements View.OnClickListener, NavigationView.OnNavigationItemSelectedListener{
private Toolbar mToolBar;
private NavigationView mDrawer;
private ActionBarDrawerToggle mdrawerToggle;
private DrawerLayout mDrawerLayout;
private RelativeLayout digitalFrontier;
private RelativeLayout forwardThinkers;
private RelativeLayout preferedActions;
private LinearLayout innerParent;
public String viewVar;
@Override protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initViews();
digitalFrontier.setOnClickListener(this);
forwardThinkers.setOnClickListener(this);
preferedActions.setOnClickListener(this);
}
@Override public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.menu_main, menu);
return true;
}
@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.
int id = item.getItemId();
//noinspection SimplifiableIfStatement
if (id == R.id.action_settings) {
return true;
}
return super.onOptionsItemSelected(item);
}
@Override public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
mdrawerToggle.onConfigurationChanged(newConfig);
}
private void initViews(){
mToolBar = (Toolbar) findViewById(R.id.app_bar);
setSupportActionBar(mToolBar);
mDrawer = (NavigationView) findViewById(R.id.main_drawer);
mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_parent);
mdrawerToggle = new ActionBarDrawerToggle(
this,
mDrawerLayout,
mToolBar,
R.string.drawer_open,
R.string.drawer_close);
mDrawerLayout.setDrawerListener(mdrawerToggle);
// indicator based on whether the drawerlayout is in open or closed
mdrawerToggle.syncState();
digitalFrontier = (RelativeLayout) findViewById(R.id.digital_frontier);
forwardThinkers = (RelativeLayout) findViewById(R.id.forward_thinkers);
preferedActions = (RelativeLayout) findViewById(R.id.prefered_actions);
innerParent = (LinearLayout) findViewById(R.id.inner_parent);
mDrawer.setNavigationItemSelectedListener(this);
}
@Override public void onClick(View v) {
if(v.getId() == R.id.digital_frontier || v.getId() == R.id.forward_thinkers ||
v.getId() == R.id.prefered_actions ){
detailActivity(v);
}
}
private void detailActivity(View view){
switch (view.getId()){
case R.id.digital_frontier:
viewVar = "digital frontier";
break;
case R.id.forward_thinkers:
viewVar = "forward thinkers";
break;
case R.id.prefered_actions:
viewVar = "prefered actions";
break;
}
Snackbar.make(mDrawerLayout, viewVar , Snackbar.LENGTH_LONG).show();
}
@Override public boolean onNavigationItemSelected(MenuItem menuItem) {
selectDrawerItem(menuItem);
return false;
}
public void selectDrawerItem(MenuItem menuItem) {
// Create a new fragment and specify the planet to show based on
// position
Fragment fragment = null;
Class fragmentClass = null;
switch(menuItem.getItemId()) {
case R.id.agency_menu_item:
fragmentClass = FragmentAgency.class;
break;
}
try {
fragment = (Fragment) fragmentClass.newInstance();
} catch (Exception e) {
e.printStackTrace();
}
// Insert the fragment by replacing any existing fragment
FragmentManager fragmentManager = this.getSupportFragmentManager();
fragmentManager.beginTransaction().replace(R.id.fragment_content,
fragment).commit();
// Highlight the selected item, update the title, and close the drawer
menuItem.setChecked(true);
setTitle(menuItem.getTitle());
//mDrawer.closeDrawers();
}