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,如需转载请自行联系原作者

相关文章
|
4月前
|
Android开发 Kotlin
kotlin开发安卓app,如何让布局自适应系统传统导航和全面屏导航
使用`navigationBarsPadding()`修饰符实现界面自适应,自动处理底部导航栏的内边距,再加上`.padding(bottom = 10.dp)`设定内容与屏幕底部的距离,以完成全面的布局适配。示例代码采用Kotlin。
130 15
|
6月前
|
Java Android开发
Android 导航方式切换
Android 导航方式切换
138 1
|
6月前
|
Java Android开发 Kotlin
Android Dialog 弹出时,隐藏 navigation bar
Android Dialog 弹出时,隐藏 navigation bar
123 1
|
6月前
|
Android开发
【Android 从入门到出门】第四章:现代Android开发中的导航
【Android 从入门到出门】第四章:现代Android开发中的导航
44 2
【Android 从入门到出门】第四章:现代Android开发中的导航
|
6月前
|
Java 定位技术 Android开发
【Android App】利用腾讯地图获取地点信息和规划导航线路讲解及实战(附源码和演示视频 超详细必看)
【Android App】利用腾讯地图获取地点信息和规划导航线路讲解及实战(附源码和演示视频 超详细必看)
390 1
|
6月前
|
XML Java 定位技术
【Android App】定位导航GPS中开启手机定位功能讲解及实战(附源码和演示 超详细)
【Android App】定位导航GPS中开启手机定位功能讲解及实战(附源码和演示 超详细)
302 0
|
XML 移动开发 数据可视化
每日记录自己的Android项目(二)—Viewbinding,WebView,Navigation
今天是想把做一个跳转页面的时候调到H5页面去,但是这个页面我用app来承载,不要调到浏览器去。
192 0
每日记录自己的Android项目(二)—Viewbinding,WebView,Navigation
|
存储 Android开发
android ViewPager + Fragment + Tablayout 实现嵌套页面导航(二)
android ViewPager + Fragment + Tablayout 实现嵌套页面导航
android ViewPager + Fragment + Tablayout 实现嵌套页面导航(二)
|
XML Android开发 数据格式
【Android】DrawerLayout抽屉布局的写法
抽屉布局就类似那种侧拉出来的界面。 一个页面想要实现抽屉布局很简单! 这个XML文件包含抽屉布局的代码。
138 0