通常来说,为一款已经优化过的手机APP开发平板的版本也不是很难。使用Fragment、decompose Entities等组件就可以又快又轻松地完成。但是,最近遇到一个项目就没有这么简单了。我们不只要开发一个平板APP(基于ActionBarSherlock库,也称作ABS),还需要实现以下功能:
因为我们之前说过已经有了一个开发好的手机APP,所以如果为了讲这个重新设计再编码那就浪费时间了。以下的讲解和描述都是基于已有的代码,通过修改Activity的实现来适配平板设备,已达到代码的最大利用率。
任务概述
这里主要有三个任务:
计算窗口大小
前面提到,我们需要以一个已有的手机APP为基础(使用了ActionBarSherlock库),这个库我们已经以一个外部库的形式集成到项目中,并带有源代码。
如果对ABS的源码很熟悉或者曾对原生ActionBar的构架有了解,就会发现:如果改变Activity的大小,那在调用setContentView方法的时候,功能没有实现:ActionBar的大小和位置都没有变化。这时要做的就是在更高的级别里操作,在系统绘制ActionBar的时候——ABS或者原生的ActionBar,这时候还没有任何窗口的数据,这样我们就可以按照需要调整了。
最显而易见的方式就是改变Window的尺寸,所以这里需要以下这段代码:
@Override public void onAttachedToWindow() { super.onAttachedToWindow(); if (getResources().getBoolean(R.bool.is_tablet) && mOpenAsSmallWindow) { final View view = getWindow().getDecorView(); final WindowManager.LayoutParams lp = (WindowManager.LayoutParams) view.getLayoutParams(); lp.gravity = Gravity.CENTER; lp.width = mActivityWindowWidth; lp.height = mActivityWindowHeight; getWindowManager().updateViewLayout(view, lp); } }
代码执行完毕后,就可以看到窗口的大小已经根据mActivityWindowWidth和mActivityWindowHeight的值发生了改变。
is_tablet检查只对平板有效,mOpenAsSmallWindow标识表示是否让窗口全屏显示或者是否作为新的窗口渲染。
如果在运行的时候报错了,错误日志是:ActionBarView can only be used with Android:layout_width="match_parent" (or fill_parent).那不用担心,我们有ABS的源码,直接修改源码就可以了。
打开ActionBarView这个文件,然后再onMeasure方法里把抛出的异常注释掉——这样应该就可以解决问题了。安卓上使用的是比较特殊的权限控制机制,所以这里我们可以继续深入的不多,也许还能粗略计算菜单项等,不过很多东西我们都不可把控。
注意:这个方法没有在原生ActionBar上测试,因为这里只是在作者的Android版本中测试过。如果要禁用ActionBar,需要找到ActionBarSherlock这个类,然后注释掉以下这行代码:
// registerImplementation(ActionBarSherlockNative.class);
代码运行应该没问题,然后就可以看到不透明背景的Activity了。
添加透明功能
在实现了Activity的尺寸和大小都改变后,现在就要让它透明了。可以给这个平板上的Activity主题添加这个属性:
<item name="android:windowIsTranslucent"> true </item>
这个属性值可以使Activity背景透明。
看起来不错,效果已经基本实现了。
还有一个小问题:以上测试的都是在Nexus7 android4.3上执行,而这个App在Nexus7 的android4.2版本中,Activity没有显示。
经过多次调试和日志检查后,发现我们的Activity(就叫MainActivity吧)没有被销毁(没有调用onDestroy方法),所以Android系统就把它忽略了,没有绘制它。为什么呢?因为Android 4.4 KitKat新增了一个优化算法。因为这个优化算法,Android系统看到Activity为全屏显示模式(不管WindowManager的改变),就会绘制这个MainActivity,但是它之上的东西就被忽略了,所以我们就看不到任何显示了。
我们研究了下这个问题,然后发现对话框和其他不全屏显示的部件都可以正常绘制,所以我们需要在主题theme里加上这几行:
<item name="android:windowIsFloating">true</item> <item name="android:windowCloseOnTouchOutside">false</item> <item name="android:colorBackgroundCacheHint"><a href="http://www.jobbole.com/members/NULL/" rel="nofollow">@null</a></item> <item name="android:backgroundDimEnabled">true</item>
这样问题就解决了。综上所述,我们就实现了一个悬浮、透明的Activity。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持小牛知识库。
本文向大家介绍Android实现顶部悬浮效果,包括了Android实现顶部悬浮效果的使用技巧和注意事项,需要的朋友参考一下 本文实例为大家分享了Android实现顶部悬浮效果的具体代码,供大家参考,具体内容如下 效果图 布局 java 注意事项 1.清单文件需要配置 2.gradle配置需要24以上 3.recyclerView的下滑和swipRefreshLayout的下拉刷新会冲突,所以需要
本文向大家介绍Android实现悬浮对话框代码,包括了Android实现悬浮对话框代码的使用技巧和注意事项,需要的朋友参考一下 先给大家展示下效果图,大家觉效果满意,请参考实现代码。 直接上代码: 首先inflate一个xml文件,产生一个view;再创建一个Dialog,设置Dialog的View为inflate的view;然后通过WindowManager.LayoutParams设置Dial
本文向大家介绍Android实现悬浮可拖拽的Button,包括了Android实现悬浮可拖拽的Button的使用技巧和注意事项,需要的朋友参考一下 本文实例为大家分享了Android实现悬浮可拖拽Button的具体代码,供大家参考,具体内容如下 1、简介 最近,因为项目需要,需要制作一个界面上可拖拽的按钮,网上也有多实例,看了下大部分都是示例不全或讲解不清晰,效果图也不明显,借此自己记录一番自己的
本文向大家介绍Android实现系统级悬浮按钮,包括了Android实现系统级悬浮按钮的使用技巧和注意事项,需要的朋友参考一下 本文实例为大家分享了Android系统级悬浮按钮的具体代码,供大家参考,具体内容如下 具体的需求 1、就是做一个系统级的悬浮按钮,就像iPhone 桌面的那个悬浮按钮效果一样,能随意拖动,并且手一放开,悬浮按钮就自动靠边。 2、可以点击并且可以随意拖动。 3、悬浮按钮自动
问题内容: 我对新的引导程序版本有些困惑,因为它们将下拉菜单更改为div: 你们是否有想法在该代码段的“下拉列表”链接中获得一个悬停下拉列表,而不添加其他脚本代码(仅CSS和引导程序中的脚本)?我已经看到了引导css类,并且无法与引导V3中的类相关(我无需在V3中添加jquery即可完成此操作)。 问题答案: 简单的仅CSS 解决方案: 当单击时,它仍将类切换到它(并且不再悬停时将保持打开状态)。
本文向大家介绍Android中悬浮窗口的实现原理实例分析,包括了Android中悬浮窗口的实现原理实例分析的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了Android中悬浮窗口的实现原理。分享给大家供大家参考。具体如下: 用了我一个周末的时间,个中愤懑就不说了,就这个问题,我翻遍全球网络没有一篇像样的资料,现在将实现原理简单叙述如下: 调用WindowManager,并设置WindowM