Android UI开发中所遇到的各种坑

1.软键盘隐藏问题

  • 问题描述:Activity按下返回调用finish()方法后,界面已经销毁,但是软键盘依然还留在屏幕上,这让当前正在显示的Activity没有输入框的完全没法看,非常严重的视觉影响。
  • 尝试方案:寻找各种方法去隐藏软键盘,网上各种找。思路是在活动退出时,会调用onDestroy方法销毁界面,在这个方法里面想办法隐藏界面即可。找到下面这种方法,但还是不行。还尝试过用基类找到所有edittext然后让它们失去焦点,隐藏软键盘。
InputMethodManager im = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
im.hideSoftInputFromWindow(getCurrentFocus().getApplicationWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);
  • 解决方案:一开始在onDestroy()里调隐藏软键盘的思路就是错的,因为onDestroy()之前还有两个生命周期方法,像上述隐藏软键盘的方法有个getCurrentFocus(),在onDestroy()之前肯定得不到正确的获取当前焦点的那个控件了。所以在onPasue()方法里隐藏软键盘就有效,在onDestroy()方法里不管用任何方法都是无效的。
  • 注意点:用这个隐藏软键盘的方法,最好做为空判断,否则有可能会出现空指针的异常,如当前界面没有控件获取焦点时,则getCurrentFocus()这个方法得到的是一个null.
InputMethodManager im = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
if(getCurrentFocus!=null)
im.hideSoftInputFromWindow(getCurrentFocus().getApplicationWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);
  • 软键盘占用布局问题,软键盘有时会把一些控件覆盖掉,这时如何把整个界面向上顶起,让任何控件都不会被覆盖呢?有两步,第一在activity里设置一个属性,如下。第二步,布局里加一个scrollview将你要被顶起的视图放进这里,然后当软键盘显示的时候,就会在scrollview里滚动以获得空间进行显示软键盘。

<activity Android:windowSoftInputMode="adjustResize">

2.merge标签注意点

  • merge标签只有在根布局是FrameLayout时才有用,因为安卓所有界面的根布局都是FrameLayout,所以可以用merge标签进行融合。
  • merge标签使用后,布局里即使有EditText也无法自动获得焦点,只能手动设置焦点, 调用requestFocus()方法。或者是用requestFocus》在XML布局文件里。
  • 使用后要注意如果在根布局中,则不能用LayoutInflater来生成一个view,否则会报如下错误,由于我在listview的getview()里用了这个带有merge的布局,所以崩溃了。补充一点,inflater()方法里可以设置attach root为true则可以解析出来,不会出现崩溃。
 android.view.InflateException: Binary XML file line
 #2: <merge /> can be used only with a valid ViewGroup root and attachToRoot=true
   Caused by: android.view.InflateException: <merge /> can be used only with a valid ViewGroup root and attachToRoot=true

3.LinearLayout注意点

  • 线性布局默认是水平的,要善用weight权重这个属性。
  • 非常重要的点,如果方向设为水平,则layout_gravity的top与bottom标签是没有效果的。如果方向设为垂直,则left与right是没有效果的,这时如果想放在靠右的地方,则可以使用space标签,将宽度设为0dp,将layoutweight设为1放在控件前边即可。

4. 布局选择

FrameLayout是最简单的一种布局,所有安卓界面的根布局都是FrameLayout,加载速度最快。

LinearLayou布局与RelativeLayout布局的加载速度需要进一步深入的研究才能得出具体结论。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对我们的支持。如果你想了解更多相关内容请查看下面相关链接

(0)

