Open next activity only after navigation drawer completes it closing animation

后端 未结 7 449
陌清茗
陌清茗 2020-12-30 10:13

I\'m using Navigation Drawer in my application.

When the user clicks on any of the menu item in drawer, it opens a new Activity (not fr

相关标签:
7条回答
  • 2020-12-30 10:48

    I did this somehow similiar to Jan.

    Select an item

    If an item gets clicked, i save its id and close the Drawer:

    navigationView.setNavigationItemSelectedListener(new NavigationView.OnNavigationItemSelectedListener()
        {
            @Override
            public boolean onNavigationItemSelected(MenuItem menuItem)
            {
                clickedItem = menuItem.getItemId();
                drawerLayout.closeDrawers();
                return true;
            }
        });
    

    Listen for drawer close

    If the Drawer gets closed i listen for it and check if an item has been clicked. If it has i call my method to handle the navigation click.

    drawerToggle = new ActionBarDrawerToggle(activity, drawerLayout, R.string.accessibility_open_nav, R.string.accessibility_open_nav)
        {
            @Override
            public void onDrawerClosed(View drawerView)
            {
                super.onDrawerClosed(drawerView);
    
                if(clickedItem != 0)
                {
                    handleNavigationClick();
                }
            }
        };
    
    drawerLayout.setDrawerListener(drawerToggle);
    

    Handle the click

    Here i react to the item click on open intents in this case (simplified). You need to reset the clickedItem here to 0. That is, because if you go back to an activity, open and close the drawer, it would still have the clickedItem number and would handle the click again.

    private void handleItemClick()
    {
        switch (clickedItem)
        {
            case R.id.item_1:
                do_something_1;
                break;
    
            case R.id.item_2:
                do_something_2;
                break;
        }
    
        clickedItem = 0;
    }
    
    0 讨论(0)
  • 2020-12-30 10:51

    Every answer is so complicated..... It's so easy.

    Just add a drawerlistener and do something in onClosed() method:

    DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
    

    when you select a item from navigation drawer you will call this method to close the drawer:

    drawer.closeDrawer(GravityCompat.START);
    

    after the above method call just add below lines and do whatever you want:

    drawer.addDrawerListener(new DrawerLayout.DrawerListener() {
            @Override
            public void onDrawerSlide(@NonNull View drawerView, float slideOffset) {
    
            }
    
            @Override
            public void onDrawerOpened(@NonNull View drawerView) {
    
            }
    
            @Override
            public void onDrawerClosed(@NonNull View drawerView) {
                startActivity(finalIntent);
    
               // Or else do something here....
            }
    
            @Override
            public void onDrawerStateChanged(int newState) {
    
            }
        });
    
    0 讨论(0)
  • 2020-12-30 10:52

    Don't close navigation drawer. It will slide with the old activity. Or call startActivity after drawerLayout.closeDrawer(drawerList);

    public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
        drawerLayout.closeDrawer(drawerList);
        Intent intent = new Intent(FirstActivity.this, SecondActivity.class);
        //set animation here
        startActivity(intent);
        finish();
    }
    
    0 讨论(0)
  • 2020-12-30 10:52

    I extend all my activities where I want to have a Navigation drawer by DrawerActivity class. Because I had a little animation conflict as well so I start my Activities after Navigation drawer is completely closed. This is implementation which covers all cases:

    public class DrawerActivity extends AppCompatActivity {
      private String[] mMenuTitles;
      private DrawerLayout mDrawerLayout;
      private ListView mDrawerList;
      private CharSequence mTitle;
      private ActionBarDrawerToggle mDrawerToggle;
    
      private Boolean isItemClicked = false;
    
      protected void onCreateDrawer() {
    
    
        mTitle = getResources().getString(R.string.app_name);
        mMenuTitles = new String[]{getString(R.string.drawer_item1), getString(R.string.drawer_item2), getString(R.string.drawer_item3)};
        mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
        mDrawerLayout.setScrimColor(getResources().getColor(R.color.black_transparent_30));
        // mDrawerLayout.setScrimColor(Color.TRANSPARENT);
        mDrawerList = (ListView) findViewById(R.id.left_drawer);
    
        // Set the adapter for the list view
        mDrawerList.setAdapter(new ArrayAdapter<String>(this,
                R.layout.drawer_list_item, mMenuTitles));
        // Set the list's click listener
        mDrawerList.setOnItemClickListener(new DrawerItemClickListener());
    
        mDrawerToggle = new ActionBarDrawerToggle(
                this,                  /* host Activity */
                mDrawerLayout,         /* DrawerLayout object */
                // R.mipmap.ic_drawer,  /* nav drawer icon to replace 'Up' caret   */
                R.string.drawer_open,  /* "open drawer" description */
                R.string.drawer_close  /* "close drawer" description */
        ) {
    

    If item is clicked, I start activity on checked position.

            /** Called when a drawer has settled in a completely closed state.     */
            public void onDrawerClosed(View view) {
                if (isItemClicked) {
                    int position = mDrawerList.getCheckedItemPosition();
                    startMyActivity(position); 
                    isItemClicked = false;
                }
    

    Method setCheckedItem is overriden in extended activities for showing checked item consistently.

                setCheckedItem(mDrawerList);
                //  getSupportActionBar().setTitle(mTitle);
            }
    
            /** Called when a drawer has settled in a completely open state. */
            public void onDrawerOpened(View drawerView) {
                //  getSupportActionBar().setTitle(mTitle);
            }
        };
    
        // Set the drawer toggle as the DrawerListener
        mDrawerLayout.setDrawerListener(mDrawerToggle);
    
        getSupportActionBar().setDisplayHomeAsUpEnabled(true);
        getSupportActionBar().setHomeButtonEnabled(true);
    }
    
    public void setCheckedItem(ListView mDrawerList) {
    }
    
    @Override
    protected void onPostCreate(Bundle savedInstanceState) {
        super.onPostCreate(savedInstanceState);
        setCheckedItem(mDrawerList);
        // Sync the toggle state after onRestoreInstanceState has occurred.
        mDrawerToggle.syncState();
    }
    
    @Override
    public void onConfigurationChanged(Configuration newConfig) {
        super.onConfigurationChanged(newConfig);
        mDrawerToggle.onConfigurationChanged(newConfig);
    }
    
    private void selectItem(int position) {
        mDrawerList.setItemChecked(position, true);
        // setTitle(mMenuTitles[position]);
        // Toast.makeText(this, mTitle, Toast.LENGTH_SHORT).show();
    
        // startMyActivity(position);
        mDrawerLayout.closeDrawer(mDrawerList);
    }
    
    public void startMyActivity(int position) {
    //is overriden in extended activities for being able to send data to another activity
    }
    
    private class DrawerItemClickListener implements ListView.OnItemClickListener {
        @Override
    

    Item is clicked so I set my helper atribute to true.

        public void onItemClick(AdapterView parent, View view, int position, long id) {
            isItemClicked = true;
            selectItem(position);
        }
    }
    
    public void setTitle(CharSequence title) {
        mTitle = title;
        getSupportActionBar().setTitle(mTitle);
    }
    
    @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;
        }
        // Pass the event to ActionBarDrawerToggle, if it returns
        // true, then it has handled the app icon touch event
        if (mDrawerToggle.onOptionsItemSelected(item)) {
            return true;
        }
        return super.onOptionsItemSelected(item);
    }}
    
    0 讨论(0)
  • 2020-12-30 10:53

    The nikis's answer does not cover all cases. If your Fragment or Activity contains map or CameraView it may costs more time. And differences between simple screen and screen with map too big so it's hard to select a good delay.

    The best approach is to send callback to NavigationDrawer from just opened Activity/Fragment in onResume(). Then close drawer in this callback.

    0 讨论(0)
  • 2020-12-30 10:59

    You can open Activity with a delay. For example, in such a way Activity will be started after 250ms:

    new Handler().postDelayed(new Runnable() {
        @Override
        public void run() {
            Intent intent = new Intent(<filter>);
            startActivity(intent);
            finish();
        }
    }, 250);
    mDrawerLayout.closeDrawer(mDrawerList);
    
    0 讨论(0)
提交回复
热议问题