Android导航抽屉-Navigation Drawer

简介:

Google今年七月份的时候更新了他们的Google+应用,采用了新的导航方式并抛弃了navigationdrawer。一时之间,又引发了一系列关于NavigationDrawer利弊的讨论,不过对于开发者而言我们只需要管好自己需要实现或者学习的功能的即可,2012年Youtube、Facebook、Path等应用纷纷使用了Navigationdrawer这样的导航方式,去年Google为了整治越来越混的Android,设计出了抽屉导航,开始正题还是关心下如何使用吧:

页面布局

看布局之前看下布局吧,网上常见的一张图片如下,Android官方文档上的一个图片,文章最后会给出链接:

 

 

布局文件代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
<RelativeLayout xmlns:android= "http://schemas.android.com/apk/res/android"
     xmlns:tools= "http://schemas.android.com/tools"
     android:layout_width= "match_parent"
     android:layout_height= "match_parent"
     tools:context= "com.example.naviganationdrawer.MainActivity"  >
 
     <android.support.v4.widget.DrawerLayout
         android:id= "@+id/mDrawerLayout"
         android:layout_width= "match_parent"
         android:layout_height= "match_parent"  >
 
         <FrameLayout
             android:id= "@+id/content_frame"
             android:layout_width= "match_parent"
             android:layout_height= "match_parent"  >
         </FrameLayout>
         <!-- 导航抽屉 -->
 
         <ListView
             android:id= "@+id/left_drawer"
             android:layout_width= "120dp"
             android:layout_height= "match_parent"
             android:layout_gravity= "start"
             android:background= "@android:color/holo_red_light"
             android:choiceMode= "singleChoice"
             android:divider= "@android:color/transparent"
             android:dividerHeight= "0dp"  />
     </android.support.v4.widget.DrawerLayout>
 
</RelativeLayout>

 DrawerLayout 作为界面根控件,在DrawerLayout里面第一个View为当前界面主内容;第二个和第三个View为抽屉菜单内容。如果当前界面只需要一个抽屉菜单,则第三个View可以省略。
显示的主要内容的View必须要是第一个必须为DrawerLayout的第一个子View, 原因在于 XML 布局文件中的View顺序为Android系统中的 z-ordering顺序,而抽屉必须出现在内容之上。

右侧图片的显示是个ImageView,贴下代码:

 

1
2
3
4
5
6
7
8
9
10
11
12
13
<?xml version= "1.0"  encoding= "utf-8" ?>
<FrameLayout xmlns:android= "http://schemas.android.com/apk/res/android"
     android:layout_width= "match_parent"
     android:layout_height= "match_parent"  >
     
     <ImageView
         android:id= "@+id/content_image"
         android:layout_width= "wrap_content"
         android:layout_height= "wrap_content"
         android:src= "@drawable/ic_launcher"
         />
 
</FrameLayout>

 

代码实现

onCreate中的代码实现:

 

1
2
3
4
5
6
7
mPlanetTitles= new  String[]{ "财经" , "科技" };
     mDrawerList = (ListView) findViewById(R.id.left_drawer);
 
     mDrawerList.setAdapter( new  ArrayAdapter<String>( this ,
             android.R.layout.simple_list_item_1, mPlanetTitles));
     mDrawerLayout=(DrawerLayout) findViewById(R.id.mDrawerLayout);
     mDrawerList.setOnItemClickListener( new  DrawerItemClickListener());

 

  页面左侧是ListView,里面的是当用户选择菜单List中的条目时,系统会调用  OnItemClickListener的 onItemClick()函数,点击事件:

1
2
3
4
5
6
private  class  DrawerItemClickListener  implements  ListView.OnItemClickListener {
     @Override
     public  void  onItemClick(AdapterView parent, View view,  int  position,  long  id) {
         selectItem(position);
     }
}

  选中的事件:

1
2
3
4
5
6
7
8
private  void  selectItem( int  position) {
     Fragment fragment =  new  FragmentContent(mImageList[position]);
     getSupportFragmentManager().beginTransaction().replace(R.id.content_frame, fragment)
     .commit();
     mDrawerList.setItemChecked(position,  true );
     setTitle(mPlanetTitles[position]);
     mDrawerLayout.closeDrawer(mDrawerList);
}

 设置标题:

