Java 将导航抽屉添加到现有活动

Java 将导航抽屉添加到现有活动,java,android,navigation-drawer,Java,Android,Navigation Drawer,我有一个我正在编写的应用程序,它已经包含了很多代码,我决定要在主活动工具栏上添加一个导航抽屉,但我不知道如何在不创建新的导航抽屉项目并将我的整个项目复制到其中的情况下完成它,这似乎需要做很多工作,是否有向现有项目添加导航抽屉的教程?最简单的方法是使用库 它非常容易实现,而且非常灵活 如果你想自己做,考虑阅读官方关于创建导航抽屉。 < p>创建布局 LayOutLeftx菜单.XML: <?xml version="1.0" encoding="utf-8"?> <Relativ

我有一个我正在编写的应用程序,它已经包含了很多代码,我决定要在主活动工具栏上添加一个导航抽屉,但我不知道如何在不创建新的导航抽屉项目并将我的整个项目复制到其中的情况下完成它,这似乎需要做很多工作,是否有向现有项目添加导航抽屉的教程?

最简单的方法是使用库

它非常容易实现,而且非常灵活


如果你想自己做,考虑阅读官方关于创建导航抽屉。

< p>创建布局<强> LayOutLeftx菜单.XML:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/bgLeftMenu">

<ImageView android:id="@+id/header"
    android:src="@drawable/ic_launcher"
    android:layout_width="48dp"
    android:layout_height="48dp"
    android:layout_marginTop="26dp"
    android:layout_marginBottom="8dp"
    android:layout_marginLeft="30dp"
    android:layout_marginStart="40dp"/>

<RelativeLayout
    android:layout_width="wrap_content"
    android:layout_height="48dp"
    android:layout_marginTop="26dp"
    android:layout_marginLeft="10dp"
    android:layout_toRightOf="@id/header">

    <LinearLayout
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:orientation="vertical"
        android:layout_centerInParent="true">
        <TextView
            android:id="@+id/userName"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@string/app_name"
            android:textColor="@color/pressed"/>
        <TextView
            android:id="@+id/userEmail"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@string/app_name"
            android:layout_below="@id/userName"
            android:layout_centerInParent="true"
            android:textColor="@color/pressed"
            android:visibility="gone"/>
    </LinearLayout>
</RelativeLayout>

<ListView android:id="@+id/menu_items_list"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_below="@id/header"
    android:dividerHeight="0dp"
    android:divider="@null"
    android:background="@color/bgLeftMenu"/>

<ProgressBar android:id="@+id/progress"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_centerInParent="true"
    android:visibility="gone"/>

</RelativeLayout>
设置onclick侦听器。您可以根据id执行以下操作:

mLeftMenuView.setmListener(new OnClickMenu() {
        @Override
        public void onClick(String id) {
            Log.d("MENU", "ic_menu_hamburger clicked: " + id);

            closeDrawer(null);

            if (id.equals(getString(R.string.settings_id))) {
                Intent intent = new Intent(MainActivity.this,
                        SettingsActivity.class);
                MainActivity.this.startActivity(intent);
            } else if (id.equals(getString(R.string.exit_id))) {
                // salir
                showRateDialogBeforeExit();
            }

        }
    });
我已在单击菜单时创建了自己的界面:

public interface OnClickMenu {

   void onClick(String id);

}
并添加从菜单图标打开抽屉的操作:

@Override
public void onBackPressed() {
    if((mDrawerLayout) != null && (mDrawerLayout.isDrawerOpen(GravityCompat.START)))
        closeDrawer(null);
    else {
        super.onBackPressed();
    }
}

public void closeDrawer(DrawerLayout.DrawerListener listener) {
    mDrawerLayout.setDrawerListener(listener);
    mDrawerLayout.closeDrawers();
}

public void openDrawer() {
    mDrawerLayout.setDrawerListener(null);
    mDrawerLayout.openDrawer(GravityCompat.START);
}
菜单:

添加到app build.gradle

compile 'com.android.support:design:26.0.0'
compile 'com.jakewharton:butterknife:8.6.0'

将所有@Bind更改为@BindView

我已经尝试了MaterialDrawer库,正如@yury dombaev所建议的,我不得不承认它比官方导航抽屉更容易实现

可以使用Android X依赖项或普通依赖项实现

在我的情况下,因为我有正常的,我必须坚持使用MaterialDrawer 6.0.9v。虽然有一个迁移指南,我会看一看

要在当前活动中实现库,请执行以下操作:

  • 在app build.gradle中添加依赖项,如库的v 6.0.9的设置1中所述:
  • 活动的
    onCreate
    ()方法中添加抽屉:
    新建抽屉生成器().withActivity(this.build()
  • 现在你有了一个基本的(无用的)横向菜单。因此,您应该继续阅读Material Drawer文档并添加菜单元素:)

  • 为什么会被否决?完全正确的问题。@PrimožKralj也是我的问题。很抱歉,在我开始修改活动时,我已将自定义视图的名称从SimpleLeftMenuView更改为LeftMenuView。我刚刚编辑了代码单击按钮时如何显示和隐藏抽屉?在我的回答的第二步,存储调用build方法的结果,然后调用
    openDrawer()
    closeDrawer()
    方法
    mLeftMenuView.setmListener(new OnClickMenu() {
            @Override
            public void onClick(String id) {
                Log.d("MENU", "ic_menu_hamburger clicked: " + id);
    
                closeDrawer(null);
    
                if (id.equals(getString(R.string.settings_id))) {
                    Intent intent = new Intent(MainActivity.this,
                            SettingsActivity.class);
                    MainActivity.this.startActivity(intent);
                } else if (id.equals(getString(R.string.exit_id))) {
                    // salir
                    showRateDialogBeforeExit();
                }
    
            }
        });
    
    public interface OnClickMenu {
    
       void onClick(String id);
    
    }
    
    @Override
    public void onBackPressed() {
        if((mDrawerLayout) != null && (mDrawerLayout.isDrawerOpen(GravityCompat.START)))
            closeDrawer(null);
        else {
            super.onBackPressed();
        }
    }
    
    public void closeDrawer(DrawerLayout.DrawerListener listener) {
        mDrawerLayout.setDrawerListener(listener);
        mDrawerLayout.closeDrawers();
    }
    
    public void openDrawer() {
        mDrawerLayout.setDrawerListener(null);
        mDrawerLayout.openDrawer(GravityCompat.START);
    }
    
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
    
        getMenuInflater().inflate(R.menu.menu_home, menu);
    
        return true;
    }
    
    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
            case android.R.id.home:
                openDrawer();
                return true;
        }
        return super.onOptionsItemSelected(item);
    }
    
    compile 'com.android.support:design:26.0.0'
    compile 'com.jakewharton:butterknife:8.6.0'