如何使我的导航抽屉中的菜单可单击以打开新活动

时间:2017-04-05 03:16:14

标签: android android-intent navigation android-manifest navigation-drawer

我们必须在清单文件中做出一些声明。我试过这样做,但一直有些错误。我的应用程序正常运行,但在选择菜单项时,我的应用程序停止。

的AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.sachinsharma.nav">

<application
    android:allowBackup="true"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:roundIcon="@mipmap/ic_launcher_round"
    android:supportsRtl="true"
    android:theme="@style/AppTheme">
    <activity
        android:name=".MainActivity"
        android:label="@string/app_name"
        android:theme="@style/AppTheme.NoActionBar">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
</application>

此外,我知道我将不得不使用Intent方法来启动我的新活动,我再次这样做但它仍然遇到同样的问题。

MainActivity.java

package com.example.sachinsharma.nav
import android.app.Fragment;
import android.content.Intent;
import android.os.Bundle;
import android.support.design.widget.FloatingActionButton;
import android.support.design.widget.Snackbar;
import android.app.FragmentTransaction;
import android.util.Log;
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;

import static android.R.attr.value;

public class MainActivity extends AppCompatActivity
        implements NavigationView.OnNavigationItemSelectedListener {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);

        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) {
        int id = item.getItemId();

        if (id == R.id.action_settings) {
            return true;
        }

        return super.onOptionsItemSelected(item);
    }

    private void displaySelectedScreen(int id){

        Fragment fragment = null;
        switch(id) {
            case R.id.nav_dashboard:
                fragment = new FragDashboard();
                break;
            case R.id.nav_attendance:
                fragment = new FragAttendance();
                break;
//            case R.id.nav_homework:
//                break;
//            case R.id.nav_exams:
//                break;
//            case R.id.nav_fee:
//                break;
//            case R.id.nav_notifications:
//                break;
//            case R.id.nav_tracking:
//                break;
//            case R.id.nav_profile:
//                break;
        }

        if(fragment != null){

            FragmentTransaction ft = getFragmentManager().beginTransaction();

            ft.replace(R.id.content_main, fragment);
            ft.commit();

            //this transaction does not replace layouts completely, it just overlaps and the rest
            //of content_main layout can still be seen
        }

        DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
        drawer.closeDrawer(GravityCompat.START);
    }

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

        displaySelectedScreen(id);

        return true;
    }
}

NewActivity.java

package com.example.sachinsharma.nav;

import android.os.Bundle;
import android.os.PersistableBundle;
import android.support.annotation.Nullable;

/**
 * Created by sachinsharma on 4/4/17.
 */

public class NewActivity extends MainActivity{

    @Override
    public void onCreate(@Nullable Bundle savedInstanceState, @Nullable PersistableBundle persistentState) {
        super.onCreate(savedInstanceState, persistentState);
    }
}

以下是抽屉中的菜单项。

action_main_drawer.xml

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


    <item
        android:id="@+id/nav_dashboard"
        android:icon="@mipmap/ic_dashboard_black_24dp"
        android:title="Dashboard" />
    <item
        android:id="@+id/nav_attendance"
        android:icon="@mipmap/ic_watch_later_black_24dp"
        android:title="Attendance" />
    <item
        android:id="@+id/nav_homework"
        android:icon="@mipmap/ic_announcement_black_24dp"
        android:title="Homework" />
    <item
        android:id="@+id/nav_exams"
        android:icon="@mipmap/ic_assignment_black_24dp"
        android:title="Exams" />
    <item
        android:id="@+id/nav_fee"
        android:icon="@drawable/rupee"
        android:title="Fee" />
    <item
        android:id="@+id/nav_notifications"
        android:icon="@mipmap/ic_notifications_active_black_24dp"
        android:title="Notifications" />
    <item
        android:id="@+id/nav_tracking"
        android:icon="@mipmap/ic_directions_bus_black_24dp"
        android:title="Tracking" />
    <item
        android:id="@+id/nav_profile"
        android:icon="@mipmap/ic_account_circle_black_24dp"
        android:title="Profile" />


</menu>

2 个答案:

答案 0 :(得分:0)

问题是你应该使用碎片。你正在做的是打开另一个没有导航抽屉和the fact is you can have only one navigation drawer per activity but multiple fragments per activity and not multiple activities per activity的活动。

尝试使用片段,一切都会正常工作,在应用中有很多活动会使它变得迟钝,用户很可能会删除你的应用。

更多信息让我知道,for the code just create new project in android studio and select navigation drawer activity over there and create your project after that read the code you will get the concept of fragments

最好的运气!

答案 1 :(得分:0)

  1. NewActivity
  2. 中声明AndroidManifest.xml
  3. 不要忘记为AppTheme.NoActionBar应用主题NewActivity
  4. 更新AndroidMenifest.xml,如下所示:

    <?xml version="1.0" encoding="utf-8"?>
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
        package="com.example.sachinsharma.nav">
    
        <application
            android:allowBackup="true"
            android:icon="@mipmap/ic_launcher"
            android:label="@string/app_name"
            android:roundIcon="@mipmap/ic_launcher_round"
            android:supportsRtl="true"
            android:theme="@style/AppTheme">
    
            <activity
                android:name=".MainActivity"
                android:label="@string/app_name"
                android:theme="@style/AppTheme.NoActionBar">
                <intent-filter>
                    <action android:name="android.intent.action.MAIN" />
    
                    <category android:name="android.intent.category.LAUNCHER" />
                </intent-filter>
            </activity>
    
            <activity 
                android:name=".NewActivity"
                android:theme="@style/AppTheme.NoActionBar">
            </activity>
    
        </application>
    </manifest>
    

    希望这会有所帮助〜