返回顶部
首页 > 资讯 > 移动开发 >Android组件创建DrawerLayout导航
  • 904
分享到

Android组件创建DrawerLayout导航

drawerlayoutAndroid 2022-06-06 04:06:14 904人浏览 独家记忆
摘要

概述 本篇博客是对developer.Android.com/上的Training课程的简单翻译,若是觉得翻译出来的理解有困难,请点击下方链接查看原文! 关于DrawerLay

概述
本篇博客是对developer.Android.com/上的Training课程的简单翻译,若是觉得翻译出来的理解有困难,请点击下方链接查看原文!
关于DrawerLayout的Training:Http://developer.android.com/training/implementing-navigation/nav-drawer.html
关于DrawerLayout的api:http://developer.android.com/reference/android/support/v4/widget/DrawerLayout.html

创建抽屉布局

        创建一个抽屉布局必须得以DrawerLayout作为XML文件的根节点,记住,DrawerLayout引用的是Android.support.v4.DrawerLayout,然后在布局内部添加内容视图区域和一个或者两个抽屉视图区域,这里理解抽屉视图即为上面描述的菜单视图。例如下面一段布局中显示,在布局中添加一个FrameLayout作为内容区域(通常用来呈现Fragment),另外在下面定义了一个listView用来呈现抽屉菜单视图:


<android.support.v4.widget.DrawerLayout 
  xmlns:android="http://schemas.android.com/apk/res/android" 
  android:id="@+id/drawer_layout" 
  android:layout_width="match_parent" 
  android:layout_height="match_parent"> 
  <!-- The main content view --> 
  <FrameLayout 
    android:id="@+id/content_frame" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" /> 
  <!-- The navigation drawer --> 
  <ListView android:id="@+id/left_drawer" 
    android:layout_width="240dp" 
    android:layout_height="match_parent" 
    android:layout_gravity="start" 
    android:choiceMode="singleChoice" 
    android:divider="@android:color/transparent" 
    android:dividerHeight="0dp" 
    android:background="#111"/> 
</android.support.v4.widget.DrawerLayout> 

这个布局文件示范了一些重要的布局特征.

主要内容的视图(FrameLayout)必须是DrawLayout的第一个子元素, 因为导航抽屉是在主要内容视图的上面. 主要内容视图设置为匹配父视图的宽度和高度, 因为它代表了整个界面导航抽屉是隐藏的. 抽屉视图(ListView)必须指定其水平重力与android:layout_gravity属性。支持从右到左(RTL)语言,指定值与 "start" 代替 "left"(所以抽屉里出现在布局的右侧当布局是RTL时). 抽屉视图指定其宽度用dp单位和高度匹配父视图。抽屉里的宽度不能超过320 dp, 所以用户总是可以看到主要内容视图的一部分.

初始化抽屉列表

        在你的Activity中, 第一件事就是初始化导航抽屉列表里面的元素, 你如何做取决于你的应用程序的内容,但一个导航抽屉通常包括一个ListView, 因此清单应该由一个Adapter填充(例如ArrayAdapter或SimpleCursorAdapter).
例如, 这里演示了如何用String array来初始化一个导航列表.


public class MainActivity extends Activity { 
  private String[] mPlanetTitles; 
  private DrawerLayout mDrawerLayout; 
  private ListView mDrawerList; 
  ... 
  @Override 
  public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    mPlanetTitles = getResources().getStringArray(R.array.planets_array); 
    mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout); 
    mDrawerList = (ListView) findViewById(R.id.left_drawer); 
    // Set the adapter for the list view 
    mDrawerList.setAdapter(new ArrayAdapter<String>(this, 
        R.layout.drawer_list_item, mPlanetTitles)); 
    // Set the list's click listener 
    mDrawerList.setOnItemClickListener(new DrawerItemClickListener()); 
    ... 
  } 
} 

这个代码调用setOnItemClickListener()去接收导航抽屉列表的点击事件. 下一节将展示如何实现这个接口,当用户选择一个Item时改变内容视图.

处理导航点击事件

当用户选择了抽屉列表里面的一个Item时, 系统调用onItemClickListener上的onItemClick(), 给setOnItemClickListener().
你在onItemClick()方法里面做什么, 取决于你的app实现的结构. 在下面的例子中, 选择每一个Item都会在主要内容的布局中插入一个不同的Fragment.