1
2
3
4
5
@Override
public  void  setTitle(CharSequence title) {
     mTitle = title;
     getActionBar().setTitle(mTitle);
}

 右侧显示图片的FragementContent中的代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
public  class  FragmentContent  extends  Fragment {
    
     private  int  resourceId;
 
 
     public  FragmentContent( int  i) {
         // TODO Auto-generated constructor stub
         resourceId=i;
     }
 
     @Override
     public  void  onActivityCreated(Bundle savedInstanceState) {
         // TODO Auto-generated method stub
         super .onActivityCreated(savedInstanceState);
     }
 
     private  View view;
     private  ImageView mImageView;
 
 
     @Override
     public  View onCreateView(LayoutInflater inflater,
              ViewGroup container,  Bundle savedInstanceState) {
         // TODO Auto-generated method stub
          view= inflater.inflate(R.layout.fragmentcontent,  null );
          mImageView = (ImageView)view.findViewById(R.id.content_image);
          mImageView.setImageResource(resourceId);
         return  view;
     }
 
     @Override
     public  void  onCreate(Bundle savedInstanceState) {
         // TODO Auto-generated method stub
         super .onCreate(savedInstanceState);
     }
 
}

  最后看下效果吧:

本文转自Fly_Elephant博客园博客,原文链接:http://www.cnblogs.com/xiaofeixiang/p/4168526.html,如需转载请自行联系原作者

相关文章
|
2月前
|
Android开发
【Android 从入门到出门】第四章:现代Android开发中的导航
【Android 从入门到出门】第四章:现代Android开发中的导航
23 2
【Android 从入门到出门】第四章:现代Android开发中的导航
|
5月前
|
Java 定位技术 Android开发
【Android App】利用腾讯地图获取地点信息和规划导航线路讲解及实战(附源码和演示视频 超详细必看)
【Android App】利用腾讯地图获取地点信息和规划导航线路讲解及实战(附源码和演示视频 超详细必看)
68 1
|
10月前
|
XML 存储 数据可视化
|
12月前
|
XML 移动开发 数据可视化
每日记录自己的Android项目(二)—Viewbinding,WebView,Navigation
今天是想把做一个跳转页面的时候调到H5页面去,但是这个页面我用app来承载,不要调到浏览器去。
142 0
每日记录自己的Android项目(二)—Viewbinding,WebView,Navigation
|
12月前
|
XML Android开发 数据格式
【Android】DrawerLayout抽屉布局的写法
抽屉布局就类似那种侧拉出来的界面。 一个页面想要实现抽屉布局很简单! 这个XML文件包含抽屉布局的代码。
94 0
|
12月前
|
图形学 Android开发
Android Navigation获取栈顶Fragment
由于项目底层是Unity,在上层切换Activity时,下面的unity界面会暂停,界面不能刷新,会有很多问题,于是我们就想到了Activity App,那么就想到了使用JetPack的Navigation来统一管理Fragment之间的跳转。
|
Android开发
android Jetpack Navigation组件——堆栈操作和动画效果
android Jetpack Navigation组件——堆栈操作和动画效果
558 0
android Jetpack Navigation组件——堆栈操作和动画效果
|
XML Android开发 数据格式
Android JetPack 之 Navigation
Android JetPack 之 Navigation
Android JetPack 之 Navigation
|
Shell API 开发工具
Android 13 返回导航大变更:返回键彻底废弃 + 可预见型返回手势(2)
Android 13 返回导航大变更:返回键彻底废弃 + 可预见型返回手势(2)
Android 13 返回导航大变更:返回键彻底废弃 + 可预见型返回手势(2)
|
API 开发工具 Android开发
Android 13 返回导航大变更:返回键彻底废弃 + 可预见型返回手势(1)
Android 13 返回导航大变更:返回键彻底废弃 + 可预见型返回手势(1)
Android 13 返回导航大变更:返回键彻底废弃 + 可预见型返回手势(1)