简体   繁体   中英

Android Navigation Drawer click Event Issue

I am creating a application which contains Navigation Drawer Activity. I am loading different Fragments in my main Screen. Now when I have to call Fragment at that time it works fine but when I want to call some sort of service like call, image picker at that time I added setNavigationItemSelectedListener which is works fine but all other fragments are not loading now.

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

    }

When you call NavigationUI.setupWithNavController(navigationView, navController) , you're saying that you want NavController to handle click events from your NavigationView, navigating to the related screen as per the NavigationUI documentation . This, by necessity, calls setNavigationItemSelectedListener() internally.

By calling setNavigationItemSelectedListener afterwards, you remove the original listener, which is why your other items don't do anything anymore. You can trigger the default behavior by calling 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();

}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM