热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

优化直播应用底部聊天框弹出机制,确保布局稳定兼容虚拟按键设备

为了优化直播应用底部聊天框的弹出机制,确保在不同设备上的布局稳定性和兼容性,特别是在配备虚拟按键的设备上,我们对用户交互流程进行了调整。首次打开应用时,需先点击首个输入框以准确获取键盘高度,避免直接点击第二个输入框导致的整体布局挤压问题。此优化通过调整`activity_main.xml`布局文件实现,确保了更好的用户体验和界面适配。
图片1图片2图片1图片2

效果图,如上

注意打开应用后,要点击第一个输入框,这是因为先要获取一次键盘的高度,不然首先点击第二个输入框,会出现整体布局挤压的现象。

布局文件

activity_main.xml

"1.0" encoding="utf-8"?>
"http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_hljs-string">"match_parent"
android:layout_hljs-string">"match_parent"
android:background="@drawable/splash"
tools:cOntext="org.dync.softkeyboarddemo.MainActivity">

android:id="@+id/edt"
android:layout_hljs-string">"wrap_content"
android:layout_hljs-string">"wrap_content"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true"
android:hint="获取键盘高度"/>
android:layout_hljs-string">"wrap_content"
android:layout_hljs-string">"wrap_content"
android:text="键盘高度"
android:id="@+id/text"
android:layout_below="@+id/edt"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true" />

android:id="@+id/editText"
android:layout_hljs-string">"match_parent"
android:layout_hljs-string">"wrap_content"
android:layout_alignParentBottom="true"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true" />



在Activity中你只需编写以下代码就可实现底部EditText随键盘移动。
MainActivity

SoftKeyboardUtil.observeSoftKeyboard(activity, new SoftKeyboardUtil.OnSoftKeyboardChangeListener() {
@Override
public void onSoftKeyBoardChange(int softKeybardHeight, boolean isShow) {
mSoftKeybardHeight = softKeybardHeight;
isOpen = isShow;
if (isShow) {
onShowKeyboard(softKeybardHeight);
if (isTouch) {//点击输入框则不移动控件
editText.animate().translationYBy(-softKeybardHeight).setDuration(duration).start();
}
Log.e("TAG", "isShow--平移高度:" + -mSoftKeybardHeight);
} else {
onHideKeyboard(softKeybardHeight);
editText.animate().translationYBy(softKeybardHeight).setDuration(duration).start();
Log.e("TAG", "isHide--平移高度:" + mSoftKeybardHeight);
isTouch = true;//这里一定要设置,不然点击输入框,控件只会在第一次能移动,之后不会移动了
}
}
}
});

editText.setOnTouchListener(new View.OnTouchListener() {

@Override
public boolean onTouch(View v, MotionEvent event) {
Log.e("TAG", "--onTouch--");
if (!isOpen) {//键盘没有打开
if (isTouch) {//这里是因为onTouch()方法会不止一次调用,所以用boolean值来使得控件只移动一次
//这里设为false目的是防止这里延时弹出键盘会触发onSoftKeyBoardChange()会再一次调用移动控件的方法
isTouch = false;
//先移动到键盘弹出的高度再手动弹出键盘,这样就不会出现挤压布局的效果
editText.animate().translationYBy(-mSoftKeybardHeight).setDuration(duration).start();
Log.e("TAG", "平移高度:" + -mSoftKeybardHeight);
new Handler().postDelayed(new Runnable() {
public void run() {
SoftKeyboardUtil.showKeyboard(activity, editText);
}
}, duration);
}
}
return false;//这里不能返回true,不然焦点不会聚焦到该控件
}
});

...

@Override
protected void onDestroy() {
super.onDestroy();
SoftKeyboardUtil.removeGlobalOnLayoutListener(this);
}

代码详情请到github上预览。

转载请注明出处,谢谢!


