
如果在Activity中的布局的下方有EditText,获取焦点d出软键盘的时候,如果不做处理,软键盘可能会遮挡输入框,用户提现不好,网上也有很多人提出结局方案,这里就分析一下解决的效果
需要用到EditText的布局大概分为两种,一种是页面显示的内容不希望有残缺,比如软键盘把标题挤出了屏幕,如登录注册搜索等,EditText多半在页面上半部分另一种是页面的上半部分不重要,比如聊天窗口,软键盘d出的时候,上半部分的聊天记录可以被基础屏幕外,EditText多半在最下方其他的情况可以根据本文做出选择, 结果在最下面
开始:
网上针对这个问题解决的方法大概这么几种:
1修改AndroidManifestxml文件
2在Activity中添加配置
3在布局文件中添加ScrollVie
在AndroidManifestxml中对应的Activity配置: android:windowSoftInputMode="stateVisible|adjustResize"
这里SOFT_INPUT_ADJUST_RESIZE和SOFT_INPUT_ADJUST_PAN和上面中的adjustResize和adjustPan效果是一样的
ScrollView是能让d出的软键盘添加到布局的下面,从而不挡住部分布局这里往往需要跟上面的adjustResize和adjustPan两个状态一起用
布局:
向上移的方式 设置:
压缩的方式 设置:
结果:
只要d出软键盘会影响到布局的情况,都用ScrollView把布局包裹起来,被包裹的内容就是可能被缩放或挤出屏幕外的内容然后根据EditText的位置判断用adjustResize还是用adjustPan
adjustResize是收缩adjustPan是向上挤
个人推荐,登录注册用adjustResize,聊天窗口用adjustPan
2015-05-10 14:00
Espresso 是Android官方提供的一个UI测试框架,适合应用中的功能性 UI 测试。用于测试应用中的用户流,适合用来白盒自动化测试。支持android234(API 10)及以上版本。
Espresso 是基于instrumentation api,在AndroidJUnitRunner上运行。
在module的buildgradle文件中添加依赖
使用android studio生成的项目中已经自动添加了改依赖
排斥support-annotations是因为espresso的support-annotations类库与android的support-annotations类库版本冲突
然后关闭模拟器或测试机的动画效果,因为测试用例执行的速度比较快,动画慢的话会影响测试用例的执行(比如消失动画会遮住后面View的点击事件)。
关闭动画步骤:打开设置-开发者选项,关闭以下动画缩放:
Espresso测试逻辑:
1通过EspressoonView(view)来找到要测试的UI组件在Activity中
2通过ViewInteractionperform(action)或DataInteractionperform(action)来模拟用户的 *** 作事件,如文本输入,点击,手势等。可以通过逗号分隔一次传入多个 *** 作事件。
3如果要测试用例要通过多个activity,重复以上的步骤
4使用ViewAssertions来检查预期的结果与测试用例结束后的结果是否一致
例如:
登录测试:
ActivityTestRule 提供单个Activity的方法测试。和JUnit的测试逻辑一致,@Test注解的方法就是会运行的测试方法。@Before即测试方法执行之前会被调用的方法。@After为测试方法执行完成之后会被调用的方法。在所有@Test标注的方法执行时,该Activity会被启动。
要找到对应的View,需要在OnView()方法中传入对应的view matcher。onView方法返回一个ViewInteraction对象,该对象允许测试方法与view交互。但是若onView的对象是RecyclerView,可能不会到达期望的交互结果,需要特殊处理。
若 OnView方法传入的view matcher找不到对应的view则会抛出NoMatchingViewException,中断测试方法的执行
view matcher就是根据一个条件在布局中找到对应的View组件。
如,通过显示的文本内容找到对应的View:
通过Id:
还可以使用allOf来组合多个条件:
allOf可以使用not关键字:
为提高测试方法执行的效率,应该尽量使用最少,最快的匹配规则。如通过的唯一的Id能找到对应的View,就不要通过text去匹配。
在 AdapterView中,所有子view都是动态生成的在运行中,如果通过onView方法去匹配对应的view,可能会找不到。所以Espresso提供了一个onData方法,该方法会返回一个DataInteraction对象去交互对应的ViewEspresso加载目标View到当前的view hierarchyEspresso同时也处理滚动到目标View,并获取焦点。
例如:
调用 ViewInteractionperform() 或 DataInteractionperform() 方法来模拟用户在View上的交互事件。当传入多个事件时,Espresso会按顺序执行对应的 *** 作。
ViewActions包含多种常用的 *** 作方式:
ViewActionsclick() 点击事件
ViewActionstypeText() 点击输入框并输入对应的文本
ViewActionsscrollTo() 滚动到某个View 对应的View必须是 ScrollView的子类,并且 View的android:visibility属性必须是VISIBLE 若是 AdapterView 的子类则使需用 onData() 方法来处理
ViewActionspressKey() 点击按键
ViewActionsclearText() 清除文本框的文本
Espresso Intents 用来验证和模拟应用发出的Intent
添加依赖:
为了测试Intent,你先要创建一个 IntentsTestRule类的实例,和ActivityTestRule作用一致。
Espresso Web是用来测试WebView的一个组件,它使用 WebDriver API来检查和控制WebView的行为
添加依赖:
要测试WebView,需要在WebView中允许运行JavaScript。
例:
Espresso在测试 *** 作中是线程安全的。Espresso会等待当前进程的消息队列中的UI事件,并且在任何一个测试 *** 作中会等待其中的AsyncTask结束才会执行下一个测试。
但是有许多的应用后台的 *** 作都是使用自定义的服务去创建以及管理线程的,这时Espresso就无法同步了。Espresso等待app处于idle状态,才会执行下个动作或检查下个断言。
Idle状态是指应用的当前消息队列中没有UI事件或默认的AsyncTask线程池没有任务。app以其他方式执行长时间异步 *** 作,Espresso无法知道何时这些 *** 作已经完成。所以引入了IdlingResource来告诉Espresso是否可以继续执行测试。
IdlingResource是一个简单的接口,包含三个方法:
getName():必须返回代表idling resource的非空字符串;
isIdleNow():返回当前idlingresource的idle状态。如果返回true,onTransitionToIdle()上注册的ResourceCallback必须必须在之前已经调用;
registerIdleTransitionCallback:通常此方法用于存储对回调的引用来通知idle状态的变化。
例:等待登录接口返回结果
调用登录接口时会先d出LoadingDialogFragment,若LoadingDialogFragment已经能从FragmentManager中找到时说明已经开始调用接口了,调用resourceCallbackonTransitionToIdle(),isIdleNow返回false,告诉Espresso等待。若接口调用完成会关闭LoadingDialogFragment,此时isIdleNow返回true,表示app进入Idle状态,可以继续执行后面的测试。若接口调用失败,LoadingDialogFragment会显示出对应的错误信息,并不会自动关闭,此时还是非Idle状态。所以加入了一个等待时间的最大值,接口等待时间超过这个时长则直接执行后面的检查。
注册IdlingResource
只有注册了的IdlingResource才能被执行,大部分情况下是在@Before方法内注册,在@After内取消注册。
这个简单,你在界面用ScrollView布局,
里面用一个RelativeLayout铺满父窗口,RelativeLayout用布局,居下,这样,当获取焦点的时候,就会自动上去了,
还需要在manifest文件中,对activity设置android:windowSoftInputMode="stateHidden|adjustResize"
方法一
在你的activity中的oncreate中setContentView之前写上这个代码
getWindow()setSoftInputMode(WindowManagerLayoutParamsSOFT_INPUT_ADJUST_PAN);
方法二
在 项目的AndroidManifestxml文件中界面对应的<activity>里加入
这样会让屏幕整体上移。如果加上的 是 android:windowSoftInputMode="adjustPan"这样键盘就会覆盖屏幕。
关于android:windowSoftInputMode
activity主窗口与软键盘的交互模式,可以用来避免输入法面板遮挡问题,Android15后的一个新特性。
这个属性能影响两件事情:
一当有焦点产生时,软键盘是隐藏还是显示
二是否减少活动主窗口大小以便腾出空间放软键盘
它的设置必须是下面列表中的一个值,或一个”state…”值加一个”adjust…”值的组合。在任一组设置多个值——多个”state…”values,例如&mdash有未定义的结果。各个值之间用|分开。
例如:
<activityandroid:windowSoftInputMode="stateVisible|adjustResize" >
在这设置的值(除"stateUnspecified"和"adjustUnspecified"以外)将覆盖在主题中设置的值
方法三
把顶级的layout替换成ScrollView,或者说在顶级的Layout上面再加一层ScrollView。这样就会把软键盘和输入框一起滚动了,软键盘会一直处于底部。
可以在清单文件AndroidManifestxml中修改activity的windowSoftInputMode属性为"adjustPan"
<activityandroid:windowSoftInputMode="adjustPan">
</activity>
android:windowSoftInputMode是设置活动的主窗口如何与包含屏幕上的软键盘窗口交互的属性
有以下取值
"stateUnspecified"
软键盘的状态 (是否它是隐藏或可见 )没有被指定。系统将选择一个合适的状态或依赖于主题的设置。
这个是为了软件盘行为默认的设置。
"stateUnchanged"
软键盘被保持无论它上次是什么状态,是否可见或隐藏,当主窗口出现在前面时。
"stateHidden"
当用户选择该 Activity时,软键盘被隐藏——也就是,当用户确定导航到该 Activity时,而不是返回到它由于离开另一个 Activity。
"stateAlwaysHidden"
软键盘总是被隐藏的,当该 Activity主窗口获取焦点时。
"stateVisible"
软键盘是可见的,当那个是正常合适的时 (当用户导航到 Activity主窗口时 )。
"stateAlwaysVisible"
当用户选择这个 Activity时,软键盘是可见的——也就是,也就是,当用户确定导航到该 Activity时,而不是返回到它由于离开另一个Activity。
"adjustUnspecified"
它不被指定是否该 Activity主 窗口调整大小以便留出软键盘的空间,或是否窗口上的内容得到屏幕上当前的焦点是可见的。系统将自动选择这些模式中一种主要依赖于是否窗口的内容有任何布局 视图能够滚动他们的内容。如果有这样的一个视图,这个窗口将调整大小,这样的假设可以使滚动窗口的内容在一个较小的区域中可见的。这个是主窗口默认的行为 设置。
"adjustResize"
该 Activity主窗口总是被调整屏幕的大小以便留出软键盘的空间
"adjustPan"
该 Activity主窗口并不调整屏幕的大小以便留出软键盘的空间。相反,当前窗口的内容将自动移动以便当前焦点从不被键盘覆盖和用户能总是看到输入内容的部分。这个通常是不期望比调整大小,因为用户可能关闭软键盘以便获得与被覆盖内容的交互 *** 作。
所以选择adjustPan可以满足需求
以上就是关于EditTextd出软键盘遮住输入框问题全部的内容,包括:EditTextd出软键盘遮住输入框问题、Android Espresso、android 系统输入法如何可以使上面带有朋友圈一样的输入框等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)