Android - 为多个活动添加导航抽屉

时间:2018-03-26 20:22:39

标签: java android android-activity kotlin navigation-drawer

我是Android / Kotlin的新手,我有一个包含多项活动的应用程序。 到目前为止,我已经创建了所需的所有活动,并且应用程序工作正常,除了现在我需要添加导航抽屉。

来自iOS,我设计了所有布局,以为我可以在以下后添加导航抽屉:

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@color/backgroundColor"
    android:backgroundTint="@color/backgroundColor">

    <RelativeLayout
        android:id="@+id/mainRelativeLayout"
        android:layout_width="match_parent"
        android:layout_height="44dp"
        android:background="@drawable/navbar_border"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent">

        <ImageView
            android:id="@+id/ivNavBarLogo"
            android:layout_width="102dp"
            android:layout_height="24dp"
            android:layout_centerHorizontal="true"
            android:layout_centerVertical="true"
            android:contentDescription="@string/empty_description"
            app:srcCompat="@mipmap/navbar_logo"/>

        <ImageButton
            android:id="@+id/btnSideMenu"
            android:layout_width="25dp"
            android:layout_height="15dp"
            android:layout_centerVertical="true"
            android:layout_marginStart="15dp"
            android:background="@mipmap/sidemenu_button"
            android:contentDescription="@string/empty_description"
            app:srcCompat="@mipmap/sidemenu_button"/>
    </RelativeLayout>

    <!-- STUFF TO BE ADDED THERE -->

</android.support.constraint.ConstraintLayout>

我的目的是创建一个NavigationDrawer活动,并在每个活动上点击btnSideMenu时调用它。

但是,我一直试图绕过这几天,但没有任何运气。我从未想过这样一个基本功能可能如此难以实现。我几乎尝试了这里找到的所有建议和示例,还有:https://developer.android.com/training/implementing-navigation/nav-drawer.html

我认为这个问题是错误的吗?有没有办法这样做而不必根据Android Studio提供的模板或使用片段重新创建我的所有活动?

LE:忘记提及我从所有活动中删除了ActionBar。

2 个答案:

答案 0 :(得分:1)

要将导航抽屉添加到多个活动而不经过并重写每个活动的布局,您可以利用基本活动类和ViewStub标记。

创建这样的布局(稍后我会将其称为navdrawer_activity.xml):

<android.support.v4.widget.DrawerLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:openDrawer="start">

    <ViewStub
        android:id="@+id/navdrawer_stub"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>

    <!-- 
         your drawer here
         you can use android.support.design.widget.NavigationView
         or some other view if you want 
    -->

</android.support.v4.widget.DrawerLayout>

然后为要扩展的所有活动创建一个类:

public class NavDrawerActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        super.setContentView(R.layout.navdrawer_activity);
    }

    @Override
    public final void setContentView(@LayoutRes int layoutResID) {
        ViewStub stub = findViewById(R.id.navdrawer_stub);
        stub.setLayoutResource(layoutResID);
        stub.inflate();
    }

    @Override
    protected void onPostCreate(Bundle savedInstanceState) {
        super.onPostCreate(savedInstanceState);
        // set up nav drawer as normal, using whatever
        // callback methods or helper methods you want
    }
}

有了这些,您唯一需要做的就是更改任何希望导航抽屉扩展NavDrawerActivity而不是AppCompatActivity的活动。

答案 1 :(得分:0)

正如您所包含的指南所说:

<?xml version="1.0" encoding="utf-8"?>
<android.support.v4.widget.DrawerLayout ...>

    <!-- Layout to contain contents of main body of screen (drawer will slide over this) -->
    <content goes here
        ... />

    <!-- Container for contents of drawer -->
    <left pane of drawer goes here
        ...
        android:layout_gravity="start" />

</android.support.v4.widget.DrawerLayout>

您可以将抽屉的左窗格定义为复合视图,将内容定义为复合视图。有点像这样:

your_view.xml

<YourView xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <Button android:id="@+id/..."
        android:layout_width="..."
        android:layout_height="..."
        android:layout_centerInParent="true"/>
</YourView>

public class YourView extends RelativeLayout {
    public YourView(Context context) {
        super(context);
    }

    public YourView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    // ... two more constructors are possible here

    private Button button;

    @Override
    public void onFinishInflate() {
        super.onFinishInflate();
        button = findViewById(R.id.button);
        button.setOnClickListener((view) -> {
            ...
        }
    }
}

您可以对左窗格的视图执行相同的操作。确保将android:layout_gravity="start"作为<YourLeftPane的属性包含在其xml中。

现在你可以在你的activity_whatever.xml

中进行
<?xml version="1.0" encoding="utf-8"?>
<android.support.v4.widget.DrawerLayout ...>

    <include layout="@layout/your_view"/>

    <include layout="@layout/your_left_pane" />

</android.support.v4.widget.DrawerLayout>