android--仿网易新闻主界面

主要是学习ActionBar+DrawerLayout+ActionBarDrawerToggle,很不错的教程,下面一步一步带你实现这个过程,有不足之处欢迎留言交流.

下面先来一张效果图
这里写图片描述
根据图片分析,要实现的有侧边栏DrawerLayout,ActionBar的颜色和菜单以及ActionBarDrawerToggle的动画效果.
在这之前,Theme要改成带有ActionBar的主题

android:theme="@android:style/Theme.Holo.Light"

一:侧边栏-DrawerLayout

根据官方文档,DrawerLayout布局的第一个视图是activity的主视图,第二个是侧边栏视图
因此主布局可以如下这样
FrameLayout为主视图,include加载的则为左侧边栏,因此是start属性<android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android"android:id="@+id/mdrawlaout"android:layout_width="match_parent"android:layout_height="match_parent"><FrameLayoutandroid:layout_width="match_parent"android:layout_height="match_parent"android:background="#ffeeeeee"><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:text="这是主界面"/></FrameLayout><includeandroid:layout_width="180dp"android:layout_height="match_parent"layout="@layout/drawer_layout_left"android:layout_gravity="start"android:clickable="true"/></android.support.v4.widget.DrawerLayout>

左侧边栏的实现,这里用到一个开源项目circleimageview,可以设置圆形头像,很简单的使用.

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:orientation="vertical"android:layout_height="match_parent"android:background="#ffffff"><!-- 圆形头像--><de.hdodenhof.circleimageview.CircleImageView xmlns:app="http://schemas.android.com/apk/res-auto"android:id="@+id/circleimageview"android:layout_width="90dp"android:layout_height="90dp"android:layout_marginLeft="45dp"android:layout_marginTop="30dp"android:src="@drawable/circlel_header"app:border_color="#ff0000"app:border_width="2dp" /><!-- 菜单列表--><TextView
            android:id="@+id/tv_item1"android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_marginTop="40dp"android:gravity="center"android:text="夜间工具"android:textSize="16sp" /><TextView
            android:id="@+id/tv_item2"android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_marginTop="30dp"android:gravity="center"android:text="绘画工具"android:textSize="16sp" /><TextView
            android:id="@+id/tv_item3"android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_marginTop="30dp"android:gravity="center"android:text="测试1"android:textSize="16sp" /><TextView
            android:id="@+id/tv_item4"android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_marginTop="30dp"android:gravity="center"android:text="测试2"android:textSize="16sp" /></LinearLayout>

二:ActionBar的配置

ActionBar配置主要用代码进行配置

         //取得ActionBaractionBar = getActionBar();//设置不显示标题actionBar.setDisplayShowTitleEnabled(false);//设置使用logoactionBar.setDisplayUseLogoEnabled(true);//设置logoactionBar.setLogo(R.drawable.netease_top);//设置ActionBar背景Drawable background = getResources().getDrawable(R.drawable.top_bar_background);actionBar.setBackgroundDrawable(background);//设置是将应用程序图标转变成可点击图标,并添加返回按钮actionBar.setDisplayHomeAsUpEnabled(true);

其中背景色主要通过xml文件进行配置
R.drawable.top_bar_background

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android" ><solid android:color="@color/top_title_bar_normal_backgrond_color"/>
</shape>

top_title_bar_normal_backgrond_color

<?xml version="1.0" encoding="utf-8"?>
<resources><color name="red">#ff0000</color><color name="gray">#bbbbbb</color><color name="black">#000000</color><color name="top_title_bar_normal_backgrond_color">#EB413D</color><color name="top_title_bar_button_press_background_color">#D83C38</color></resources>

这样就能显示红色的了

三:menu菜单的设置

