【问题标题】:How to make menus in my navigation drawer clickable to open new activities如何使我的导航抽屉中的菜单可点击以打开新活动
【发布时间】:2017-04-05 03:16:13
【问题描述】:

我们必须在清单文件中进行一些声明。我尝试这样做,但不断收到一些错误。我的应用程序运行正常,但在选择菜单项时,我的应用程序停止了。

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>

【问题讨论】:

  • 请帮帮我。因为我是安卓新手。
  • 能否发布错误日志?
  • 如果您使用的是 NavigationDrawer,我建议您使用片段并将它们切换出来。这是一个参考链接:androidhive.info/2013/11/…

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


【解决方案1】:

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

尝试使用 Fragments,一切都会正常运行,而且应用中存在大量活动会使其滞后,用户很可能会删除您的应用。

还有什么让我知道,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

祝你好运!

【讨论】:

  • 我使用片段更新了我的代码,但现在菜单的布局已经超过了现有的布局,而且还不够完整。请检查 MainActivity.java 代码。如果您需要更多详细信息,请询问。
  • 我使用片段更新了我的代码,但现在菜单的布局已经超过了现有的布局,而且还不够完整。请检查 MainActivity.java,nav_dashboard.xml 有一个带有文本仪表板的文本视图,它与启动器活动的元素一起出现,而不是完全替换它们。
  • 我认为您没有创建带导航的演示项目。事情是在您的 mainactivity xml 文件中,将包含内容 xml 文件,该文件负责替换不同的片段
【解决方案2】:
  1. 在您的AndroidManifest.xml 中声明NewActivity
  2. 别忘了为NewActivity 应用主题AppTheme.NoActionBar

更新您的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>

希望对你有帮助~

【讨论】:

  • 我尝试这样做,但我的应用程序在选择菜单时不断崩溃。知道为什么会发生吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多