Lit*_*Dev 46 android navigation-drawer
是否可以在Android中使用导航抽屉,但不是更新片段,我想在应用程序中切换活动作为我的导航方式.
Dav*_*ier 49
是的,这是可能的 - 这就是我为我的应用所做的.我已经设置了许多活动,而不是将它们全部转换为碎片,我想要定制导航抽屉以适应所有这些活动.不幸的是,这不是一个快速的解决方法,所以如果您可以选择使用片段,我会继续使用它.但不管这是我怎么做的:
假设我有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();
Run Code Online (Sandbox Code Playgroud)
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 */
)
Run Code Online (Sandbox Code Playgroud)
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.
}
Run Code Online (Sandbox Code Playgroud)
只需确保您的新设备Activity也有导航抽屉设置,它应该显示.
你可以做很多事情来根据自己的需要定制这个方法,但这是我如何做到这一点的一般结构.希望这可以帮助!
kaz*_*mun 15
您需要一个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;
}
}
Run Code Online (Sandbox Code Playgroud)
然后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>
Run Code Online (Sandbox Code Playgroud)
在哪里@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>
Run Code Online (Sandbox Code Playgroud)
接下来,输入将具有导航抽屉的活动,例如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);
}
}
Run Code Online (Sandbox Code Playgroud)
R.layout.activity_camera你的布局在哪里CameraActivity.java.
然后创建其他类似于Activity的GalleryActivity.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);
}
}
Run Code Online (Sandbox Code Playgroud)