这里主要是修改menu_main.xml这个文件来设置,解析的话,as自动生成的onCreateOptionsMenu(Menu menu)会自动解析
<menu xmlns:android="http://schemas.android.com/apk/res/android"><itemandroid:id="@+id/action_settings"android:icon="@drawable/night_biz_pc_menu_icon"android:orderInCategory="1"android:title="@string/app_name"android:showAsAction="always"/><itemandroid:id="@+id/action_btn01"android:icon="@drawable/abc_ic_menu_moreoverflow_mtrl_alpha"android:orderInCategory="2"android:title="更多"android:showAsAction="always"><menu><itemandroid:id="@+id/action_btn02"android:icon="@drawable/biz_plugin_manage_weather"android:orderInCategory="100"android:title="11/13"android:showAsAction="never"/><itemandroid:id="@+id/action_btn03"android:icon="@drawable/biz_plugin_manage_offline"android:orderInCategory="100"android:title="离线"android:showAsAction="never"/><itemandroid:id="@+id/action_btn04"android:icon="@drawable/biz_plugin_manage_theme"android:orderInCategory="100"android:title="夜间"android:showAsAction="never"/><itemandroid:id="@+id/action_btn05"android:icon="@drawable/biz_plugin_manage_search"android:orderInCategory="100"android:title="搜索"android:showAsAction="never"/><itemandroid:id="@+id/action_btn06"android:icon="@drawable/biz_plugin_manage_qrcode"android:orderInCategory="100"android:title="扫一扫"android:showAsAction="never"/><itemandroid:id="@+id/action_btn07"android:icon="@drawable/biz_plugin_manage_offline"android:orderInCategory="100"android:title="设置"android:showAsAction="never"/></menu></item></menu>

四:ActionBarDrawerToggle的实现

