虚拟导航栏适配

在写界面的时候 然后发现在界面最底下的几行文字 正好被虚拟导航栏遮挡住了,不滑动还看不到底下的文字,所以想隐去这些导航栏。 采用下面的代码将DecorView中的属性设置为隐藏 navigation,我这里注销掉了全屏的属性 ,按需添加or删除属性吧 11 && Build.VERSION.SDK_INT < 19) { // lower api View v = this.getWindow().getDecorView(); if(v!=null){ v.setSystemUiVisibility(View.GONE); } } else if (Build.VERSION.SDK_INT >= 19) { //for new api versions. View decorView = getWindow().getDecorView(); int uiOptions = View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY/* | View.SYSTEM_UI_FLAG_FULLSCREEN*/; if (decorView != null) { decorView.setSystemUiVisibility(uiOptions); } } }1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 " data-snippet-id="ext.c635ae4a92490f41cf801e12d12759e7" data-snippet-saved="false" data-codota-status="done">` &lt;span class="hljs-keyword">protected&lt;/span> &lt;span class="hljs-keyword">void&lt;/span> &lt;span class="hljs-title">hideBottomMenu&lt;/span>() { &lt;span class="hljs-comment">//隐藏虚拟按键&lt;/span> &lt;span class="hljs-keyword">if&lt;/span> (Build.VERSION.SDK_INT &gt; &lt;span class="hljs-number">11&lt;/span> && Build.VERSION.SDK_INT &lt; &lt;span class="hljs-number">19&lt;/span>) { &lt;span class="hljs-comment">// lower api&lt;/span> View v = &lt;span class="hljs-keyword">this&lt;/span>.getWindow().getDecorView(); &lt;span class="hljs-keyword">if&lt;/span>(v!=&lt;span class="hljs-keyword">null&lt;/span>){ v.setSystemUiVisibility(View.GONE); } } &lt;span class="hljs-keyword">else&lt;/span> &lt;span class="hljs-keyword">if&lt;/span> (Build.VERSION.SDK_INT &gt;= &lt;span class="hljs-number">19&lt;/span>) { &lt;span class="hljs-comment">//for new api versions.&lt;/span> View decorView = getWindow().getDecorView(); &lt;span class="hljs-keyword">int&lt;/span> uiOptions = View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY&lt;span class="hljs-comment">/* | View.SYSTEM_UI_FLAG_FULLSCREEN*/&lt;/span>; &lt;span class="hljs-keyword">if&lt;/span> (decorView != &lt;span class="hljs-keyword">null&lt;/span>) { decorView.setSystemUiVisibility(uiOptions); } } }` ...

2018年8月3日 · 1 分钟 · 天边的星星

Android 优化工具收集

在开发Android的过程中,我们会遇到各种问题,有时候为了满足某一个需求(或者快速的上线完成一个版本), 我们会使用各种框架,代码编写可能随意一些,造成一些冗余的代码,整个工程越跑越慢,APP越跑越慢, 当达到一定阶段的时候,就不得不需要我们进行工程的优化,今天就来说说优化过程中使用到的工具。 Android的应用性能的指标主要有: 布局复杂度:布局复杂会导致布局需要更长的时间,从而导致进入应用慢、页面切换慢; 耗电量:耗电量大会导致机器发热、缩短机器的有效使用时长; 内存:内存消耗大会导致频繁GC,GC时会暂停其它工作,导致页面卡顿;内存泄露会导致剩余可用内存越来越小;内存不足会导致应用异常; 网络:频繁的网络访问会导致耗电和影响应用的性能;网络交互数据大小会影响网络传输的效率; 程序执行效率:糟糕的代码会严重影响程序的运行效率,UI线程过多的任务会阻塞应用的正常运行,长时间持有某个对象会导致潜在的内存泄露,频繁的IO操作、网络操作而不用缓存会严重影响程序的运行效率。 工具 Memory Monitor:查看整个app所占用的内存,以及发生GC的时刻 Allocation Tracker:使用此工具来追踪内存的分配。 Heap Tool:查看当前内存快照,便于对比分析哪些对象有可能是泄漏了的。 Battery History Tool 电量审查工具(Android 5.0,不属于编译器的工具) traceview 工具(计算每个方法占用CPU时间) Networking Traffic Tool (android studio)网络请求发生的时间,每次请求的数据量等信息 Hierarchy viewer 层级显示工具(检测布局复杂度,各视图的布局耗时情况) Lint 代码审查工具 给出代码优化建议 耗电量:Android开发者模式中的电量统计 leakcanary:square/leakcanary · GitHub,通过集成到程序中的方式,在程序运行时检测应用中存在的内存泄露,并在页面中显示,在应用中集成leancanry后,程序运行时会存在卡顿的情况,这个是正常的,因为leancanry就是通过gc操作来检测内存泄露的,gc会知道应用卡顿,说明文档:LeakCanary 中文使用说明、LeakCanary: 让内存泄露无所遁形。 GT:GT Home,GT是腾讯开发的一款APP的随身调测平台,利用GT,可以对CPU、内存、流量、点亮、帧率/流畅度进行测试,还可以查看开发日志、crash日志、抓取网络数据包、APP内部参数调试、真机代码耗时统计等等,需要说明的是,应用需要集成GT的sdk后,GT这个apk才能在应用运行时对各个性能进行检测。 iTest:iTest,业内首创的Android自动化性能监控工具,它能够记录特定应用的性能消耗情况,包括cpu、内存、流量、电量等信息,支持浮窗实时查看应用的具体信息,iTest不需要集成sdk到应用中,在itest中选中需要测试的应用即可进行测试; Emmagee:Emmagee下载、NetEase/Emmagee · GitHub,网易开发的性能检测工具,Emmage和iTest一样,不需要在应用中集成sdk,能够对应用的常用性能指标进行检测,并以csv的格式保存方便查看应用的各项参数 APT:Tencent/apt | CODE,腾讯出的。 FPSService:百度一位开发者写的帧率测试工具,需要集成到应用中才可查看 AndroidGodEye:AndroidGodEye是一个可以在PC浏览器中实时监控Android数据指标(比如性能指标,但是不局限于性能)的工具,你可以通过wifi/usb连接手机和pc,通过pc浏览器实时监控手机性能。 系统分为三部分: Core 核心部分,提供所有模块; Debug Monitor部分,提供Debug阶段开发者面板; Toolbox 快速接入工具集,给开发者提供各种便捷接入的工具。 AndroidGodEye提供了多种监控模块,比如cpu、内存、卡顿、内存泄漏等等,并且提供了Debug阶段的Monitor看板实时展示这 些数据。而且提供了api供开发者在release阶段进行数据上报。 慢慢一个个工具使用吧 参考引用 https://blog.csdn.net/u010255127/article/details/49135551 https://segmentfault.com/a/1190000012413613

2018年5月23日 · 1 分钟 · 天边的星星

为TabLayout添加角标的最简单方法

一、前言 在开发中,我们常常需要ViewPager结合Fragment一起使用,来实现多页签的切换效果。在以前,我们有以下一系列第三方库来帮我们实现: PagerSlidingTabStrip SmartTabLayout FlycoTabLayout ViewPagerIndicator … 而现在,我们可以使用Design support library库的TabLayout来实现了。 二、最终效果图 三、TabLayout的使用 1. 添加依赖 由于TabLayout在design包内,所以首先需要在app目录下的build.gradle中添加以下依赖: ``` 1 2 3 4 ``` <td class="code hljs bash"> <div class="top-box hide"> <div class="alert-info"> </div> </div> ``` dependencies { … compile ‘com.android.support:design:23.4.0’ } </td> </tr> </table></figure> ## 2. 创建布局 {#2-创建布局} 布局相当简单,只要添加TabLayout和ViewPager的布局即可: ### layout/activity_main.xml {#layout-activity-main-xml}<figure class="highlight xml"> <table> <tr> <td class="gutter"> <div class="top-box hide"> <div class="alert-info"> </div> </div> ``` <span class="line">1</span> <span class="line">2</span> <span class="line">3</span> <span class="line">4</span> <span class="line">5</span> <span class="line">6</span> <span class="line">7</span> <span class="line">8</span> <span class="line">9</span> <span class="line">10</span> <span class="line">11</span> <span class="line">12</span> <span class="line">13</span> <span class="line">14</span> <span class="line">15</span> <span class="line">16</span> <span class="line">17</span> <span class="line">18</span> <span class="line">19</span> <span class="line">20</span> <span class="line">21</span> </td> <td class="code hljs xml"> <div class="top-box hide"> <div class="alert-info"> </div> </div> ``` <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" ...

2018年4月4日 · 8 分钟 · 天边的星星

Android 分包(多dex)处理

Android 分包导致低于5.0版本报错ClassNotFoundException 项目在4.4系统运行就报错,在5.0以上没问题。原因就是 报错ClassNotFoundException 方法数超64K(1K=1024,65536刚好是64K);需要分包操作 解决方案 1、在module下的build.gradle文件 ,添加multiDexEnabled true `defaultConfig {` ` ``applicationId ``"com.haxi.mh"` ` ``minSdkVersion ``15` ` ``targetSdkVersion ``26` ` ``versionCode ``1` ` ``versionName ``"1.0.0"` ` ``testInstrumentationRunner ``"android.support.test.runner.AndroidJUnitRunner"` ` ``// dex突破65535的限制` ` ``multiDexEnabled ``true` ` ``ndk {` ` ``// 设置支持的SO库架构` ` ``abiFilters ``'armeabi'` `//, 'x86', 'armeabi-v7a', 'x86_64', 'arm64-v8a'` ` ``}` ` ``}` 2.兼容低版本(在build.gradle中 android代码库中,和defaultConfig同级) `//分包兼容低版本` `dexOptions {` ` ``javaMaxHeapSize ``"4g"` ` ``jumboMode = ``true` `}` 3.添加依赖包 `/* multidex兼容包,配合AndroidStudio实现了一个APK包含多个dex的功能 */` ` ``compile ``'com.android.support:multidex:1.0.1'` `4.让自己的Application继承MultiDexApplication类,或者在Application下重新attachBaseContext(Context base)方法,初始化 MultiDex.install(this); ` `@Override` `protected``void``attachBaseContext(Context base) {` ` ``super``.attachBaseContext(base);` ` ``MultiDex.install(base);` `}` 其他: 此外,有没有办法指定某些类被分包到主dex呢?有,在app目录下创建一个maindexlist.txt,我们在这个txt里将我们想要放在主dex中的类写进去即可,为了方便减少错误的出现,可以在在\app\build\intermediates\multi-dex\debug目录下找到了一个maindexlist.txt,注意,这个你直接在改了没用,一运行又恢复了,你要的做的是将这个maindexlist.txt复制到app目录下,在进行添加添加指定类即可, 参考: [https://www.2cto.com/kf/201712/707967.html](https://www.2cto.com/kf/201712/707967.html) [https://stackoverflow.com/questions/35225939/android-multidex-classnotfoundexception](https://stackoverflow.com/questions/35225939/android-multidex-classnotfoundexception) [http://blog.csdn.net/daitu_liang/article/details/72987378](http://blog.csdn.net/daitu_liang/article/details/72987378)

2018年2月28日 · 1 分钟 · 天边的星星

android 使用命令查找apk

第一步:查找apk的包名 adb shell pm list package 查找所有安装的包名 adb shell pm list package -3 查找所有安装的第三方的包名 adb shell ps 查找正在执行的进程 adb shell dumpsys activity activities ,它会列出当前手机中所有正在运行的应用的详细信息,按打开顺序排列,最后打开的APK信息会放在输出的最前面。 第二步根据包名或者到安装的路径 adb shell path 包名 (例如adb shell pm path phxDroid.phxDroid) 第三步导出 adb pull apk的路径 apk导出路径 (例如 adb pull /data/app/phxDroid.phxDroid-1.apk ~/Desktop/ 导出apk到桌面)

2017年12月18日 · 1 分钟 · 天边的星星

Android屏幕投影及反向控制原理

这一周过的是够有意思的,先停两天电,然后感冒了,然后项目出Bug了,然后发烧了,呵呵哒,赶紧只能过来写点东西压压惊。鉴于最近正好在研究Android投屏及反像控制和Android双开的技术原理,本周就先写写Android投影以及反向控制的原理了。 1 目标 Android投影屏幕到电脑 电脑端反向控制Android手机(如QQ,微信,淘宝…) 2 背景 最近在项目小组中遇到一件事,小组有时候需要演示demo供大家参考,当演示Android手机投屏时,就需要借助第三方软件进行投屏,比如说360手机管家的演示功能还有一个神器Vysor(通过Google浏览器投屏并控制手机),但是随之也会带来问题,通过反编译Vysor的Apk可以看到它是使用adb命令截屏然后通过Async网络库传输屏幕投影给后台,既然有网络操作,如果是公司比较重要的东西,万一第三方在后面偷偷保留了演示录屏(我相信这些应用应该都不会,有职业操守),然后可能就会有自己去做投屏的需求。 3 预览图 今天写的原理都是经过本人实现过的,目前PC端已经正常工作,并且可以投屏多台Android。Web端通过node.js websocket webrtc HTML实现的目前还在开发中,鉴于之前没怎么用过前端,所以写的比较慢。 目前测试实时投影在真实机上还可以。 PC端的动态截图如下。 ![](http://upload-images.jianshu.io/upload_images/2778947-8a87e728b4a3a098.gif?imageMogr2/auto-orient/strip) 时间.gif ![](http://upload-images.jianshu.io/upload_images/2778947-7599f0e5882c029e.gif?imageMogr2/auto-orient/strip) p2 ![](http://upload-images.jianshu.io/upload_images/2778947-81c7dde223025610.gif?imageMogr2/auto-orient/strip) 地图.gif 4 原理图 ![](http://upload-images.jianshu.io/upload_images/2778947-b9c17077a52e9b6a.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) 原理.png 5 投屏 投影屏幕,可以去传输图像也可以去传输视频,具体使用哪一种就去看你的需求。而投影图像又分为通过ADB命令去截取图像以及通过Android的ImageReader获取图像然后通过网络传输两种方式,所以投屏的实现是有很多种的,你想使用哪一种都是可以的。 图像流 现在的产品看到他们都是借助手机连线到电脑端的,通过adb直接去截取图片,这样的话就会很快,如果你只是在公司内部用,使用公司的局域网进行通信我觉得也已经够用了,因此也可以实现通过网络Socket直接去传输图像的字节码。但是现在手机分辨率可高了,因此如果你不对图像进行处理直接通过Socket传输的话那么会让PC端投屏变得很卡,因此AndroidClient可以先对图像进行压缩裁剪之后再去传输。 Android端这块我是开启了一个Service,然后通过ImageReader获取屏幕的图像,之后对图片进行裁剪压缩之后再利用Socket传输图像数据信息。其中的基本代码流程如下: `virtualDisplay = mediaProjection.createVirtualDisplay("MainScreen",width,height,dpi ,DisplayManager.VIRTUAL_DISPLAY_FLAG_PUBLIC,imageReader.getSurface() ,null,screenHandler); imageReader.setOnImageAvailableListener(new ImageReader.OnImageAvailableListener() { @Override public void onImageAvailable(ImageReader imageReader) { Log.i(TAG, "call onImageAvailable"); try { //如果有图片那么就获取 img = imageReader.acquireLatestImage(); if (img != null) { //图像处理 //send 数据 } } }` 视频流 起初我采用的就是图片传输,后来想想其实还是有其他方案的,其实可以通过获取Android手机的屏幕视频流通过H264进行编码进行传输给后台Server,这样可以让画面显示的更加流畅。Android Client里面有一个MediaCodec的类以及VirtualDisplay类可以去读取Android的屏幕流,然后转化为H264视频流。 ...

2017年11月29日 · 1 分钟 · 天边的星星

ToolBar 修改菜单字体和颜色

# ToolBar基本使用 关于ToolBar的使用,网上已经非常多了, ** 思路决定出路 so, 思路是这样的: - 隐藏ActionBar,<strong>这里有两种设定方法** - 布局文件中声明, 没什么说的 - 代码中设定一下,没什么说的 可以参考这里学习: Android 5.x Theme 与 ToolBar 实战 Android Toolbar样式定制详解 ToolBar菜单 ToolBar使用菜单,思路长这样: ** 首先在menu/menu_main.xml去声明布局,然后重写onCreateOptionsMenu(inflate该布局)和onOptionsItemSelected(设定其点击事件)即可,当然也可以通过toolbar.setOnMenuItemClickListener实现点击menu的回调。 这里遇到个坑,我只需要有一个菜单,默认设定后颜色为黑色,和橙色的colorPrimary不搭调,然后想着设定为白色,没想到掉坑里去了,其实我不是一个人:[Android中菜单的字体太小了:设置actionbar中menu的text的size](http://www.crifan.com/android_menu_text_size_too_small/),这位大神很给力,尝试了各种方法,最后搞掂,思路清晰,粗暴但是不简单呐。 我直接从他的解决方法入手,开始搞,然而不是很靠谱,只能修改字体大小,颜色还是黑的,丑爆。 因此来到了这里:Android Toolbar样式定制详解, 方法就是<strong>`添加 ToolBar 主题`** 这个demo运行,完美解决,但是在我自己的项目里,一直出不来效果,一定是哪里出现了问题。。 没错,确实是我的问题,凡事还是多反思自己,我画蛇添足咯,多写了点东西,是什么呢,你们应该猜到了,我们来看: 首先敲定ToolBar布局,加一个theme: </android.support.v7.widget.Toolbar>" data-snippet-id="ext.563df2e6a04501bd3623452810697ad7" data-snippet-saved="false" data-codota-status="done">` &lt;span class="hljs-tag">&lt;&lt;span class="hljs-name">android.support.v7.widget.Toolbar&lt;/span> &lt;span class="hljs-attr">android:id&lt;/span>=&lt;span class="hljs-string">"@+id/toolbar"&lt;/span> &lt;span class="hljs-attr">android:layout_width&lt;/span>=&lt;span class="hljs-string">"match_parent"&lt;/span> &lt;span class="hljs-attr">android:layout_height&lt;/span>=&lt;span class="hljs-string">"?/attr/actionBarSize"&lt;/span> &lt;span class="hljs-attr">android:background&lt;/span>=&lt;span class="hljs-string">"?attr/colorPrimary"&lt;/span> &lt;span class="hljs-attr">app:theme&lt;/span>=&lt;span class="hljs-string">"@style/ToolbarTheme"&lt;/span>&gt;&lt;/span> &lt;span class="hljs-tag">&lt;/&lt;span class="hljs-name">android.support.v7.widget.Toolbar&lt;/span>&gt;&lt;/span>` 然后定义ToolBarTheme样式 注意,此处的坑较多,首先,要有个parent,然后actionMenuTextColor前面**不能有android前缀**,谁加谁怀孕,当然在values-v21/styles.xml里是需要添加android前缀的。 " data-snippet-id="ext.124cfa678dc23e56377d3d6a603f2c55" data-snippet-saved="false" data-codota-status="done"&gt;` &lt;span class="hljs-comment">&lt;!-- ToolBar菜单样式 --&gt;&lt;/span> &lt;span class="hljs-tag">&lt;&lt;span class="hljs-name">style&lt;/span> &lt;span class="hljs-attr">name&lt;/span>=&lt;span class="hljs-string">"ToolbarTheme"&lt;/span> &lt;span class="hljs-attr">parent&lt;/span>=&lt;span class="hljs-string">"@style/ThemeOverlay.AppCompat.ActionBar"&lt;/span>&gt;&lt;/span>&lt;span class="xml"> &lt;span class="hljs-tag">&lt;&lt;span class="hljs-name">item&lt;/span> &lt;span class="hljs-attr">name&lt;/span>=&lt;span class="hljs-string">"actionMenuTextColor"&lt;/span>&gt;&lt;/span>@color/white&lt;span class="hljs-tag">&lt;/&lt;span class="hljs-name">item&lt;/span>&gt;&lt;/span> &lt;span class="hljs-comment">&lt;!-- 敲定颜色--&gt;&lt;/span> &lt;span class="hljs-tag">&lt;&lt;span class="hljs-name">item&lt;/span> &lt;span class="hljs-attr">name&lt;/span>=&lt;span class="hljs-string">"android:textSize"&lt;/span>&gt;&lt;/span>18sp&lt;span class="hljs-tag">&lt;/&lt;span class="hljs-name">item&lt;/span>&gt;&lt;/span> &lt;span class="hljs-comment">&lt;!-- 搞掂字体大小--&gt; &lt;/span>&lt;/span>` &lt;item name="android:textAllCaps"&gt;false&lt;/item&gt; ` &lt;span class="hljs-tag">&lt;/&lt;span class="hljs-name">style&lt;/span>&gt;&lt;/span>` 好了,这样就可以了,ToolBar 修改菜单字体和颜色完成。 &lt;item name="android:textAllCaps"&gt;false&lt;/item&gt; 设置防止都是大写

2017年11月7日 · 1 分钟 · 天边的星星

动态更新Toolbar Menu以及Menu中同时显示文字和图标

我们经常会有这样的需求,在切换Fragment或者点击某个按钮后动态更新Toolbar上Menu项.但是onCreateOptionsMenu方法只在创建Activity的时候调用一次,以后就不再调用了,所以就不能在onCreateOptionsMenu中做处理了。 不过系统提供了另外的一个方法onPrepareOptionsMenu,我们可以在这个方法中做一些逻辑处理,然后在需要更新Menu的地方调用invalidateOptionsMenu方法。 效果图如下: 点击`管理专辑`按钮更换Menu, ![](http://images2015.cnblogs.com/blog/902237/201607/902237-20160720181845747-1609503965.png) ``` &lt;span class="fu">&lt;span class="hljs-meta">@Override&lt;/span>&lt;/span> &lt;span class="kw">&lt;span class="hljs-function">&lt;span class="hljs-keyword">public&lt;/span>&lt;/span>&lt;/span> &lt;span class="dt">&lt;span class="hljs-function">&lt;span class="hljs-keyword">boolean&lt;/span>&lt;/span>&lt;/span> &lt;span class="fu">&lt;span class="hljs-function">&lt;span class="hljs-title">onCreateOptionsMenu&lt;/span>&lt;/span>&lt;/span>&lt;span class="hljs-function">&lt;span class="hljs-params">(Menu menu)&lt;/span> &lt;/span>{ &lt;span class="fu">getMenuInflater&lt;/span>().&lt;span class="fu">inflate&lt;/span>(R.&lt;span class="fu">menu&lt;/span>.&lt;span class="fu">menu&lt;/span>, menu); &lt;span class="kw">&lt;span class="hljs-keyword">return&lt;/span>&lt;/span> &lt;span class="kw">&lt;span class="hljs-keyword">super&lt;/span>&lt;/span>.&lt;span class="fu">onCreateOptionsMenu&lt;/span>(menu); } </div> <div class="sourceCode"> <div class="top-box hide"> </div> ``` `&lt;span class="fu">&lt;span class="hljs-meta">@Override&lt;/span>&lt;/span> &lt;span class="kw">&lt;span class="hljs-function">&lt;span class="hljs-keyword">public&lt;/span>&lt;/span>&lt;/span> &lt;span class="dt">&lt;span class="hljs-function">&lt;span class="hljs-keyword">boolean&lt;/span>&lt;/span>&lt;/span> &lt;span class="fu">&lt;span class="hljs-function">&lt;span class="hljs-title">onPrepareOptionsMenu&lt;/span>&lt;/span>&lt;/span>&lt;span class="hljs-function">&lt;span class="hljs-params">(Menu menu)&lt;/span> &lt;/span>{ &lt;span class="kw">&lt;span class="hljs-keyword">if&lt;/span>&lt;/span> (mIsEditStatus) { menu.&lt;span class="fu">findItem&lt;/span>(R.&lt;span class="fu">id&lt;/span>.&lt;span class="fu">action_share&lt;/span>).&lt;span class="fu">setVisible&lt;/span>(&lt;span class="kw">&lt;span class="hljs-keyword">false&lt;/span>&lt;/span>); menu.&lt;span class="fu">findItem&lt;/span>(R.&lt;span class="fu">id&lt;/span>.&lt;span class="fu">action_edit&lt;/span>).&lt;span class="fu">setVisible&lt;/span>(&lt;span class="kw">&lt;span class="hljs-keyword">true&lt;/span>&lt;/span>); } &lt;span class="kw">&lt;span class="hljs-keyword">else&lt;/span>&lt;/span> { menu.&lt;span class="fu">findItem&lt;/span>(R.&lt;span class="fu">id&lt;/span>.&lt;span class="fu">action_share&lt;/span>).&lt;span class="fu">setVisible&lt;/span>(&lt;span class="kw">&lt;span class="hljs-keyword">true&lt;/span>&lt;/span>); menu.&lt;span class="fu">findItem&lt;/span>(R.&lt;span class="fu">id&lt;/span>.&lt;span class="fu">action_edit&lt;/span>).&lt;span class="fu">setVisible&lt;/span>(&lt;span class="kw">&lt;span class="hljs-keyword">false&lt;/span>&lt;/span>); } &lt;span class="kw">&lt;span class="hljs-keyword">return&lt;/span>&lt;/span> &lt;span class="kw">&lt;span class="hljs-keyword">super&lt;/span>&lt;/span>.&lt;span class="fu">onPrepareOptionsMenu&lt;/span>(menu); }` ``` `<span class="fu">invalidateOptionsMenu</span>(); <span class="co"><span class="hljs-comment">//重新绘制menu</span></span>` ``` 另外的一个需求是在Menu中要显示图标和文字,虽然在`menu.xml`文件中配置了图标和文字,但是在有图标的情况下文字是不会显示的,即使设置 `app:showAsAction="always|withText"` 但是我在运行的时候发现并没有显示文字,处理方法是通过另外一个属性实现`app:actionLayout`. 首先menu.xml定义如下: ...

2017年11月4日 · 3 分钟 · 天边的星星

在android studio3 问题汇总

在android studio3 下面,使用multiDexEnabled true造成导出的包缺少内容(support-v4) 如图:图一添加使用multiDexEnabled true,图二没有添加multiDexEnabled 有没有其他理想的解决方法,希望大家评论给我,谢谢 2.在build.gradle中忽略重复的引用,使用exclude(如果想在一个包忽略多个添加多行) 格式:implementation(‘引用的库’){ exclude group:’包名’,module:’模块名称(通常是包名后面和版本直接的内容)’ } 如果是 implementation project需要写成这种格式(把project扩在小括号中) implementation(project(‘……’)){ …同上 } 注意:可以单独使用group和module(推荐都写上) 例如: implementation(‘com.google.android:flexbox:0.2.3’) { exclude group: ‘com.android.support’, module: ‘appcompat-v7’ } 3. implementation 和compile 区别 (compile是被废弃了) 在AS3.0默认推荐使用implementation,如果依赖有问题使用api代替implementation, 更多参考:(自备梯子)https://developer.android.com/studio/build/gradle-plugin-3-0-0-migration.html 或者:(不用梯子)https://developer.android.google.cn/studio/build/gradle-plugin-3-0-0-migration.html 4.所有项目使用指定库配置(更多请参考:http://www.jianshu.com/p/429733dbbc34) 例如: allprojects { repositories { jcenter() google() } configurations.all((Closure) { resolutionStrategy { force ‘com.android.support:support-v4:26.0.2’ // your version of support library } }) } 希望大家评论交流!!! 转自:http://www.zdltech.com/blogphp/archives/1335.html aapt2的作用说明 开启了aapt2后,资源的增量编译会加速编译速度,但是有些场景aapt2并不是很合适,因此必要的情况下,建议关闭aapt2,比如jenkins上构建时,我们并不需要增量编译,因此可以关闭,可以通过gradle参数达到关闭的效果,命令如下 1 gradle assembleRelease -Pandroid.enableAapt2=false 简单总结了几种不适合使用aapt2的场景 插件化和热修复中,需要使用public.xml的场景 构建过程,需要动态增删改资源的场景,如删除一部分线上不应该出现的资源

2017年11月3日 · 1 分钟 · 天边的星星

Android Studio3.0更新之路(遇坑必入)

序言:作为这个世界上走在最前沿的生物“猿”,怎么能对新事物一无所知呢,10月26日,随着Android 8.1 Oreo的预览版发布,Android Studio3.0正式版也发布了,作为Android开发的猿们我们应该早就知道谷歌在今年5月的开发者大会上就说了要支持Kotlin语言,所以这次更新一个比较大的点就在于支持Kotlin语言了,下面就跟着LZ的脚步来探索一下AS3.0吧 相信很多人很早就体验过谷歌爸爸放出来的体验版本了,虽然说正式版已经出了,但是很多人也不敢轻易贸然的更新,因为怕会掉进坑里出不来(真是一只胆小的猿,鉴定完毕) 安装 如果你从Android Studio内部点击更新的话,会跳转到Android的官网,没有梯子的同学可以去这个网站下载更新: ![Android Studio3.0更新之路(遇坑必入)](http://upload-images.jianshu.io/upload_images/490111-251c2b749c023786.jpg?imageMogr2/auto-orient/strip) Android Studio3.0正式版 安装过程中遇到的问题 1、Gradle Sync failed: `&lt;span class="typ">Gradle&lt;/span>&lt;span class="pln"> sync failed&lt;/span>&lt;span class="pun">:&lt;/span> &lt;span class="typ">Cause&lt;/span>&lt;span class="pun">:&lt;/span>&lt;span class="pln"> com&lt;/span>&lt;span class="pun">.&lt;/span>&lt;span class="pln">android&lt;/span>&lt;span class="pun">.&lt;/span>&lt;span class="pln">build&lt;/span>&lt;span class="pun">.&lt;/span>&lt;span class="pln">gradle&lt;/span>&lt;span class="pun">.&lt;/span>&lt;span class="pln">api&lt;/span>&lt;span class="pun">.&lt;/span>&lt;span class="typ">BaseVariant&lt;/span>&lt;span class="pun">.&lt;/span>&lt;span class="pln">getOutputs&lt;/span>&lt;span class="pun">()&lt;/span>&lt;span class="typ">Ljava&lt;/span>&lt;span class="pun">/&lt;/span>&lt;span class="pln">util&lt;/span>&lt;span class="pun">/&lt;/span>&lt;span class="typ">List&lt;/span>&lt;span class="pun">;&lt;/span> &lt;span class="typ">Consult&lt;/span>&lt;span class="pln"> IDE log &lt;/span>&lt;span class="kwd">for&lt;/span>&lt;span class="pln"> more details &lt;/span>&lt;span class="pun">(&lt;/span>&lt;span class="typ">Help&lt;/span> &lt;span class="pun">|&lt;/span> &lt;span class="typ">Show&lt;/span> &lt;span class="typ">Log&lt;/span>&lt;span class="pun">)&lt;/span> &lt;span class="pun">(&lt;/span>&lt;span class="lit">8s&lt;/span> &lt;span class="lit">123ms&lt;/span>&lt;span class="pun">)&lt;/span> ` 其实一开始不是这个错,最开始是一个redownload的一个错,后来LZ把2.3版本的给删了,缓存给清除了,然后就变成这个错了。既然有错,那就解决呗,顺手百度了一个,下面看看stackoverflow的解决方案 ...

2017年10月29日 · 2 分钟 · 天边的星星