是否可以在 android 中使用导航抽屉,而不是更新片段,我想在活动之间切换作为我在应用程序中的导航方式。
5 回答
是的,这是可能的——这就是我为我的应用程序所做的。我已经设置了许多活动,而不是将它们全部转换为片段,我想定制导航抽屉以在所有这些活动中工作。不幸的是,这不是一个快速的解决方法,所以如果你可以选择使用片段,我会同意的。但不管我是怎么做的:
假设我有 2 个活动,我希望这两个活动都有导航抽屉。在每个的 layout.xml 中,我指定了一个DrawerLayout
适当ListView
的来保存我的导航选项。本质上,导航抽屉是每次我在活动之间切换时创建的,看起来它是持久的。为了让生活更轻松,我采用了设置导航抽屉所需的常用方法并将它们放在自己的类中:NavigationDrawerSetup.java
. 这样我的活动可以使用相同的自定义适配器等。
在这NavigationDrawerSetup.java
堂课中,我有以下内容:
configureDrawer()
- 这将设置ActionBar
、ActionBarDrawerToggle
和所需的侦听器- 我的自定义数组适配器(用于填充列表中的导航选项)
selectOptions()
处理抽屉项目点击的方法
当您在其中一个活动中设置导航抽屉时,您只需创建一个新NavigationDrawerSetup
对象并传入所需的布局参数(如DrawerLayout
等ListView
)。然后你会打电话configureDrawer()
:
navigationDrawer = new NavigationDrawerSetup(mDrawerView, mDrawerLayout,
mDrawerList, actionBar, mNavOptions, currentActivity);
navigationDrawer.configureDrawer();
currentActivity
被传入,因为导航抽屉与您正在进行的活动相关联。设置时必须使用它ActionBarDrawerToggle
:
mDrawerToggle = new ActionBarDrawerToggle(currentActivity, // host Activity
mDrawerLayout, /* DrawerLayout object */
R.drawable.ic_drawer, /* nav drawer image to replace 'Up' caret */
R.string.drawer_open, /* "open drawer" description for accessibility */
R.string.drawer_close /* "close drawer" description for accessibility */
)
您还需要currentActivity
在设置自定义时使用Adapter
:
至于如何通过导航抽屉在活动之间切换,您可以在您的 selectItem() 方法中设置新的意图:
private void selectItem(int position) {
// Handle Navigation Options
Intent intent;
switch (position) {
case 0:
intent = new Intent(currentActivity, NewActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
currentActivity.startActivity(intent);
break;
case 1:
// etc.
}
只要确保您的新Activity
设备也有导航抽屉设置并且它应该显示。
您可以做很多事情来根据自己的需要自定义此方法,但这是我如何做到这一点的一般结构。希望这可以帮助!
你需要一个BaseDrawerActivity
实现导航抽屉然后BaseDrawerActivity
在你需要导航抽屉的每个活动中扩展。
首先创建BaseDrawerActivity.java
:
public class BaseDrawerActivity extends AppCompatActivity implements NavigationView.OnNavigationItemSelectedListener{
DrawerLayout drawerLayout;
Toolbar toolbar;
FrameLayout frameLayout;
NavigationView navigationView;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
super.setContentView(R.layout.activity_base_drawer);;
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
frameLayout = (FrameLayout) findViewById(R.id.content_frame);
drawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(
this, drawerLayout, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close);
drawerLayout.setDrawerListener(toggle);
toggle.syncState();
navigationView = (NavigationView) findViewById(R.id.nav_view);
navigationView.setNavigationItemSelectedListener(this);
}
@Override
public void onBackPressed() {
if (drawerLayout.isDrawerOpen(GravityCompat.START)) {
drawerLayout.closeDrawer(GravityCompat.START);
} else {
super.onBackPressed();
}
}
@Override
public boolean onNavigationItemSelected(MenuItem item) {
int id = item.getItemId();
//to prevent current item select over and over
if (item.isChecked()){
drawerLayout.closeDrawer(GravityCompat.START);
return false;
}
if (id == R.id.nav_camera) {
// Handle the camera action
startActivity(new Intent(getApplicationContext(), CameraActivity.class));
} else if (id == R.id.nav_gallery) {
startActivity(new Intent(getApplicationContext(), GalleryActivity.class));
} else if (id == R.id.nav_slideshow) {
startActivity(new Intent(getApplicationContext(), SlideshowActivity.class));
} else if (id == R.id.nav_manage) {
startActivity(new Intent(getApplicationContext(), ManageActivity.class));
} else if (id == R.id.nav_share) {
startActivity(new Intent(getApplicationContext(), ShareActivity.class));
} else if (id == R.id.nav_send) {
startActivity(new Intent(getApplicationContext(), SendActivity.class));
}
drawerLayout.closeDrawer(GravityCompat.START);
return true;
}
}
然后activity_base_drawer.xml
在res/layout
文件夹中创建:
<?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"
tools:openDrawer="start">
<include layout="@layout/app_bar_home"/>
<android.support.design.widget.NavigationView
android:id="@+id/nav_view"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_gravity="start"
app:headerLayout="@layout/nav_header_home"
app:menu="@menu/activity_home_drawer" />
</android.support.v4.widget.DrawerLayout>
哪里@layout/app_bar_home
是:
<?xml version="1.0" encoding="utf-8"?>
<android.support.design.widget.CoordinatorLayout 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:fitsSystemWindows="true">
<android.support.design.widget.AppBarLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:theme="@style/AppTheme.AppBarOverlay">
<android.support.v7.widget.Toolbar
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
android:background="?attr/colorPrimary"
app:popupTheme="@style/AppTheme.PopupOverlay" />
</android.support.design.widget.AppBarLayout>
<FrameLayout android:id="@+id/content_frame"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</android.support.design.widget.CoordinatorLayout>
接下来,您输入将具有导航抽屉的活动,例如CameraActivity.java
:
public class CameraActivity extends BaseDrawerActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
getLayoutInflater().inflate(R.layout.activity_camera, frameLayout);
/**
* Setting title
*/
setTitle("Camera");
}
@Override
protected void onResume() {
super.onResume();
// to check current activity in the navigation drawer
navigationView.getMenu().getItem(0).setChecked(true);
}
}
R.layout.activity_camera
你的布局在哪里CameraActivity.java
。
然后创建其他 ActivityGalleryActivity.java
之类的将具有导航抽屉:
public class GalleryActivity extends BaseDrawerActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
getLayoutInflater().inflate(R.layout.activity_gallery, frameLayout);
// Setting title
setTitle("Gallery");
}
@Override
protected void onResume() {
super.onResume();
navigationView.getMenu().getItem(1).setChecked(true);
}
}
作为对@David-Crozier 指出的解决方案的一点改进,为了避免两个动画的重叠(关闭 NavigationDrawer 并开始一个新活动),您可以在您的方法中包含一点延迟,就像在 iosched 应用程序中所做的那样v2014:
private void onNavDrawerItemClicked(final int itemId) {
if (itemId == getSelfNavDrawerItem()) {
mDrawerLayout.closeDrawer(GravityCompat.START);
return;
}
if (isSpecialItem(itemId)) {
goToNavDrawerItem(itemId);
} else {
// launch the target Activity after a short delay, to allow the close animation to play
mHandler.postDelayed(new Runnable() {
@Override
public void run() {
goToNavDrawerItem(itemId);
}
}, NAVDRAWER_LAUNCH_DELAY);
// change the active item on the list so the user can see the item changed
setSelectedNavDrawerItem(itemId);
// fade out the main content
View mainContent = findViewById(R.id.main_content);
if (mainContent != null) {
mainContent.animate().alpha(0).setDuration(MAIN_CONTENT_FADEOUT_DURATION);
}
}
mDrawerLayout.closeDrawer(GravityCompat.START);
}
如帖子中所述,可以更换片段管理器:
https://guides.codepath.com/android/fragment-navigation-drawer#alternative-to-fragments
您可以扩展布局而不是使用片段管理器。
在您的 mobile_navigation 文件 XML 中。添加以下内容。
<activity
android:id="@+id/nav_custom"
android:name="net.larntech.nav.CustomActivity"
android:label="@string/menu_custom"
tools:layout="@layout/activity_custom"
/>
您可以使用下面的链接找到完整的教程。 Android Studio 导航抽屉