ActionBarDrawerToggle是一个开关,用于打开/关闭DrawerLayout抽屉,ActionBarDrawerToggle 提供了一个方便的方式来配合DrawerLayout和ActionBar,以实现推荐的抽屉功能。即点击ActionBar的home按钮,即可弹出DrawerLayout抽屉。在Activity中的两个回调函数中使用它:onConfigurationChangedonOptionsItemSelected调用ActionBarDrawerToggle.syncState() 在Activity的onPostCreate()中;指示,ActionBarDrawerToggle与DrawerLayout的状态同步,并将ActionBarDrawerToggle中的drawer图标,设置为ActionBar的Home-Button的icon
//设置DrawerLayout的点击事件
mdrawlayout.setDrawerListener(new MyAPPdrawerlistener());//设置抽屉开关
mActionBarDrawerToggle = new ActionBarDrawerToggle(this,this.mdrawlayout,R.string.drawer_open,R.string.drawer_close);
/*** 该方法会自动和actionBar关联, 将开关的图片显示在了action上* 如果不设置,也可以有抽屉的效果,不过是默认的图标* @param savedInstanceState*/@Overrideprotected void onPostCreate(Bundle savedInstanceState) {super.onPostCreate(savedInstanceState);mActionBarDrawerToggle.syncState();}
/*** 当设备配置改变的时候* @param newConfig*/@Overridepublic void onConfigurationChanged(Configuration newConfig) {super.onConfigurationChanged(newConfig);mActionBarDrawerToggle.onConfigurationChanged(newConfig);}
/*** 菜单点击事件* @param item* @return*/@Overridepublic boolean onOptionsItemSelected(MenuItem item) {// Handle action bar item clicks here. The action bar will// automatically handle clicks on the Home/Up button, so long// as you specify a parent activity in AndroidManifest.xml.int id = item.getItemId();//noinspection SimplifiableIfStatementif (id == R.id.action_settings) {return true;}//添加mActionBarDrawerToggle点击效果return mActionBarDrawerToggle.onOptionsItemSelected(item)||super.onOptionsItemSelected(item);}

最后在DrawerLayout的点击事件中配置ActionBarDrawerToggle跟随抽屉来改变即可

 private class MyAPPdrawerlistener implements DrawerLayout.DrawerListener{@Overridepublic void onDrawerSlide(View drawerView, float slideOffset) {mActionBarDrawerToggle.onDrawerSlide(drawerView, slideOffset);}@Overridepublic void onDrawerOpened(View drawerView) {mActionBarDrawerToggle.onDrawerOpened(drawerView);}@Overridepublic void onDrawerClosed(View drawerView) {mActionBarDrawerToggle.onDrawerClosed(drawerView);}@Overridepublic void onDrawerStateChanged(int newState) {mActionBarDrawerToggle.onDrawerStateChanged(newState);}}
备注一些用到的知识:1.android:paddingLeft和android:layout_marginLeft区别:区别是android:layout_marginLef是设置整个布局离左边的距离,android:paddingLeft是设置布局里面的内容距离左边
2.android:gravity:设置的是控件自身上面的内容位置,android:layout_gravity:设置控件本身相对于父控件的显示位置
3.android:orderInCategory="1",actionbar里每个item的优先级,值越大优先级越低,actionbar地方不够就会放到overflow中
4.android studio导入github的项目的时候,直接把库复制到原代码下,然后在grade中添加作者给的引入语句即可

版权声明:本文为博主原创文章,未经博主允许不得转载。

转载于:https://www.cnblogs.com/-niuli/p/4856416.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/471606.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

fastapi 查询参数和字符串校验 / 路径参数和数值校验

文章目录1. 约束限制2. 必须参数3. 查询参数列表 / 多个值4. 声明更多元数据5. 别名参数6. 弃用参数7. Path 路径参数8. 按需对参数排序learn from https://fastapi.tiangolo.com/zh/tutorial/query-params-str-validations/ 1. 约束限制 from typing import Optional from f…

数据库中包含开始时间、结束时间,并且查询条件也有开始时间、结束时间的查询方法...

分类&#xff1a; oracle学习数据库例&#xff1a;考试表中有两个字段&#xff1a;startDate、endDate&#xff0c;分别代表考试开始时间、结束时间。现在需要查询某一时间段内正在进行的考试&#xff0c;实际只要满足考试的时间段和查询条件的时间段有交集即可&#xff0c;包含…

LeetCode 2038. 如果相邻两个颜色均相同则删除当前颜色

文章目录1. 题目2. 解题1. 题目 总共有 n 个颜色片段排成一列&#xff0c;每个颜色片段要么是 ‘A’ 要么是 ‘B’ 。 给你一个长度为 n 的字符串 colors &#xff0c;其中 colors[i] 表示第 i 个颜色片段的颜色。 Alice 和 Bob 在玩一个游戏&#xff0c;他们 轮流 从这个字符…

LeetCode 2039. 网络空闲的时刻(BFS)

文章目录1. 题目2. 解题1. 题目 给你一个有 n 个服务器的计算机网络&#xff0c;服务器编号为 0 到 n - 1 。 同时给你一个二维整数数组 edges &#xff0c;其中 edges[i] [ui, vi] 表示服务器 ui 和 vi 之间有一条信息线路&#xff0c;在 一秒 内它们之间可以传输 任意 数目…

LeetCode 2040. 两个有序数组的第 K 小乘积(嵌套二分查找)

文章目录1. 题目2. 解题1. 题目 给你两个 从小到大排好序 且下标从 0 开始的整数数组 nums1 和 nums2 以及一个整数 k &#xff0c;请你返回第 k &#xff08;从 1 开始编号&#xff09;小的 nums1[i] * nums2[j] 的乘积&#xff0c;其中 0 < i < nums1.length 且 0 <…

数据库SQL优化大总结之 百万级数据库优化方案(转载)

原文地址&#xff1a;http://www.cnblogs.com/yunfeifei/p/3850440.html 网上关于SQL优化的教程很多&#xff0c;但是比较杂乱。近日有空整理了一下&#xff0c;写出来跟大家分享一下&#xff0c;其中有错误和不足的地方&#xff0c;还请大家纠正补充。 这篇文章我花费了大量的…

LeetCode 2042. 检查句子中的数字是否递增

文章目录1. 题目2. 解题1. 题目 句子是由若干 token 组成的一个列表&#xff0c;token 间用 单个 空格分隔&#xff0c;句子没有前导或尾随空格。 每个 token 要么是一个由数字 0-9 组成的不含前导零的 正整数 &#xff0c;要么是一个由小写英文字母组成的 单词 。 示例&…

java shiro security_安全框架Shiro和SpringSecurity的比较

两个基本的概念安全实体&#xff1a;系统需要保护的具体对象数据权限&#xff1a;系统相关的功能操作&#xff0c;例如基本的CRUDShiro首先Shiro较之 Spring Security&#xff0c;Shiro在保持强大功能的同时&#xff0c;还在简单性和灵活性方面拥有巨大优势。Shiro是一个强大而…

LeetCode 2043. 简易银行系统

文章目录1. 题目2. 解题1. 题目 你的任务是为一个很受欢迎的银行设计一款程序&#xff0c;以自动化执行所有传入的交易&#xff08;转账&#xff0c;存款和取款&#xff09;。 银行共有 n 个账户&#xff0c;编号从 1 到 n 。每个账号的初始余额存储在一个下标从 0 开始的整数…

LeetCode 2044. 统计按位或能得到最大值的子集数目(状态压缩DP)

文章目录1. 题目2. 解题1. 题目 给你一个整数数组 nums &#xff0c;请你找出 nums 子集 按位或 可能得到的 最大值 &#xff0c;并返回按位或能得到最大值的 不同非空子集的数目 。 如果数组 a 可以由数组 b 删除一些元素&#xff08;或不删除&#xff09;得到&#xff0c;则…

fastapi 请求体 - 多个参数 / 字段Field / 嵌套模型

文章目录1. 混合使用 Path、Query 和请求体参数2. 多个请求体参数3. 请求体中的单一值4. 多个请求体参数和查询参数5. 嵌入单个请求体参数6. 字段7. 嵌套模型7.1 List 字段7.2 子模型作为类型8. 特殊类型校验9. 带有一组子模型的属性10. 任意 dict 构成的请求体learn from http…

java ltpa_LTPA Cookie原理

1. 什么是LTPA?Lightweight Third-Party Authentication (LTPA)是IBM Websphere和Domino产品中使用单点登录技术。当服务器配置好LTPA认证方式&#xff0c;用户通过浏览器成功登录后&#xff0c;服务器会自动发送一个session cookie给浏览器&#xff1b;此cookie中包含一个LTP…

fastapi 模式的额外信息,示例 / Cookie参数 / Header参数

文章目录1. Pydantic schema_extra2. Field 的附加参数3. Body 额外参数4. Cookie 参数5. Header 参数5.1 重复的 headerslearn from https://fastapi.tiangolo.com/zh/tutorial/schema-extra-example/ 添加一个将在文档中显示的 example 1. Pydantic schema_extra from typ…

Android(java)学习笔记171:服务(service)之绑定服务调用服务里面的方法

1.绑定服务调用服务里面的方法&#xff0c;图解&#xff1a; 步骤&#xff1a; &#xff08;1&#xff09;在Activity代码里面绑定 bindService&#xff08;&#xff09;&#xff0c;以bind的方式开启服务 &#xff1b; bindService&#xff08;intent, new MyConn(), BIND_AUT…

LeetCode 1909. 删除一个元素使数组严格递增

文章目录1. 题目2. 解题1. 题目 给你一个下标从 0 开始的整数数组 nums &#xff0c;如果 恰好 删除 一个 元素后&#xff0c;数组 严格递增 &#xff0c;那么请你返回 true &#xff0c;否则返回 false 。 如果数组本身已经是严格递增的&#xff0c;请你也返回 true 。 数组…

ATS push cache 测试

测试 ATS 注入缓存 参考了&#xff1a; http://serverfault.com/questions/471684/push-content-to-apache-traffic-servers-cache 得到返回&#xff1a;HTTP/1.0 400 Response Not Cachable 搜索得知&#xff0c;头部传入信息太少&#xff0c;必须包含反映时间的项。那个回答应…

fastapi 响应模型 / 响应状态码 / 表单参数

文章目录1. response_model2. 添加输出模型3. 响应模型编码参数4. response_model_include 和 response_model_exclude5. 代码复用&#xff1a;继承6. Union7. 任意 dict 的响应8. 响应状态码9. 表单参数learn from https://fastapi.tiangolo.com/zh/tutorial/response-model/ …

java对象内存模型_Java对象的内存模型

众所周知&#xff0c;函数调用在内存中是通过压栈&#xff0c;退栈实现的&#xff0c;而Java的方法调用则是在JVM栈中通过栈帧实现的&#xff0c;且所有的Java对象都只在堆上分配内存&#xff0e;那么一个Java对象在堆内存里到底长啥样呢&#xff1f;实际上&#xff0c;当一个对…

fastapi 请求文件 / 表单 / 处理错误 / 路径操作配置 / jsonable_encoder

文章目录1. File 参数2. 多文件上传3. 请求表单与文件4. 处理错误5. 自定义响应头6. 自定义异常处理器7. 覆盖默认异常处理器8. 使用 RequestValidationError 的请求体9. 复用 FastAPI 异常处理器10. 路径操作参数配置10.1 status_code&#xff0c;tags10.2 summary&#xff0c…

fastapi PUT更新数据 / PATCH部分更新

文章目录1. PUT 更新2. 用 PATCH 进行部分更新learn from https://fastapi.tiangolo.com/zh/tutorial/body-updates/1. PUT 更新 注意&#xff0c;put 没有指定的值&#xff0c;会被重置为默认值 from typing import List, Optionalfrom fastapi import FastAPI from fastap…