2013-10-18 78 views
42

是否有可能在android中使用导航抽屉,而不是更新片段,我想在应用程序内作为我的导航方式在活动之间切换。导航抽屉切换活动,而不是片段

+0

你想要什么? –

+0

我想要的是使用一个导航抽屉,它可以用于我所有的活动来切换活动。 –

+0

你能告诉我你的设计吗?为什么你只需要导航抽屉? –

回答

43

是的,这是可能的 - 这是我为我的应用程序做的。我已经完成了一些活动,而不是将它们全部转换为碎片,我想调整导航抽屉以适用于所有这些活动。不幸的是,这不是一个快速的解决方法,所以如果你有使用碎片的选择,我会去那里。但不管我是怎么做到的:

比方说,我有2个活动,我想要两个导航抽屉。在每个版本的layout.xml中,我指定DrawerLayout和适当的ListView来保存我的导航选项。实质上,每次在活动之间切换时都会创建导航抽屉,从而使外观保持不变。为了让生活变得更轻松,我采用了设置导航抽屉并将它们放入自己的班级所需的常用方法:NavigationDrawerSetup.java。这样,我的活动,可以使用相同的自定义适配器等

在这个NavigationDrawerSetup.java类,我有以下几点:

  • configureDrawer() - 这树立ActionBarActionBarDrawerToggle,以及所需的听众
  • 我的自定义阵列适配器(用于填充列表中的导航选项)
  • selectOptions()方法,该方法处理抽屉项目点击

当您在其中一项活动中设置导航抽屉时,只需创建一个新的NavigationDrawerSetup对象并传递所需的布局参数(如DrawerLayout,ListView等)。然后你会打电话configureDrawer()

 navigationDrawer = new NavigationDrawerSetup(mDrawerView, mDrawerLayout, 
      mDrawerList, actionBar, mNavOptions, currentActivity); 

    navigationDrawer.configureDrawer(); 

currentActivity由于导航抽屉被绑定到你的活动传递英寸您将有当您设置ActionBarDrawerToggle使用它:

​​

您还需要使用currentActivity设置自定义Adapter时:

至于如何通过导航抽屉活动之间进行切换,你可以建立新的意图你的选择信息()方法中:

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也有抽屉式导航栏的设置,它应该显示。

有很多事情可以根据自己的需要来定制这种方法,但这是我如何做到的一般结构。希望这可以帮助!

+1

稍后会检查,因为它似乎是一个很好的建议。当涉及新片段的过渡动画时,可能很难仿效使用带有片段的导航抽屉,因为去新的活动看起来不同于加载新的片段。 –

+14

你是如何管理活动堆栈的? – AKh

+0

@David Crozier你在那里?我得到Stucked创建一个导航抽屉,如果你想要,我可以告诉你我的代码 – bipin

2

作为@ 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://github.com/google/iosched/blob/master/android/src/main/java/com/google/samples/apps/iosched/ui/BaseActivity.java

8

你需要一个BaseDrawerActivity实现了这个抽屉式导航然后在每个需要抽屉式导航活动延长BaseDrawerActivity

首先创建BaseDrawerActivity.java

​​

然后在res/layout文件夹中创建activity_base_drawer.xml

<?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布局。

然后创建其他活动一样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); 
    } 
} 
+1

你如何管理活动堆栈...所有的活动将保持堆栈。当你按下返回按钮时,所有的活动都会一一关闭 –

+1

你是如何初始化frameLayout的? (关于行:getLayoutInflater()。inflate(R.layout.activity_gallery,frameLayout);) –