相关推荐

  • Android Studio中使用jni进行opencv开发的环境配置方法

    使用jni进行opencv开发可以快速地将PC端的opencv代码移植到手机上,但是如何在android studio下进行配置,网上几乎找不到教程,大多都是eclipse下使用mk文件的方法,找不到使用gradle的方案,摸了几天,总算是摸清楚了. 其实找对了方法,用android studio配置环境要比eclipse简单很多,首先是预先准备的环境: 1.Android studio,官网最新版,我用的是2.3.1: 2.OpenCV4Android,官网最新版,我用的3.2.0: 就这两个

  • Android开发教程之获取系统输入法高度的正确姿势

    问题与解决 在Android应用的开发中,有一些需求需要我们获取到输入法的高度,但是官方的API并没有提供类似的方法,所以我们需要自己来实现. 查阅了网上很多资料,试过以后都不理想. 比如有的方法通过监听布局的变化来计算输入法的高度,这种方式在Activity的配置中配置为"android:windowSoftInputMode="adjustResize""时没有问题,可以正确获取输入法的高度,因为布局此时确实会动态的调整. 但是当Activity配置为"

  • Android快速开发系列 10个常用工具类实例代码详解

    打开大家手上的项目,基本都会有一大批的辅助类,今天特此整理出10个基本每个项目中都会使用的工具类,用于快速开发~~在此感谢群里给我发项目中工具类的兄弟/姐妹~ 1.日志工具类L.java package com.zhy.utils; import android.util.Log; /** * Log统一管理类 * * * */ public class L { private L() { /* cannot be instantiated */ throw new UnsupportedOpe

  • Android开发解决popupWindow重叠报错问题

    在popupWindow里面再弹出popupWindow的时候会报这样的错误 ERROR/AndroidRuntime(888): android.view.WindowManager$BadTokenException: Unable to add window -- token android.view.ViewRoot$W@44ef1b68 is not valid; is your activity running? 报错的意思大概就是说依赖的Activity没了. 解决方法1 不要在当

  • Android开发中那些需要注意的坑

    这个是看知乎的时候发现的一个问题,感觉挺有意思,就将自己遇到的坑记录下来. 1.Andorid L theme colorPrimary 不能使用带有alpha的颜色值,否则会有异常抛出, 直接判断了是否alpha是否等于0或者255,其他都会异常 @Override protected void onApplyThemeResource(Resources.Theme theme, int resid, boolean first) { if (mParent == null) { super

  • Android开发腾讯验证码遇到的坑

    我司为响应有关部门的号召,要求新注册的用户必须提供手机号验证.又为了防范有不怀好意之人故意盗刷短信,我司决定接入验证码.经前端同事调研之后,决定接入腾讯验证码.接入过程中还是踩了一些坑,为此特地写这篇文章 致腾讯令人作呕的开发文档 . 腾讯验证码开发指引 我们是Android端开发,服务器端的开发就交给后端同事吧.移动端的开发只需要从我们的后台请求一个url就可以. 移动端开发首先请阅读APP开发指引,接着阅读不同移动平台的API文档.Android开发者直接阅读Android客户端API就好了

  • Android开发笔记之如何正确获取WebView的网页Title

    前言 现在APP中用到H5页面的越来越多,而如何正确获取WebView的网页title是必须要考虑的. 最近做项目的时候,老大让我把之前做的webview打开网页的功能修改一下,说是要动态的获取网页的标题,然后显示在我们自己app的标题栏上,然后我就屁颠屁颠的跑去看webview的源码,看看有没有获取标题这个方法. 网上能查的大部分方法都是在WebChromeClient的onReceivedTitle(WebView view, String title)中拿到title.但是这个方法在网页回

  • Android—基于微信开放平台v3SDK开发(微信支付填坑)

    接触微信支付之前听说过这是一个坑,,,心里已经有了准备...我以为我没准跳坑出不来了,没有想到我填上了,调用成功之后我感觉公司所有的同事都是漂亮的,隔着北京的大雾霾我仿佛看见了太阳~~~好了,装逼结束...进入正题 开发准备: 1.在微信开放平台申请账号 2.成功后创建应用,就是填一些看似很官方很正经的资料了...(说审核7天左右,没有意外的情况下你的app第二天就审核成功了是不是很开心,有了appid,是不是就可以调用微   信支付了????-------想多了,真的) 3.微信支付是需要额外

  • 使用Win10+Android+夜神安卓模拟器,搭建ReactNative开发环境

    前言 网上的教程皮的简直不谈了,非要搞个AndroidStdio,你以为呢?反手就是一重锤,我就是不装,第一开发的很多工作都不需要这个IDE,第二运行起来还很吃内存,经过实践有如下的教程,请大家指教. 安装 git 不说了,我相信你早就安装了,有需要的参考:https://www.jb51.net/article/148066.htm Java8 需要配置环境变量JAVA_HOME,CLASS_PATH和path路径,配置方式如下 安装Android SDK 参考我的另一篇文章 配置androi

  • Android开发手机无线调试的方法

    是不是还在为了手机usb被占用而不能链接编译器而难过?是不是感觉无线调试遥不可及? 读完下面的几步 让你轻松掌握无线调试. 1. 首先将你的手机连接到无线网 2. 将你的手机链接到电脑上 3. Window 配置好adb Linux 安装好adb 4. 确认手机链接到无线网络需要和你的电脑在同一个无线网络内 5. 在命令端输入 $ adb tcpip 5555 (5555为端口号,可以自由指定) 然后在输如下命令 $ adb tcpip 此时你可以查看到 自己手机的ip地址 大概如下所示 10.

  • Android开发图片水平旋转180度方法

    如下所示: <ImageView android:src="@drawable/icon_common_return" android:layout_centerInParent="true" android:id="@+id/lv_common_return" android:layout_width="wrap_content" android:layout_height="wrap_content&quo

随机推荐