private class DrawerItemClickListener implements ListView.OnItemClickListener { 
  @Override 
  public void onItemClick(AdapterView parent, View view, int position, long id) { 
    selectItem(position); 
  } 
} 
 
private void selectItem(int position) { 
  // Create a new fragment and specify the planet to show based on position 
  Fragment fragment = new PlanetFragment(); 
  Bundle args = new Bundle(); 
  args.putInt(PlanetFragment.ARG_PLANET_NUMBER, position); 
  fragment.setArguments(args); 
  // Insert the fragment by replacing any existing fragment 
  FragmentManager fragmentManager = getFragmentManager(); 
  fragmentManager.beginTransaction() 
          .replace(R.id.content_frame, fragment) 
          .commit(); 
  // Highlight the selected item, update the title, and close the drawer 
  mDrawerList.setItemChecked(position, true); 
  setTitle(mPlanetTitles[position]); 
  mDrawerLayout.closeDrawer(mDrawerList); 
} 
@Override 
public void setTitle(CharSequence title) { 
  mTitle = title; 
  getActionBar().setTitle(mTitle); 
} 

监听打开和关闭事件

       侦听抽屉打开和关闭事件,调用你的DrawerLayout setDrawerListener(), 并将其传递给DrawerLayout.DrawerListener的实现. 这个接口提供了回调抽屉事件, 如onDrawerOpened()和onDrawerClosed ()。
      然而, 相对于实现DrawerLayout.DrawerListener, 如果你的Activity包括工具栏, 可以代替继承ActionBarDrawerToggle类. ActionBarDrawerToggle实现了DrawerLayout.DrawerListener. 所以你仍然可以覆盖这些回调, 但它也有助于正确的交互行为, 在工具栏的图标和导航抽屉之间(下一节将进一步讨论)。
      就像在导航抽屉设计指南一样,当抽屉是可见的时候, 你应该修改工具栏的内容, 如改变标题和删除操作Item. 下面的代码用ActionBarDrawerToggle类的一个实例, 显示了如何重写DrawerLayout.DrawerListener的回调方法:


public class MainActivity extends Activity { 
  private DrawerLayout mDrawerLayout; 
  private ActionBarDrawerToggle mDrawerToggle; 
  private CharSequence mDrawerTitle; 
  private CharSequence mTitle; 
  ... 
  @Override 
  public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    ... 
    mTitle = mDrawerTitle = getTitle(); 
    mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout); 
    mDrawerToggle = new ActionBarDrawerToggle(this, mDrawerLayout, 
        R.drawable.ic_drawer, R.string.drawer_open, R.string.drawer_close) { 
       
      public void onDrawerClosed(View view) { 
        super.onDrawerClosed(view); 
        getActionBar().setTitle(mTitle); 
        invalidateOptionsMenu(); // creates call to onPrepareOptionsMenu() 
      } 
       
      public void onDrawerOpened(View drawerView) { 
        super.onDrawerOpened(drawerView); 
        getActionBar().setTitle(mDrawerTitle); 
        invalidateOptionsMenu(); // creates call to onPrepareOptionsMenu() 
      } 
    }; 
    // Set the drawer toggle as the DrawerListener 
    mDrawerLayout.setDrawerListener(mDrawerToggle); 
  } 
   
  @Override 
  public boolean onPrepareOptionsMenu(Menu menu) { 
    // If the nav drawer is open, hide action items related to the content view 
    boolean drawerOpen = mDrawerLayout.isDrawerOpen(mDrawerList); 
    menu.findItem(R.id.action_WEBsearch).setVisible(!drawerOpen); 
    return super.onPrepareOptionsMenu(menu); 
  } 
} 

下一节描述ActionBarDrawerToggle构造函数参数和其他所需的步骤来设置它来处理工具栏的图标.

打开关闭应用图标

        用户可以打开和关闭导航抽屉, 通过手指从屏幕左侧的边缘滑动, 但如果你使用工具栏, 你应该也能允许用户打开和关闭它, 通过触摸应用程序图标. 应用程序图标也可以显示一个特殊的图标关于导航抽屉的状态. 你可以实现所有这些行为通过使用ActionBarDrawerToggle, 如前一节所示。
让ActionBarDrawerToggle工作, 创建一个它的实例用它的构造方法, 这就需要以下参数:

持有抽屉的Activity. DrawerLayout对象. 一个Drawable资源作为抽屉指示器. 字符串资源描述"打开抽屉"动作. 字符串资源描述"关闭抽屉"动作.

