平时当我们切换输入法和表情栏时Layout会一闪一下这样用户体验很不好。至于表情栏要和输入法高度一致网上资料有很多的,这不是本文的重点。话不多说先上效果。

前提

在manifest.xml中<Activity>标签下添加:
android:windowSoftInputMode="adjustResize"
  • 由于我是手动获取的EditText焦点所以 布局大概是这个样子的
  ...
<FrameLayout android:layout_width="0dp"android:layout_height="wrap_content"android:layout_weight="1"android:layout_gravity="center_vertical"><EditTextandroid:id="@+id/inputText"android:layout_width="match_parent"android:layout_height="42dp"android:focusable="false"android:background="@drawable/shape"android:imeOptions=""/><LinearLayoutandroid:id="@+id/layout_edit"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"/></FrameLayout>...


主要就是在EditText上多罩一层通过Layout然后通过layout手动获取输入焦点

/*** 获取焦点*/
layout_edit.setOnClickListener {
...//获取输入框焦点getInputTextFouce()//弹出输入法showSoftInput()
...}
}

然后主要逻辑就是:给button 添加flag 判断当前的状态,只需要在显示的时候通过handler延时改变SoftInputMode。
具体代码(我这半吊子的Kotlin哈哈哈哈):

/*** 监听输入框变化*   msg.what*/
private val HIDDEN_KEYBORD = 4
private val SHOW_SOFTKEYBORD = 5
private val IMAGE_WHAT = 6/***弹框button状态的* flage*/
private var flag: Boolean = true
private var LAYOUT = false@RequiresApi(Build.VERSION_CODES.O)
override fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)//延时更改SoftInputMode的HandlerinitUiHandler()//uiinitViewClickListener()
}/*** uiHandler*/private  fun initUiHandler(){initUiHandler = @SuppressLint("HandlerLeak")object : Handler(){override fun handleMessage(msg: Message?) {super.handleMessage(msg)when(msg!!.what){//设置软键盘的模式SHOW_SOFTKEYBORD ->{window.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE)//  自动布局hiddenAnimation()}HIDDEN_KEYBORD ->{window.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE)// 自动布局hiddenAnimation()}IMAGE_WHAT ->{//重置点击状态LAYOUT = falsehiddenWindowAnimation()recycler.scrollToPosition(mList.size - 1)}}}}
}/*** 相册,拍照* 显示动画*/
@RequiresApi(Build.VERSION_CODES.LOLLIPOP)
private fun  showWindowAnimation(){//平移动画效果val translateAnimation = TranslateAnimation(Animation.RELATIVE_TO_SELF,0.0f,Animation.RELATIVE_TO_SELF,0.0f,Animation.RELATIVE_TO_SELF,1.0f,Animation.RELATIVE_TO_SELF,0.0f)//动画的持续时间translateAnimation.duration = 200bottom_layout.animation = translateAnimationlayout.animation = translateAnimationbottom_layout.visibility = View.VISIBLE//消息移动到最后一行val msg = Message()msg.what = 1initUiHandler!!.sendMessageDelayed(msg, 200)}/*** /输入框不变的显示动画*/
private fun showAnimation(){val translateAnimation = TranslateAnimation(Animation.RELATIVE_TO_SELF,0.0f,Animation.RELATIVE_TO_SELF,0.0f,Animation.RELATIVE_TO_SELF,1.0f,Animation.RELATIVE_TO_SELF,0.0f)//动画的持续时间translateAnimation.duration = 200bottom_layout.animation = translateAnimationbottom_layout.visibility = View.VISIBLE//消息移动到最后一行val msg = Message()msg.what =1initUiHandler!!.sendMessageDelayed(msg,200)}/*** 输入框不变的隐藏动画*/private fun hiddenAnimation(){val translateAnimation = TranslateAnimation(Animation.RELATIVE_TO_SELF,0.0f,Animation.RELATIVE_TO_SELF,0.0f,Animation.RELATIVE_TO_SELF,0.0f,Animation.RELATIVE_TO_SELF,1.0f)//动画的持续时间translateAnimation.duration = 200bottom_layout.animation = translateAnimationbottom_layout.visibility = View.GONE}
/*** 相册,拍照* 隐藏动画*/
private fun  hiddenWindowAnimation() {//平移动画效果val translateAnimation = TranslateAnimation(Animation.RELATIVE_TO_SELF,0.0f,Animation.RELATIVE_TO_SELF,0.0f,Animation.RELATIVE_TO_SELF,0.0f,Animation.RELATIVE_TO_SELF,1.0f)//动画的持续时间translateAnimation.duration = 200bottom_layout.animation = translateAnimationbottom_layout.visibility = View.GONE
}
/*** 淡出动画*/
private fun hiddenWindowGradientAnimation(){bottom_layout.animate().alpha(0f)//0 ~100.setDuration(200).setListener(object: AnimatorListenerAdapter() {override fun onAnimationEnd(animation: Animator?) {super.onAnimationEnd(animation)bottom_layout.visibility = View.INVISIBLE}})}/*** 淡入动画*/private fun showWindowGradientAnimation(){bottom_layout.animate().alpha(100f).setDuration(200)//间隔.setListener(object: AnimatorListenerAdapter() {override fun onAnimationEnd(animation: Animator?) {super.onAnimationEnd(animation)bottom_layout.visibility = View.VISIBLE}})
}private fun initViewClickListener(){/*** 弹框*/btn_getWindow.setOnClickListener{//第一次点击if (!LAYOUT) {window.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_NOTHING)//  不改变布局,隐藏键盘,//选择框动画,如果键盘存在在消失键盘showWindowAnimation()showWindowGradientAnimation()//隐藏输入法取消焦点hideSoftInput()cancleTextFouce()}else {//第二次点击以及第三次点击if (flag) {//第一次第二次点击时输入法处于打开状态if (isVisibleForLast){window.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_NOTHING)//  不改变布局,隐藏键盘,showAnimation()showWindowGradientAnimation()hideSoftInput()cancleTextFouce()}else{window.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_NOTHING)//  不改变布局,隐藏键盘,//获取焦点getInputTextFouce()//显示输入法showSoftInput()hiddenWindowGradientAnimation()val msg = Message()msg.what = HIDDEN_KEYBORDinitUiHandler!!.sendMessageDelayed(msg,400)flag = falseLAYOUT = false}} else {window.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_NOTHING)//  不改变布局,隐藏键盘,showAnimation()showWindowGradientAnimation()cancleTextFouce()hideSoftInput()flag = true}}LAYOUT = true}/*** recyclerView' TouchEvent 我这边的内容布局使用的是RecyclerView  主要就是用来丰富逻辑*/recycler.setOnTouchListener { v, event ->//隐藏输入法hideSoftInput()//隐藏输入框hiddenWindowAnimation()LAYOUT = falseflag = truereturn@setOnTouchListener false}/*** 获取焦点*/layout_edit.setOnClickListener {//如果底部选择栏打开if (  bottom_layout.visibility == View.VISIBLE){//当前的输入法模式为为 SOFT_INPUT_ADJUST_NOTHINGgetInputTextFouce()showSoftInput()hiddenWindowGradientAnimation()//延时设置模式为 SOFT_INPUT_ADJUST_RESIZEval message = Message()message.what = SHOW_SOFTKEYBORDinitUiHandler!!.sendMessageDelayed(message,600)flag = false} else{//自动调整布局window.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE)//获取输入框焦点getInputTextFouce()//弹出输入法showSoftInput()//显示最后一条消息initUiHandler!!.sendEmptyMessageDelayed(1,100)//重置选择栏的状态LAYOUT = true}}
/*** 获取输入框焦点*/
private fun getInputTextFouce():Boolean{//获取焦点inputText.isFocusable = trueinputText.isFocusableInTouchMode = trueinputText.requestFocus()return true
}/*** 取消输入框焦点*/
private fun cancleTextFouce(){inputText.isFocusable = falseinputText.isFocusableInTouchMode = falseinputText.requestFocus()
}/*** 显示输入法*/private fun showSoftInput(){//显示输入法val imm: InputMethodManager = getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManagerimm.showSoftInput(inputText,InputMethodManager.SHOW_FORCED)}
/*** 隐藏输入法*/private fun hideSoftInput(){//隐藏输入法val imm: InputMethodManager = getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManagerimm.hideSoftInputFromWindow(inputText.windowToken,0)}当然了还有一点需要注意一下就是当我们输入法处于打开的状态时,去切换app 会造成输入法仍然处于打开状态,这样的话体验就会极差。只要在Acvivity的生命周期中做好判断就好了。以上都是我个人的逻辑可能会有点乱哈哈哈哈,本来就很绕。

输入法与表情栏无缝切换相关推荐

  1. Android获取输入法高度——输入法与页面布局无缝切换

    在QQ或者微信的聊天页面,当输入法和表情栏互相切换时,过度非常自然,而且表情栏高度刚好跟输入法一样.个人感觉这种用户体验特别的好,别看这个细节小,但代码实现处理起来还是有一定难度.今天我就带大家来实现 ...

  2. IM即时通讯项目讲解(一) 实现类似qq微信表情面板无缝切换

    IM即时通讯项目讲解(一)--实现类似qq微信表情面板无缝切换 标签(空格分隔): 开源项目 ###该系列技术课程来源慕课IM实战 带后台的IM即时通讯App 全程MVP手把手打造 #####通过该课 ...

  3. Android输入法与页面布局无缝切换

    背景 最近在做一个笔记相关的项目,涉及到输入法与页面布局间的切换,以前最多就是控制输入法显示隐藏,所以在做的过程中遇到一些闪屏的问题,在此记录一下. 如图,在输入法上方悬浮一个tab栏,在点击切换字体 ...

  4. IM即时通讯项目讲解(一)--实现类似qq微信表情面板无缝切换

    该系列技术课程来源慕课IM实战 带后台的IM即时通讯App 全程MVP手把手打造 通过该课程可以学习到以下知识点 1.了解和开发后台项目(这个是需要长期积累的,有了这个可以说入门没问题) 2.学习到I ...

  5. Flutter键盘与同区域面板(如表情)无缝切换切换

    很久之前在Android的Native开发过聊天类APP,有过接触的同学都会碰到一个绕不过的问题: 在下面几种场景中会出现一些"体验问题": 1.键盘->表情面板 2.表情面 ...

  6. 是否存在两台 MacOS 之间无缝切换的办法?

    可能是奢望,不过万一实现了呢? 假设我有一台 Mac mini 和一台 Macbook Pro,大多数时候我会在 Mac Mini 上开发.但是偶尔坐累了(站累了)我想拿起 MacBook Pro 躺 ...

  7. 网易云游戏来了:手机电脑电视随时接入可玩,高流畅度低延迟,还能跨终端无缝切换...

    点击上方"AI遇见机器学习",选择"星标"公众号 重磅干货,第一时间送达 允中 发自 凹非寺 量子位 报道 | 公众号 QbitAI 囿于版号的游戏行业,终于快 ...

  8. java写左侧导航栏界面,jQuery----左侧导航栏面板切换实现

    页面运行结果: 点击曹操 点击刘备 点击孙权 原图 需求说明:原图如上所示,点击一方诸侯的时候,显示该诸侯手下猛将,其他诸侯手下猛将隐藏 页面结构: 实现思路: ①给大的li注册鼠标点击事件 当鼠标点 ...

  9. 安卓蓝牙键盘按键映射_多设备无缝切换 雷柏XK100无线蓝牙轻薄键盘评测

    对于现代办公用户来讲,肯定很多人会遇到像我一样的问题,那就是桌面上除了笔记本电脑之外,还有平板.手机等设备,而且这三个设备没办法整合到一块屏幕上,每当需要切换设备进行文字输入的时候,就会浪费很多的时间 ...

最新文章

  1. 使用Python和OpenCV进行文本偏斜校正
  2. html5页面输出语句,使用html5输出文件
  3. java servlet 请求_Java中前台JSP请求Servlet实例(http+Servlet)
  4. 在vim粘贴系统剪切板里的内容
  5. 使用Docker构建Jekyll站点
  6. C. 防止E-mail注入
  7. Mining Precision Interface From Query Logs -- 学习笔记(二)
  8. Win32下显示、隐式加载DLL的方法
  9. 计算机组成原理r型指令logisim实现_全国计算机二级MS office选择题增分速记宝典!...
  10. Leetcode 刷题笔记(二十六) ——动态规划篇之经典问题:打家劫舍
  11. paip.c++ qt __gxx_personality_sj0 __gxx_personality_v0问题的解决
  12. MySQL中的alter table命令的基本使用方法及提速优化
  13. Windows易升升级指南(解决大版本间更新95%的问题)
  14. k8s环境之cicd部署+远程触发
  15. Excel文件筛选结果
  16. 音乐信号音符/乐谱提取
  17. [Python3]pandas.merge用法详解
  18. linux man 中文 mac,技术|MAC 系统中显示中文MAN手册
  19. Python城堡漫游记之第0章误入游戏空间
  20. ElasticSearch【从入门到服务器部署项目案例】详细教程

热门文章

  1. 程序员VS文艺男!!论发型的重要性,堪比整容!
  2. Prometheus 环境搭建
  3. mac苹果电脑删除顽固残留软件图标
  4. 恒指长期情况研判(期指来判断)
  5. 微博平台架构和安全——微博平台首席架构师杨卫华演讲
  6. 人死了后还有来生吗?
  7. 两道小学生的题----1000: 梦里的难题、1002: 拳皇
  8. 一个简单的DGA(Domain Generate Algorithm)
  9. Hive分析、窗口函数
  10. ArTalk | 兆芯安超云:打造国产桌面云新势力