推荐阅读
  • 如何在Android应用中设计和实现专业的启动欢迎界面(Splash Screen)
    在Android应用开发中,设计与实现一个专业的启动欢迎界面(Splash Screen)至关重要。尽管Android设计指南对使用Splash Screen的态度存在争议,但一个精心设计的启动界面不仅能提升用户体验,还能增强品牌识别度。本文将探讨如何在遵循最佳实践的同时,通过技术手段实现既美观又高效的启动欢迎界面,包括加载动画、过渡效果以及性能优化等方面。 ... [详细]
  • 如何在Java中高效构建WebService
    本文介绍了如何利用XFire框架在Java中高效构建WebService。XFire是一个轻量级、高性能的Java SOAP框架,能够简化WebService的开发流程。通过结合MyEclipse集成开发环境,开发者可以更便捷地进行项目配置和代码编写,从而提高开发效率。此外,文章还详细探讨了XFire的关键特性和最佳实践,为读者提供了实用的参考。 ... [详细]
  • 深入解析 Spring MVC 的核心原理与应用实践
    本文将详细探讨Spring MVC的核心原理及其实际应用,首先从配置web.xml文件入手,解析其在初始化过程中的关键作用,接着深入分析请求处理流程,包括控制器、视图解析器等组件的工作机制,并结合具体案例,展示如何高效利用Spring MVC进行开发,为读者提供全面的技术指导。 ... [详细]
  • APKAnalyzer(1):命令行操作体验与功能解析
    在对apkChecker进行深入研究后,自然而然地关注到了Android Studio中的APK分析功能。将APK文件导入IDE中,系统会自动解析并展示其中各类文件的详细信息。官方文档提供了详细的命令行工具使用指南,帮助开发者快速上手。本文以一个RecyclerView的Adapter代理开源库为例,探讨了如何利用这些工具进行高效的APK分析。 ... [详细]
  • 在开发过程中,针对PHP生成PNG图像时的文字换行处理以及解析包含CDATA段的XML文件的方法进行了深入研究。通过编写特定的函数,成功解决了这些问题,为后续类似场景提供了宝贵的实践经验和技术支持。 ... [详细]
  • 本文深入探讨了 Python Watchdog 库的使用方法和应用场景。通过详细的代码示例,展示了如何利用 Watchdog 监控文件系统的变化,包括文件的创建、修改和删除等操作。文章不仅介绍了 Watchdog 的基本功能,还探讨了其在实际项目中的高级应用,如日志监控和自动化任务触发。读者将能够全面了解 Watchdog 的工作原理及其在不同场景下的应用技巧。 ... [详细]
  • MongoDB Aggregates.group() 方法详解与编程实例 ... [详细]
  • 在Spring框架中,基于Schema的异常通知与环绕通知的实现方法具有重要的实践价值。首先,对于异常通知,需要创建一个实现ThrowsAdvice接口的通知类。尽管ThrowsAdvice接口本身不包含任何方法,但开发者需自定义方法来处理异常情况。此外,环绕通知则通过实现MethodInterceptor接口来实现,允许在方法调用前后执行特定逻辑,从而增强功能或进行必要的控制。这两种通知机制的结合使用,能够有效提升应用程序的健壮性和灵活性。 ... [详细]
  • voc生成xml 代码
    目录 lxmlwindows安装 读取示例 可视化 生成示例 上面是代码,下面有调用示例 api调用代码,其实只有几行:这个生成代码也很简 ... [详细]
  • 探索JavaScript倒计时功能的三种高效实现方法及代码示例 ... [详细]
  • 本文提供了 RabbitMQ 3.7 的快速上手指南,详细介绍了环境搭建、生产者和消费者的配置与使用。通过官方教程的指引,读者可以轻松完成初步测试和实践,快速掌握 RabbitMQ 的核心功能和基本操作。 ... [详细]
  • 题目旨在解决树上的路径最优化问题,具体为在给定的树中寻找一条长度介于L到R之间的路径,使该路径上的边权平均值最大化。通过点分治策略,可以有效地处理此类问题。若无长度限制,可采用01分数规划模型,将所有边权减去一个常数m,从而简化计算过程。此外,利用单调队列优化动态规划过程,进一步提高算法效率。 ... [详细]
  • 对于众多安卓开发者而言,屏幕适配始终是一大挑战,尤其在全面屏普及的当下,这一问题愈发突出。本文旨在提供一种高效且易于实施的屏幕适配方案,不仅适用于全面屏设备,同样兼容传统屏幕,通过具体案例和实践验证,确保开发者能够快速掌握并应用。 ... [详细]
  • 深入学习 Python 中的 xlrd 模块:掌握 Excel 文件读取技巧
    本文深入探讨了 Python 中的 xlrd 模块,重点介绍了如何高效读取 Excel 文件(包括 xlsx 和 xls 格式)。同时,文章还详细讲解了 xlwt 模块在 Excel 文件写操作中的应用。此外,文中列举了常见单元格数据类型及其处理方法,为读者提供了全面的实践指导。 ... [详细]
  • 为了深入了解某些测试框架的工作原理,并在培训中构建一个简单的测试框架,我系统地研究了 should.js 的源代码。本文将分享我的学习过程和分析结果,帮助读者更好地掌握 should.js 的核心机制。 ... [详细]
author-avatar
书友48169582
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有