简体   繁体   English

不同活动的通用导航抽屉

[英]common navigation drawer on different activities

I have built an application with an navigation drawer activity in it but now I want it to be present on my other activities as well.我已经构建了一个带有导航抽屉活动的应用程序,但现在我希望它也出现在我的其他活动中。 I don't want to handle events again and again in different classes.我不想在不同的类中一次又一次地处理事件。

Also I got suggestions like making one base class and extend that but as I cannot extend more than one class.我也得到了一些建议,比如制作一个基类并扩展它,但因为我不能扩展一个以上的类。

Also I also want to use fragments so that I did not have to write the same code again and again My activity_main.xml is like:此外,我还想使用片段,这样我就不必一次又一次地编写相同的代码我的activity_main.xml就像:

<?xml version="1.0" encoding="utf-8"?>
<android.support.v4.widget.DrawerLayout 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:id="@+id/drawer_layout"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:fitsSystemWindows="true"
    tools:openDrawer="start"
    android:background="@color/colorPrimary">

    <include
        layout="@layout/app_bar_main"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

    <android.support.design.widget.NavigationView
        android:id="@+id/nav_view"
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:layout_gravity="start"
        android:fitsSystemWindows="true"
        app:headerLayout="@layout/nav_header_main"
        app:menu="@menu/activity_main_drawer" />
</android.support.v4.widget.DrawerLayout>

nav_header.xml is like: nav_header.xml是这样的:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="@dimen/nav_header_height"
    android:background="@drawable/side_nav_bar"
    android:gravity="bottom"
    android:orientation="vertical"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    android:theme="@style/ThemeOverlay.AppCompat.Dark">

    <ImageView
        android:id="@+id/imageView"
        android:layout_width="72dp"
        android:layout_height="72dp"
        android:paddingTop="@dimen/nav_header_vertical_spacing"
        android:src="@drawable/bcet_logo" />

    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:paddingTop="@dimen/nav_header_vertical_spacing"
        android:text="@string/college_name"
        android:textAppearance="@style/TextAppearance.AppCompat.Body1" />

    <TextView
        android:id="@+id/textView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/college_name_full" />

</LinearLayout>

MainActivity.java : MainActivity.java :

package com.bcetapp.bcetbeta;

import android.content.Intent;
import android.os.Bundle;
import android.support.design.widget.FloatingActionButton;
import android.support.design.widget.Snackbar;
import android.view.View;
import android.support.design.widget.NavigationView;
import android.support.v4.view.GravityCompat;
import android.support.v4.widget.DrawerLayout;
import android.support.v7.app.ActionBarDrawerToggle;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.view.Menu;
import android.view.MenuItem;

public class MainActivity extends AppCompatActivity
        implements NavigationView.OnNavigationItemSelectedListener {
        Intent intent;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);
        getSupportActionBar().setTitle(null);
        FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
        fab.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG)
                        .setAction("Action", null).show();
            }
        });

        DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
        ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(
                this, drawer, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close);
        drawer.setDrawerListener(toggle);
        toggle.syncState();

        NavigationView navigationView = (NavigationView) findViewById(R.id.nav_view);
        navigationView.setNavigationItemSelectedListener(this);
    }

    @Override
    public void onBackPressed() {
        DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
        if (drawer.isDrawerOpen(GravityCompat.START)) {
            drawer.closeDrawer(GravityCompat.START);
        } else {
            super.onBackPressed();
        }
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.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);
    }

    @SuppressWarnings("StatementWithEmptyBody")
    @Override
    public boolean onNavigationItemSelected(MenuItem item) {
        // Handle navigation view item clicks here.
        int id = item.getItemId();

        if (id == R.id.nav_student_list) {
            // Handle the camera action
        } else if (id == R.id.nav_staff_list) {

        } else if (id == R.id.nav_help) {

        } else if (id == R.id.nav_settings) {

        } else if (id == R.id.nav_action_share) {

        } else if (id == R.id.nav_contact_us) {

        }

        DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
        drawer.closeDrawer(GravityCompat.START);
        return true;
    }
    /****************************************************************************************USER DEFINED FUNCTIONS******************************************************************/
    public void viewMyProfile(View view){
        /*intent = new Intent(this, ProfileActivity.class);
        startActivity(intent);*/
    }

}

activity_main_drawer.xml : activity_main_drawer.xml :

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">

    <group android:checkableBehavior="single">
        <item
            android:id="@+id/nav_student_list"
            android:icon="@drawable/ic_group"
            android:title="Students" />
        <item
            android:id="@+id/nav_staff_list"
            android:icon="@drawable/ic_action_glasses"
            android:title=" College Staff" />
        <item
            android:id="@+id/nav_help"
            android:icon="@drawable/ic_action_help"
            android:title="help" />
        <item
            android:id="@+id/nav_settings"
            android:icon="@drawable/ic_menu_manage"
            android:title="Settings" />
    </group>

    <item android:title="More">
        <menu>
            <item
                android:title="About us"
                android:id="@+id/nav_about_us"
                android:icon="@drawable/ic_action_info"
                />
            <item
                android:id="@+id/nav_action_share"
                android:icon="@drawable/ic_action_share"
                android:title="Share App" />
            <item
                android:id="@+id/nav_contact_us"
                android:icon="@drawable/ic_menu_send"
                android:title="contact us" />
        </menu>
    </item>

</menu>

It's not as easy.这并不容易。 There are 2 tech-ticks to achieve it.有 2 个技术滴答来实现它。 One is to create use fragment second one is to add the whole code in all activities.一是创建使用片段,二是在所有活动中添加整个代码。

To achieve your result in above case, Add the fragment in your activity and replace/add activities as your required要在上述情况下实现您的结果,请在您的活动中添加片段并根据需要替换/添加活动

Also i got suggestions like making one base class and extend that but as I cannot extend more than one class.我也得到了一些建议,比如制作一个基类并扩展它,但因为我不能扩展多个类。

True, but the thing about class extension is that you can create a base class that extends AppCompatActivity, and then make your activities extend that base class:没错,但是关于类扩展的事情是您可以创建一个扩展 AppCompatActivity 的基类,然后让您的活动扩展该基类:

public class BaseClass extends AppCompatActivity...
public class MainActivity extends BaseClass...

This will implicitly cause your MainActivity to extend AppCompatActivity.这将隐含地导致您的 MainActivity 扩展 AppCompatActivity。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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