如何使我的导航抽屉中的菜单可点击以打开新活动
How to make menus in my navigation drawer clickable to open new activities
我们必须在清单文件中进行一些声明。我尝试这样做,但不断出现一些错误。我的应用程序运行正常,但在选择菜单项时,我的应用程序停止了。
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 方法来启动我的新 activity,我又这样做了,但它仍然有同样的问题。
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>
关键是你应该使用片段。您正在做的是打开另一个没有导航抽屉的 activity 和 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
。
祝你好运!
- 在您的
AndroidManifest.xml
中声明 NewActivity
- 不要忘记为
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>
希望对你有所帮助~
我们必须在清单文件中进行一些声明。我尝试这样做,但不断出现一些错误。我的应用程序运行正常,但在选择菜单项时,我的应用程序停止了。
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 方法来启动我的新 activity,我又这样做了,但它仍然有同样的问题。
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>
关键是你应该使用片段。您正在做的是打开另一个没有导航抽屉的 activity 和 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
。
祝你好运!
- 在您的
AndroidManifest.xml
中声明 - 不要忘记为
NewActivity
应用主题AppTheme.NoActionBar
。
NewActivity
更新您的 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>
希望对你有所帮助~