然后, 无论你是否已经创建了一个ActionBarDrawerToggle的子类作为你的抽屉的Listener, 你需要在几个Activity生命周期的地方, 调用你的ActionBarDrawerToggle:


public class MainActivity extends Activity { 
  private DrawerLayout mDrawerLayout; 
  private ActionBarDrawerToggle mDrawerToggle; 
  ... 
  public void onCreate(Bundle savedInstanceState) { 
    ... 
    mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout); 
    mDrawerToggle = new ActionBarDrawerToggle( 
        this,          
        mDrawerLayout,      
        R.drawable.ic_drawer,  
        R.string.drawer_open,  
        R.string.drawer_close  
        ) { 
       
      public void onDrawerClosed(View view) { 
        super.onDrawerClosed(view); 
        getActionBar().setTitle(mTitle); 
      } 
       
      public void onDrawerOpened(View drawerView) { 
        super.onDrawerOpened(drawerView); 
        getActionBar().setTitle(mDrawerTitle); 
      } 
    }; 
    // Set the drawer toggle as the DrawerListener 
    mDrawerLayout.setDrawerListener(mDrawerToggle); 
    getActionBar().setDisplayHomeAsUpEnabled(true); 
    getActionBar().setHomeButtonEnabled(true); 
  } 
  @Override 
  protected void onPostCreate(Bundle savedInstanceState) { 
    super.onPostCreate(savedInstanceState); 
    // Sync the toggle state after onRestoreInstanceState has occurred. 
    mDrawerToggle.syncState(); 
  } 
  @Override 
  public void onConfigurationChanged(Configuration newConfig) { 
    super.onConfigurationChanged(newConfig); 
    mDrawerToggle.onConfigurationChanged(newConfig); 
  } 
  @Override 
  public boolean onOptionsItemSelected(MenuItem item) { 
    // Pass the event to ActionBarDrawerToggle, if it returns 
    // true, then it has handled the app icon touch event 
    if (mDrawerToggle.onOptionsItemSelected(item)) { 
     return true; 
    } 
    // Handle your other action bar items... 
    return super.onOptionsItemSelected(item); 
  } 
  ... 
} 

官方Demo:http://xiazai.jb51.net/201701/yuanma/NavigationDrawer(jb51.net).rar

您可能感兴趣的文章:Android之侧滑菜单DrawerLayout的使用介绍Android组件DrawerLayout仿网易新闻v4.4侧滑菜单Android DrawerLayout实现抽屉效果实例代码Android Drawerlayout侧拉栏事件传递问题的解决方法Android实现右边抽屉Drawerlayout效果Android DrawerLayout带有侧滑功能的布局类(2)Android DrawerLayout带有侧滑功能的布局类(1)Android App中DrawerLayout抽屉效果的菜单编写实例Android组件之DrawerLayout实现抽屉菜单Android开发之DrawerLayout实现抽屉效果


--结束END--

本文标题: Android组件创建DrawerLayout导航

