How do I add navigation drawer to my existing code?

前端 未结 3 582
无人及你
无人及你 2020-12-19 02:04

I have an app in which I have a navigation panel with menu buttons on which I want to apply navigation drawer, currently it takes up the entire screen,but I want to restrict

相关标签:
3条回答
  • 2020-12-19 02:49

    This is a good article to follow for adding a navigation drawer: http://developer.android.com/training/implementing-navigation/nav-drawer.html

    Your navigation drawer is showing a blank panel, because the drawer view in your activity_main.xml is a ListView (which you haven't set any data to).

    You want to make this view your fragment.

    Your activity_main.xml file should look like. Make sure to replace the class on the fragment tag to the correct class of your navigation fragment.

    <?xml version="1.0" encoding="utf-8"?>
    <android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:id="@+id/drawer_layout"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:context=".MainActivity" >
    
        <!-- This fragment container is your the place to put your activities content -->
    
        <FrameLayout
            android:id="@+id/fragment_container"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:background="@color/altercolor2" />
    
        <!--
        This is your navigation drawer. You can adjust the width here, but it should
        be between 240dp and 320dp
        -->
    
        <fragment
            android:id="@+id/drawer"
            android:layout_width="240dp"
            android:layout_height="match_parent"
            android:layout_gravity="start"
            class="com.yourapp.NavigationPanelFragment" />
    
    </android.support.v4.widget.DrawerLayout>
    

    Your MainActivity should look something like this:

    public class MainActivity extends AbsBaseaActivity implements OnBackStackChangedListener {
        public static final int REQUEST_CODE_LIST = 100;
    
        private Fragment mDrawer;
        private ActionBarDrawerToggle mDrawerToggle;
        private DrawerLayout mDrawerLayout;
    
        public boolean isNavigationOpen() {
            return mDrawerLayout.isDrawerOpen(mDrawer);
        }
    
        @SuppressWarnings("deprecation")
        public void setNavigationOpen(final boolean isNavigationOpen) {
            final ImageButton mainButton = (ImageButton) findViewById(R.id.button_main);
            if(isNavigationOpen) {
                mainButton.setBackgroundResource(R.drawable.bg_helios_active);
            } else {
                mainButton.setBackgroundDrawable(null);
            }
        }
    
    
    
    
        public static void newInstance(final Activity activity) {
            final Intent intent = new Intent(activity, MainActivity.class);
            activity.startActivity(intent);
        }
    
        @Override
        protected void onCreate(final Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.main_activity);
    
            initiateMainActionBar();
    
            final FragmentManager supportFragmentManager = getSupportFragmentManager();
            supportFragmentManager.addOnBackStackChangedListener(this);
    
    
            if (savedInstanceState == null) {
                mActiveFragment = DashboardFragment.getInstanceWithTransition(supportFragmentManager);
                BangoHelper.onStartSession(this);
    
            } else {
                resetToDashboard(supportFragmentManager);
            }
    
            //setup drawer
    
    
            //this is our drawer layout that contains the navigation drawer and your content
            mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
            //this is the navigation drawer fragment
            mDrawer = (NavigationPanelFragment) findViewById(R.id.drawer);
        }
    
        private void resetToDashboard(final FragmentManager supportFragmentManager) {
            FragmentStackManager.getInstance().clearBackStack(supportFragmentManager);
            mActiveFragment = DashboardFragment.getInstanceWithNoTransition(supportFragmentManager);
        }
    
        private void initiateMainActionBar() {
            final ActionBar actionBar = getSupportActionBar();
            actionBar.setDisplayShowCustomEnabled(true);
            actionBar.setCustomView(R.layout.actionbar_main);
            setupOnClickListenerForSearchButton(this);
            setupOnClickListenerForMainButton();
            setupOnClickListenerForSearchCancelButton(this);
            setupOnClickListenerForSearchClearButton(this);
        }
    
        private void setupOnClickListenerForSearchCancelButton(final MainActivity activity) {
            final Button cancelButton = (Button) findViewById(R.id.button_search_cancel);
            cancelButton.setOnClickListener(new OnClickListener() {
    
                @Override
                public void onClick(final View v) {
                    final View actionBarView = findViewById(R.id.action_bar_container);
                    mIsSearchBarActive = MenuUtils.changeActionBar(activity, actionBarView);
                }
            });
        }
    
    
        private void setupOnClickListenerForMainButton() {
            final ImageButton mainButton = (ImageButton) findViewById(R.id.button_main);
            mainButton.setOnClickListener(new OnClickListener() {
    
                @Override
                public void onClick(final View v) {
                    toggleNavigationPanel();
                }
            });
        }
    
    
        @Override
        public void manageActionBar() {
            setTitle(null);
            getSupportActionBar().setDisplayShowHomeEnabled(false);
        }
    
        @Override
        public boolean onMenuItemSelected(final int featureId, final MenuItem item) {
            switch (item.getItemId()) {
                case android.R.id.home:
                    toggleNavigationPanel();
                    break;
    
                default:
                    break;
            }
            return super.onMenuItemSelected(featureId, item);
        }
    
        @Override
        protected void onResume() {
            final IntentFilter filter = new IntentFilter();
            filter.addAction(BroadcastActions.USER_PROFILE);
            filter.addAction(BroadcastActions.NEWS_IMAGE);
            filter.addAction(BroadcastActions.NEWS_HEADLINES);
    
            registerReceiver(mMainActivityReceiver, filter);
            BangoAgent.onResume();
            super.onResume();
        }
    
        @Override
        protected void onPause() {
            unregisterReceiver(mMainActivityReceiver);
            super.onPause();
            saveTextSize();
        }
    
        private void saveTextSize() {
            final ContentResolver resolver = EikonApplication.getAppContext().getContentResolver();
            final ContentValues contentValues = new ContentValues();
            contentValues.put(GenericColumns.TEXT_SIZE, SharedPreferencesManager.getInstance().getTextSize().ordinal());
    
            SqlArguments argument = SqlArgumentsFactory.generateUserProfileUpdateSqlArguments();
            String where = argument.getWhereClause();
            String[] whereArgs = argument.getWhereArgs();
            resolver.update(UserProfileContentProvider.USER_PROFILE_URI, contentValues, where, whereArgs);
        }
    
        public void pushNewsArticlePagerFragment(final int position, final String selectedCategoryCode, final boolean isMyNews) {
            NewsArticlePagerFragment.newInstance(getSupportFragmentManager(), position, selectedCategoryCode, isMyNews);
        }
    
        public void onDashboardClicked(final View view) {
            toggleNavigationPanel();
    
            if (isFragmentVisible(DashboardFragment.TAG_DASHBOARD_FRAGMENT)) {
                return;
            }
    
            final FragmentManager manager = getSupportFragmentManager();
            final FragmentTransaction transaction = manager.beginTransaction();
            transaction.setCustomAnimations(R.anim.slide_in_from_right, R.anim.slide_out_to_left);
            FragmentStackManager.getInstance().clearBackStack(getSupportFragmentManager());
            mActiveFragment = DashboardFragment.getInstance();
            transaction.hide(mActiveFragment);
            transaction.show(mActiveFragment);
            transaction.commitAllowingStateLoss();
            updateActionBarTitle();
        }
    
        public void onNewsClicked(final View view) {
            if(mIsNavigationOpen) {
                toggleNavigationPanel();
            }
    
            if (isFragmentVisible(NewsFragment.TAG_NEWS_FRAGMENT)) {
                return;
            }
    
            FragmentStackManager.getInstance().clearBackStack(getSupportFragmentManager());
            mActiveFragment = NewsFragment.newInstance(getSupportFragmentManager());
            updateActionBarTitle();
        }
    
        public void onMarketClicked(final View view) {
            if(mIsNavigationOpen) {
                toggleNavigationPanel();
            }
    
            if (isFragmentVisible(MarketsFragment.TAG_MARKETS_FRAGMENT)) {
                return;
            }
    
            FragmentStackManager.getInstance().clearBackStack(getSupportFragmentManager());
            mActiveFragment = MarketsFragment.newInstance(getSupportFragmentManager());
            updateActionBarTitle();
        }
    
        public void onListsClicked(final View view) {
            if(mIsNavigationOpen) {
                toggleNavigationPanel();
            }
    
            if (isFragmentVisible(ListsContainerFragment.TAG_LIST_CONTAINER_FRAGMENT)) {
                return;
            }
    
            FragmentStackManager.getInstance().clearBackStack(getSupportFragmentManager());
            mActiveFragment = ListsContainerFragment.newInstance(getSupportFragmentManager());
            updateActionBarTitle();
        }
    
        public void onBriefcaseClicked(final View view) {
            if(mIsNavigationOpen) {
                toggleNavigationPanel();
            }
    
            if (isFragmentVisible(BriefcaseFragment.TAG_BRIEFCASE_FRAGMENT)) {
                return;
            }
    
            FragmentStackManager.getInstance().clearBackStack(getSupportFragmentManager());
            mActiveFragment = BriefcaseFragment.newInstance(getSupportFragmentManager());
            updateActionBarTitle();
        }
    
        public void onAlertsClicked(final View view) {
            if(mIsNavigationOpen) {
                toggleNavigationPanel();
            }
    
            if (isFragmentVisible(AlertsContainerFragment.TAG_ALERTS_CONTAINER_FRAGMENT)){
                return;
            }
    
            FragmentStackManager.getInstance().clearBackStack(getSupportFragmentManager());
            mActiveFragment = AlertsContainerFragment.newInstance(getSupportFragmentManager());
            updateActionBarTitle();
    
        }
    
        private void toggleNavigationPanel() {
    
        if (mDrawerLayout.isDrawerOpen(mDrawer))
                mDrawerLayout.closeDrawer(mDrawer);
            else mDrawerLayout.openDrawer(mDrawer);
            final FragmentStackManager manager = FragmentStackManager.getInstance();
    
            setNavigationOpen(setNavigationOpen());
        }
    
        public void updateActionBarTitle() {
            final String title = FragmentStackManager.getInstance().getTopTitle();
            final TextView titleView = (TextView) findViewById(R.id.main_title);
            titleView.setText(title);
        }
    
        private boolean isFragmentVisible(final String tag) {
            Fragment fragment = FragmentStackManager.getInstance().getTopFragment();
            return fragment != null && tag.equals(fragment.getTag());
        }
    
        public interface BackPressListener<T extends Fragment> {
            public boolean backPressed(MainActivity fragmentActivity);
        }
    
        private BackPressListener<Fragment> backPressListener = null;
        public void setBackPressListener (final BackPressListener<Fragment> backPressListener) {
                this.backPressListener = backPressListener;
        }
    
    
        @Override
        public void onBackPressed() {
            BangoHelper.eventBack();
            if (backPressListener != null) {
                boolean b = false;
                // Making sure we trigger the backPressed event if the listener is the top fragment
                String bplTag = ((Fragment)backPressListener).getTag();
                Fragment topFragment = FragmentStackManager.getInstance().getTopFragment();
                String topFragemtnTag = "";
                if (topFragment != null) {
                    topFragemtnTag = topFragment.getTag();
                    if (bplTag != null && topFragemtnTag != null && bplTag.equals(topFragemtnTag)) {
                        b = backPressListener.backPressed(this);
                    }
                }
                if (b) {
                    return;
                }
    
            }
    
            if (mIsSearchBarActive) {
                MenuUtils.hideSearchView(this);
                mIsSearchBarActive = false;
            } else if (mIsNavigationOpen) {
                toggleNavigationPanel();
            } else if (!FragmentStackManager.getInstance().popTopFragment()) {
                Intent setIntent = new Intent(Intent.ACTION_MAIN);
                setIntent.addCategory(Intent.CATEGORY_HOME);
                setIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                startActivity(setIntent);
            } else {
                Fragment topFragment = FragmentStackManager.getInstance().getTopFragment();
                if (topFragment == null) {
                    mActiveFragment = DashboardFragment.getInstance();
                    ((DashboardFragment)mActiveFragment).refreshDashboard();
                } else if (topFragment instanceof AbsArticlePagerFragment) {
                    ((AbsArticlePagerFragment) topFragment).forceUpdateTextSize();
                } else if (topFragment instanceof AbsBaseArticleFragment) {
                    ((AbsBaseArticleFragment) topFragment).forceUpdateTextSize();
                }
            }
    
            updateActionBarTitle();
        }
    
    
        public void setActiveFragment(final Fragment fragment) {
            mActiveFragment = fragment;
        }
    
        public void setIsSearchBarActive(final boolean isSearchBarActive){
            mIsSearchBarActive = isSearchBarActive;
        }
    
    
        }
    
        @Override
        public void onActivityResult(int requestCode, int resultCode, Intent data) {
            super.onActivityResult(requestCode, resultCode, data);
            if (requestCode == REQUEST_CODE_LIST) {
                if (resultCode == RESULT_OK) {
                    Fragment fragment = FragmentStackManager.getInstance().getTopFragment();
    
                    if (fragment == null) { // Implies DashboardFragment because dashboard was never added to backstack
                        DashboardFragment.getInstance().onUpdate();
                    } else if (fragment instanceof ListsContainerFragment) {
                        ((ListsContainerFragment) fragment).onUpdate();
                    } else if (fragment instanceof ListDetailsFragment) {
                        ((ListDetailsFragment) fragment).onUpdate(data);
                    }else if (fragment instanceof AlertsContainerFragment) {
                        ((AlertsContainerFragment) fragment).onUpdate();
                    }
                }
            }
        }
    
    
        @Override
        public void refreshScreen() {
            Fragment fragment = FragmentStackManager.getInstance().getTopFragment();
    
            if (fragment == null) { // Implies DashboardFragment
                DashboardFragment.getInstance().refreshScreen();
            } else if (fragment instanceof ListsContainerFragment) {
                ((ListsContainerFragment) fragment).refreshScreen();
            } else if (fragment instanceof ListDetailsFragment) {
                ((ListDetailsFragment) fragment).refreshScreen();
            } else if (fragment instanceof MarketsFragment) {
                ((MarketsFragment) fragment).refreshScreen();
            }
    
        }
    
        @Override
        public void retryLoginDelayedData(){
            LoginFragment f = new LoginFragment();
            f.login("delayed");
        }
    
        @Override
        public void onConfigurationChanged(Configuration newConfig) {
            super.onConfigurationChanged(newConfig);
            FragmentStackManager stackManager = FragmentStackManager.getInstance();
            Fragment topFragment = stackManager.getTopFragment();
            if(topFragment != null){
                if(topFragment instanceof ChartFragment){
                    ChartFragment.replaceInstance(((ChartFragment)topFragment), getSupportFragmentManager(), R.id.fragment_container);
                }
            }
        }
    }
    

    Notice that the state of the navigation drawer is managed by the drawer layout. The DrawerLayout and the drawer fragment is bound up in the onCreate method.

    Refer to the article i mentioned if you run into trouble.

    --- EDIT ----

    Below is an activity I have used in an app. It shows how to add the drawer toggle (the link I posted also shows this).

    You should be able to merge this with your current activity and have a working navigation drawer.

    public class SampleActivity extends AbsBaseaActivity {
    
        private Fragment mDrawer;
        private ActionBarDrawerToggle mDrawerToggle;
        private DrawerLayout mDrawerLayout;
    
        @Override public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity);
    
            getSupportActionBar().setDisplayHomeAsUpEnabled(true);
            getSupportActionBar().setHomeButtonEnabled(true);
    
            mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
            mDrawerMenuItems = getResources().getStringArray(R.array.home_menu_drawer_titles);
            mDrawer = (fragment) findViewById(R.id.drawer);
    
            /* Set up the drawer toggle */
            mDrawerToggle = new ActionBarDrawerToggle(this, mDrawerLayout, R.drawable.ic_drawer, R.string.drawer_open, R.string.drawer_closed) {
    
                /** Called when a drawer has settled in a completely closed state. */
                public void onDrawerClosed(View view) {
                    getActionBar().setTitle(R.string.activity_title);
                }
    
                /** Called when a drawer has settled in a completely open state. */
                public void onDrawerOpened(View drawerView) {
                    getActionBar().setTitle(R.string.app_name);
                }
            };
    
            // Set the drawer toggle as the DrawerListener
            mDrawerLayout.setDrawerListener(mDrawerToggle);
    
        }
    
        /**
         * Backward-compatible version of {@link ActionBar#getThemedContext()} that
         * simply returns the {@link android.app.Activity} if <code>getThemedContext</code> is unavailable.
         */
        @TargetApi(Build.VERSION_CODES.ICE_CREAM_SANDWICH) private Context getActionBarThemedContextCompat() {
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH) {
                return getActionBar().getThemedContext();
            } else {
                return this;
            }
        }
    
        @Override protected void onPostCreate(Bundle savedInstanceState) {
            super.onPostCreate(savedInstanceState);
            mDrawerToggle.syncState();
            mDrawer.setItemChecked(0, true);
        }
    
        @Override public void onConfigurationChanged(Configuration newConfig) {
            super.onConfigurationChanged(newConfig);
            mDrawerToggle.onConfigurationChanged(newConfig);
        }
    
        @Override public boolean onOptionsItemSelected(MenuItem item) {
            switch (item.getItemId()) {
            case android.R.id.home:
                if (mDrawerLayout.isDrawerOpen(mDrawer)) {
                    mDrawerLayout.closeDrawer(mDrawer);
                } else {
                    mDrawerLayout.openDrawer(mDrawer);
                }
                return true;
            }
            return super.onOptionsItemSelected(item);
        }
    }
    

    If you are having errors, then post what the errors are.

    0 讨论(0)
  • 2020-12-19 02:52

    All the answer above are awesome but I found it little bit difficult to add it in my existing code so I have created a new class which uses animation and LayoutInflater to add view and removes the navigation drawer to the activity you can use it in fragment also.

    NavigationDrawer.java

    import android.app.Activity;
    import android.support.constraint.ConstraintLayout;
    import android.util.DisplayMetrics;
    import android.view.LayoutInflater;
    import android.view.animation.Animation;
    import android.view.animation.TranslateAnimation;
    
    import static android.content.Context.LAYOUT_INFLATER_SERVICE;
    
    public class NavigationDrawer {
    
    //State is the visible state
    private Boolean state = false, Transition = false;
    private ConstraintLayout mainView;
    private ConstraintLayout navigationLayout;
    private Animation show, hide;
    
    public NavigationDrawer(Activity activity, ConstraintLayout view) {
    
        this.mainView = view;
    
        LayoutInflater layoutInflater = (LayoutInflater) 
    activity.getSystemService(LAYOUT_INFLATER_SERVICE);
        navigationLayout = (ConstraintLayout) layoutInflater.inflate(R.layout.nav_drawer, 
    mainView, false);
    
        DisplayMetrics displayMetrics = new DisplayMetrics();
        activity.getWindowManager().getDefaultDisplay().getMetrics(displayMetrics);
    
        //Show animation
        show = new TranslateAnimation(-displayMetrics.widthPixels, 0, 0, 0);
        show.setDuration(500);
        show.getFillAfter();
        show.setAnimationListener(new Animation.AnimationListener() {
            @Override
            public void onAnimationStart(Animation animation) {
                Transition = true;
            }
    
            @Override
            public void onAnimationEnd(Animation animation) {
                Transition = false;
                state = true;
            }
    
            @Override
            public void onAnimationRepeat(Animation animation) {
    
            }
        });
    
        //Hide animation
        hide = new TranslateAnimation(0, -displayMetrics.widthPixels, 0, 0);
        hide.setDuration(500);
        hide.getFillAfter();
    
        hide.setAnimationListener(new Animation.AnimationListener() {
            @Override
            public void onAnimationStart(Animation animation) {
                Transition = true;
            }
    
            @Override
            public void onAnimationEnd(Animation animation) {
                Transition = false;
                state = false;
            }
    
            @Override
            public void onAnimationRepeat(Animation animation) {
    
            }
        });
    }
    
    public void toggle() {
        if (!Transition) {
            if (!state) {
                mainView.addView(navigationLayout);
                navigationLayout.startAnimation(show);
            } else {
                navigationLayout.startAnimation(hide);
                mainView.removeView(navigationLayout);
            }
        }
    }
    }
    

    To use this class.

    NavigationDrawer navigationDrawer = new 
    NavigationDrawer(this,user_activity_main_layout);
    
    //To toggle it
    navigationDrawer.toggle();
    

    Here user_activity_main_layout is the Id of root ConstrainLayout you can choose whatever you want. This works perfect.

    0 讨论(0)
  • 2020-12-19 03:05

    U can get source ode for navigation drawer from the link below

    http://hmkcode.com/android-creating-a-navigation-drawer/

    copy this to workspace, or open as a new android project from existing source code.

    right click on project > properties >java buildpath> add external jar> choose latest V13 support library from android sdks installed and in order and export tick the jar v13

    again right click on project > properties >android>choose abs library. [google for library]

    U will get error free working project

    0 讨论(0)
提交回复
热议问题