Java学习者论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

手机号码,快捷登录

恭喜Java学习者论坛(https://www.javaxxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,购买链接:点击进入购买VIP会员
JAVA高级面试进阶视频教程Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程

Go语言视频零基础入门到精通

Java架构师3期(课件+源码)

Java开发全终端实战租房项目视频教程

SpringBoot2.X入门到高级使用教程

大数据培训第六期全套视频教程

深度学习(CNN RNN GAN)算法原理

Java亿级流量电商系统视频教程

互联网架构师视频教程

年薪50万Spark2.0从入门到精通

年薪50万!人工智能学习路线教程

年薪50万!大数据从入门到精通学习路线年薪50万!机器学习入门到精通视频教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程 MySQL入门到精通教程
查看: 501|回复: 0

[默认分类] Android 抽屉效果的导航菜单实现

[复制链接]
  • TA的每日心情
    开心
    2021-12-13 21:45
  • 签到天数: 15 天

    [LV.4]偶尔看看III

    发表于 2018-7-10 13:42:53 | 显示全部楼层 |阅读模式

    Android 抽屉效果的导航菜单实现

    抽屉效果的导航菜单
      看了很多应用,觉得这种侧滑的抽屉效果的菜单很好。

      不用切换到另一个页面,也不用去按菜单的硬件按钮,直接在界面上一个按钮点击,菜单就滑出来,而且感觉能放很多东西。

      关于实现,搜索了一下,有如下两种:
      1.用SlidingDrawer:
      http://developer.android.com/reference/android/widget/SlidingDrawer.html
      但是不知道为什么这个类官方不建议再继续用了:
      Deprecated since API level 17
      2.用DrawerLayout:
      http://developer.android.com/reference/android/support/v4/widget/DrawerLayout.html
      Guide在这里:
      http://developer.android.com/training/implementing-navigation/nav-drawer.html

    库的引用
      首先,
    1. [b][url=http://developer.android.com/reference/android/support/v4/widget/DrawerLayout.html]DrawerLayout[/url][/b]
    复制代码
    这个类是在Support Library里的,需要加上android-support-v4.jar这个包。
      然后程序中用时在前面导入import android.support.v4.widget.DrawerLayout;
      如果找不到这个类,首先用SDK Manager更新一下Android Support Library,然后在Android SDK\extras\android\support\v4路径下找到android-support-v4.jar,复制到项目的libs路径,将其Add to Build Path.

    代码1
      布局:

    1. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    2.     xmlns:tools="http://schemas.android.com/tools"
    3.     android:layout_width="match_parent"
    4.     android:layout_height="match_parent" >
    5.     <android.support.v4.widget.DrawerLayout
    6.         xmlns:android="http://schemas.android.com/apk/res/android"
    7.         android:id="@+id/drawer_layout"
    8.         android:layout_width="match_parent"
    9.         android:layout_height="match_parent" >
    10.         <!-- The main content view -->
    11.         <!-- main content must be the first element of DrawerLayout because it will be drawn first and drawer must be on top of it -->
    12.         <FrameLayout
    13.             android:id="@+id/content_frame"
    14.             android:layout_width="match_parent"
    15.             android:layout_height="match_parent" />
    16.         <!-- The navigation drawer -->
    17.         <ListView
    18.             android:id="@+id/left_drawer"
    19.             android:layout_width="240dp"
    20.             android:layout_height="match_parent"
    21.             android:layout_gravity="left"
    22.             android:background="#111"
    23.             android:choiceMode="singleChoice"
    24.             android:divider="@android:color/transparent"
    25.             android:dividerHeight="0dp" />
    26.     </android.support.v4.widget.DrawerLayout>
    27. </RelativeLayout>
    复制代码

     
      DrawerLayout的第一个子元素是主要内容,即抽屉没有打开时显示的布局。这里采用了一个FrameLayout,里面什么也没放。
      DrawerLayout的第二个子元素是抽屉中的内容,即抽屉布局,这里采用了一个ListView。


      主要的Activity(从官方实例中扒出来的):


    1. package com.example.hellodrawer;
    2. import android.os.Bundle;
    3. import android.app.Activity;
    4. import android.content.res.Configuration;
    5. import android.view.MenuItem;
    6. import android.view.View;
    7. import android.widget.AdapterView;
    8. import android.widget.AdapterView.OnItemClickListener;
    9. import android.widget.ArrayAdapter;
    10. import android.widget.ListView;
    11. import android.support.v4.app.ActionBarDrawerToggle;
    12. import android.support.v4.view.GravityCompat;
    13. import android.support.v4.widget.DrawerLayout;
    14. public class HelloDrawerActivity extends Activity
    15. {
    16.     private String[] mPlanetTitles;
    17.     private DrawerLayout mDrawerLayout;
    18.     private ActionBarDrawerToggle mDrawerToggle;
    19.     private ListView mDrawerList;
    20.     @Override
    21.     public void onCreate(Bundle savedInstanceState)
    22.     {
    23.         super.onCreate(savedInstanceState);
    24.         setContentView(R.layout.activity_hello_drawer);
    25.         mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
    26.         // init the ListView and Adapter, nothing new
    27.         initListView();
    28.         // set a custom shadow that overlays the main content when the drawer
    29.         // opens
    30.         mDrawerLayout.setDrawerShadow(R.drawable.drawer_shadow,
    31.                 GravityCompat.START);
    32.         mDrawerToggle = new ActionBarDrawerToggle(this, mDrawerLayout,
    33.                 R.drawable.ic_drawer, R.string.drawer_open,
    34.                 R.string.drawer_close)
    35.         {
    36.             /** Called when a drawer has settled in a completely closed state. */
    37.             public void onDrawerClosed(View view)
    38.             {
    39.                 invalidateOptionsMenu(); // creates call to
    40.                                             // onPrepareOptionsMenu()
    41.             }
    42.             /** Called when a drawer has settled in a completely open state. */
    43.             public void onDrawerOpened(View drawerView)
    44.             {
    45.                 invalidateOptionsMenu(); // creates call to
    46.                                             // onPrepareOptionsMenu()
    47.             }
    48.         };
    49.         // Set the drawer toggle as the DrawerListener
    50.         mDrawerLayout.setDrawerListener(mDrawerToggle);
    51.         // enable ActionBar app icon to behave as action to toggle nav drawer
    52.         getActionBar().setDisplayHomeAsUpEnabled(true);
    53.         // getActionBar().setHomeButtonEnabled(true);
    54.         // Note: getActionBar() Added in API level 11
    55.     }
    56.     private void initListView()
    57.     {
    58.         mDrawerList = (ListView) findViewById(R.id.left_drawer);
    59.         mPlanetTitles = getResources().getStringArray(R.array.planets_array);
    60.         // Set the adapter for the list view
    61.         mDrawerList.setAdapter(new ArrayAdapter<String>(this,
    62.                 R.layout.list_item, mPlanetTitles));
    63.         // Set the list"s click listener
    64.         mDrawerList.setOnItemClickListener(new OnItemClickListener()
    65.         {
    66.             @Override
    67.             public void onItemClick(AdapterView<?> parent, View view,
    68.                     int position, long id)
    69.             {
    70.                 // Highlight the selected item, update the title, and close the
    71.                 // drawer
    72.                 mDrawerList.setItemChecked(position, true);
    73.                 setTitle(mPlanetTitles[position]);
    74.                 mDrawerLayout.closeDrawer(mDrawerList);
    75.             }
    76.         });
    77.     }
    78.     @Override
    79.     protected void onPostCreate(Bundle savedInstanceState)
    80.     {
    81.         super.onPostCreate(savedInstanceState);
    82.         // Sync the toggle state after onRestoreInstanceState has occurred.
    83.         mDrawerToggle.syncState();
    84.     }
    85.     @Override
    86.     public void onConfigurationChanged(Configuration newConfig)
    87.     {
    88.         super.onConfigurationChanged(newConfig);
    89.         mDrawerToggle.onConfigurationChanged(newConfig);
    90.     }
    91.     @Override
    92.     public boolean onOptionsItemSelected(MenuItem item)
    93.     {
    94.         // Pass the event to ActionBarDrawerToggle, if it returns
    95.         // true, then it has handled the app icon touch event
    96.         if (mDrawerToggle.onOptionsItemSelected(item))
    97.         {
    98.             return true;
    99.         }
    100.         // Handle your other action bar items...
    101.         return super.onOptionsItemSelected(item);
    102.     }
    103. }
    复制代码


      比较纠结的是用了Level 11的一个API,这样minSdkVersion就有限制,不能太低。
      图片资源Android官网示例处提供下载了。
      程序运行后效果如下:
      
      抽屉打开前:

      抽屉打开后:



    代码2
      今天又看了一下DrawerLayout的类,发现有很多方法可以直接用的。
      重新试了一下,其实不用上面那么麻烦,随便自己定义一个按钮控制抽屉的打开就行:
      布局:

    1. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    2.     xmlns:tools="http://schemas.android.com/tools"
    3.     android:layout_width="match_parent"
    4.     android:layout_height="match_parent"
    5.     android:paddingBottom="@dimen/activity_vertical_margin"
    6.     android:paddingLeft="@dimen/activity_horizontal_margin"
    7.     android:paddingRight="@dimen/activity_horizontal_margin"
    8.     android:paddingTop="@dimen/activity_vertical_margin"
    9.     tools:context=".DrawerActivity" >
    10.     <android.support.v4.widget.DrawerLayout
    11.         android:id="@+id/drawer_layout"
    12.         android:layout_width="match_parent"
    13.         android:layout_height="match_parent" >
    14.         <!-- The main content view -->
    15.         <FrameLayout
    16.             android:id="@+id/content_frame"
    17.             android:layout_width="match_parent"
    18.             android:layout_height="match_parent" >
    19.             <Button
    20.                 android:id="@+id/btn"
    21.                 android:layout_width="match_parent"
    22.                 android:layout_height="wrap_content"
    23.                 android:text="open"
    24.                 />
    25.         </FrameLayout>
    26.         <!-- The navigation drawer -->
    27.         <ListView
    28.             android:id="@+id/left_drawer"
    29.             android:layout_width="240dp"
    30.             android:layout_height="match_parent"
    31.             android:layout_gravity="start"
    32.             android:background="#111"
    33.             android:choiceMode="singleChoice"
    34.             android:divider="@android:color/transparent"
    35.             android:dividerHeight="0dp" />
    36.     </android.support.v4.widget.DrawerLayout>
    37. </RelativeLayout>
    复制代码


      主要代码:

    1. package com.example.hellodrawer;
    2. import android.os.Bundle;
    3. import android.app.Activity;
    4. import android.support.v4.widget.DrawerLayout;
    5. import android.view.Gravity;
    6. import android.view.View;
    7. import android.view.View.OnClickListener;
    8. import android.widget.Button;
    9. public class DrawerActivity extends Activity
    10. {
    11.     private DrawerLayout mDrawerLayout = null;
    12.     @Override
    13.     protected void onCreate(Bundle savedInstanceState)
    14.     {
    15.         super.onCreate(savedInstanceState);
    16.         setContentView(R.layout.activity_drawer);
    17.         mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
    18.         Button button = (Button) findViewById(R.id.btn);
    19.         button.setOnClickListener(new OnClickListener()
    20.         {
    21.             @Override
    22.             public void onClick(View v)
    23.             {
    24.                 // 按钮按下,将抽屉打开
    25.                 mDrawerLayout.openDrawer(Gravity.LEFT);
    26.             }
    27.         });
    28.     }
    29. }
    复制代码



    参考资料
      官方教程:
      http://developer.android.com/design/patterns/navigation-drawer.html
      http://developer.android.com/training/implementing-navigation/nav-drawer.html
      其他参考资料:
      http://blog.chengyunfeng.com/?p=493
      http://my.eoe.cn/appadventure/archive/3826.html
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|Java学习者论坛 ( 声明:本站资料整理自互联网,用于Java学习者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2024-4-19 13:19 , Processed in 0.320917 second(s), 37 queries .

    Powered by Discuz! X3.4

    © 2001-2017 Comsenz Inc.

    快速回复 返回顶部 返回列表