本文链接: https://lsjlt.com/news/22731.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Android组件创建DrawerLayout导航
    概述 本篇博客是对developer.android.com/上的Training课程的简单翻译,若是觉得翻译出来的理解有困难,请点击下方链接查看原文! 关于DrawerLay...
    99+
    2022-06-06
    drawerlayout Android
  • Android底部导航组件BottomNavigationView
    目录什么是BottomNavigationViewBottomNavigationView的简单用法什么是BottomNavigationView 底部菜单栏 BottomNavi...
    99+
    2023-03-20
    Android底部导航组件 Android BottomNavigationView
  • React高阶组件如何创建一个面包屑导航
    这篇文章主要介绍“React高阶组件如何创建一个面包屑导航”,在日常操作中,相信很多人在React高阶组件如何创建一个面包屑导航问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”React高阶组件如何创建一个面包...
    99+
    2023-07-04
  • Android Jetpack组件Navigation导航组件的基本使用
    目录1.Navigation 基本概念2.Navigation 使用入门2.1 添加Navigation依赖2.2 创建导航图2.3 导航图中添加目的地Fragment2.4 Act...
    99+
    2024-04-02
  • Android中导航组件Navigation的实现原理
            对于导航组件的使用方式不是本文的重点,具体使用可以参考官方文档,导航组件框架是通过fragment来实现的,其核心类主要可以分...
    99+
    2024-04-02
  • Android底部导航组件BottomNavigationView怎么使用
    本篇内容介绍了“Android底部导航组件BottomNavigationView怎么使用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!Bo...
    99+
    2023-07-05
  • Android组件之DrawerLayout实现抽屉菜单
    DrawerLayout组件同样是V4包中的组件,也是直接继承于ViewGroup类,所以这个类也是一个容器类。 抽屉菜单的摆放和布局通过android:layout_grav...
    99+
    2022-06-06
    菜单 drawerlayout 抽屉 Android
  • CSS网页导航菜单:创建各种交互式导航菜单
    CSS网页导航菜单:创建各种交互式导航菜单,需要具体代码示例导航菜单是网页中至关重要的组成部分之一,它能够帮助用户快速导航到网站的各个页面。而通过CSS的灵活运用,我们可以创建各种交互式导航菜单,从而提升用户体验和网站的可用性。在本文中,我...
    99+
    2023-11-18
    导航菜单 CSS 交互式
  • bootstrap组件中如何使用导航组件
    这篇文章主要介绍了bootstrap组件中如何使用导航组件,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。Bootstrap 中的导航组件都依...
    99+
    2024-04-02
  • CSS网页导航按钮:创建多样化的导航按钮样式
    CSS网页导航按钮:创建多样化的导航按钮样式,需要具体代码示例导航按钮作为网页中常见的元素之一,对于网页的整体风格和用户体验起着至关重要的作用。为了给网页增加更多的交互性和美观性,我们可以通过CSS来创建多样化的导航按钮样式。本文将介绍一些...
    99+
    2023-11-18
    按钮设计 CSS样式 网页导航
  • 用Vue封装导航栏组件
    前言:把一个功能模块使用组件化的思想充分封装,如导航栏,这无论对我们的开发思想还是效率都有许多好处,在开发中,我们要尽量多得运用组件化的开发思想,不要把所有代码都写在同一个.vue文...
    99+
    2024-04-02
  • Flutter如何实现底部导航栏创建
    Flutter如何实现底部导航栏创建,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。ConvexBottomBar是一个底部导航栏组件,用于展现凸起的TAB效果,...
    99+
    2023-06-26
  • Flutter实现底部导航栏创建详解
    目录添加依赖项如何使用功能属性主题预览图代码Flutter web问题:Failed to load network image我的解决办法参考资料ConvexBottomBar是一...
    99+
    2024-04-02
  • Android组件DrawerLayout仿网易新闻v4.4侧滑菜单
    概述        今天这篇博客将记录一些关于DrawerLayout的基本用法,我想关于DrawerLayout的...
    99+
    2022-06-06
    菜单 drawerlayout 网易 Android
  • Bootstrap中如何导航组件和选项卡组件
    本篇内容介绍了“Bootstrap中如何导航组件和选项卡组件”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!...
    99+
    2024-04-02
  • vue 底部footer导航组件问题
    目录Vue底部footer导航组件!!! 判断一定要用路径Vue抽取的footer组件,可复用复用时直接调用组件Vue底部footer导航组件 底部导航一定要用路径!!! 贼关键 举...
    99+
    2024-04-02
  • Bootstrap中导航组件有什么用
    这篇文章给大家分享的是有关Bootstrap中导航组件有什么用的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。在bootstrap框架中将导航独立出来成为一个导航组件,根据不同的版本,可以找到相应的源码:LESS:...
    99+
    2023-06-06
  • vue面包屑导航组件封装
    目录一、为什么需要面包屑?二、初级封装1. 实现思路2. 代码演示3. 使用4. 不足三、进阶封装1. 实现思路2. 代码演示3. 使用4. 不足四、高阶封装1. 思路2. 代码演示...
    99+
    2024-04-02
  • 如何创建优质的网站导航菜单
    创建优质的网站导航菜单包括:1、规划清晰的结构,2、优化菜单标签,3、提供多级导航,4、考虑用户体验,5、实施SEO最佳实践。一个高效、用户友好的导航菜单不仅能提升用户体验,还能增加网站的搜索引擎排名。通过精心设计和定期更新,你可以创建一个...
    99+
    2023-10-29
    网站导航 菜单
  • vue的导航链接组件是什么
    本教程操作环境:windows7系统、vue3版,DELL G3电脑。vue的导航链接组件是“router-link”。vue 组件router-link介绍<router-link>组件支持用户在具有路由功能的应用中点击导航。...
    99+
    2023-05-14
    Vue 组件
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作