实现qq聊天界面设计 完美解决edittext 软键盘弹出时listview背景不被挤压+listview Item和edittext的相对位置不变
来源:互联网 发布:淘宝怎么注册卖家 编辑:程序博客网 时间:2024/05/20 21:58
最近在写一个聊天窗口,要实现软键盘弹出时listview背景不被挤压,并且弹出时Item和edittext的相对位置不变,困扰了好几天,查了很多资料,发现都没有这方面的完整内容,顾在此记录一下。与大家分享。
先预览:
首先创建布局,相信大家都会这里不做介绍。。。直接上代码
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" android:id="@+id/rootview" android:background="@drawable/splash"> <ListView android:id="@+id/id_dialog_listview" android:layout_width="match_parent" android:layout_height="0dp" android:layout_weight="1" android:divider="@null" android:stackFromBottom="true" android:transcriptMode="alwaysScroll" android:dividerHeight="10dp"></ListView> <LinearLayout android:id="@+id/id_bar" android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal" android:background="@android:color/transparent"> <EditText android:id="@+id/id_dialog_editText" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_gravity="bottom" android:layout_marginLeft="5dp" android:layout_weight="4" android:maxLines="5"/> <LinearLayout android:layout_width="0dp" android:layout_height="match_parent" android:layout_weight="1" android:layout_marginLeft="2dp" android:gravity="bottom"> <Button android:id="@+id/id_dialog_button" android:layout_width="0dp" android:layout_height="39dp" android:layout_weight="1" android:layout_gravity="bottom" android:layout_marginBottom="3dp" android:layout_marginRight="5dp" android:gravity="center" android:text="发送" android:textSize="14sp"/> </LinearLayout> </LinearLayout></LinearLayout>
布局完成后写Java代码,现在首先要计算软键盘高度h,然后通过软键盘高度h使整个布局上移h,计算软键盘高度方法如下:
SoftKeyBoardListener.java
import android.app.Activity;import android.graphics.Rect;import android.view.View;import android.view.ViewTreeObserver;/** * Created by cjh on 17-5-25. */public class SoftKeyBoardListener { private View rootView;//activity的根视图 int rootViewVisibleHeight;//纪录根视图的显示高度 private OnSoftKeyBoardChangeListener onSoftKeyBoardChangeListener; public SoftKeyBoardListener(Activity activity) { //获取activity的根视图 rootView = activity.getWindow().getDecorView(); //监听视图树中全局布局发生改变或者视图树中的某个视图的可视状态发生改变 rootView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { @Override public void onGlobalLayout() { //获取当前根视图在屏幕上显示的大小 Rect r = new Rect(); rootView.getWindowVisibleDisplayFrame(r); int visibleHeight = r.height(); if (rootViewVisibleHeight == 0) { rootViewVisibleHeight = visibleHeight; return; } //根视图显示高度没有变化,可以看作软键盘显示/隐藏状态没有改变 if (rootViewVisibleHeight == visibleHeight) { return; } //根视图显示高度变小超过200,可以看作软键盘显示了 if (rootViewVisibleHeight - visibleHeight > 200) { if (onSoftKeyBoardChangeListener != null) { onSoftKeyBoardChangeListener.keyBoardShow(rootViewVisibleHeight - visibleHeight); } rootViewVisibleHeight = visibleHeight; return; } //根视图显示高度变大超过200,可以看作软键盘隐藏了 if (visibleHeight - rootViewVisibleHeight > 200) { if (onSoftKeyBoardChangeListener != null) { onSoftKeyBoardChangeListener.keyBoardHide(visibleHeight - rootViewVisibleHeight); } rootViewVisibleHeight = visibleHeight; return; } } }); } private void setOnSoftKeyBoardChangeListener(OnSoftKeyBoardChangeListener onSoftKeyBoardChangeListener) { this.onSoftKeyBoardChangeListener = onSoftKeyBoardChangeListener; } public interface OnSoftKeyBoardChangeListener { void keyBoardShow(int height); void keyBoardHide(int height); } public static void setListener(Activity activity, OnSoftKeyBoardChangeListener onSoftKeyBoardChangeListener) { SoftKeyBoardListener softKeyBoardListener = new SoftKeyBoardListener(activity); softKeyBoardListener.setOnSoftKeyBoardChangeListener(onSoftKeyBoardChangeListener); }}
这个方法是网上查来的,因为转载太多,搞不清原著了,原作者莫怪。感谢原作者。
最后只需要在主函数中引用就可以了:
protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_dialog); adapter = new MsgAdapter(Dialog.this, R.layout.msg_list_item, msgList); msgListView = (ListView) findViewById(R.id.id_dialog_listview); linearLayout = (LinearLayout) findViewById(R.id.rootview); msgListView.setAdapter(adapter); SoftKeyBoardListener.setListener(Dialog.this, new SoftKeyBoardListener.OnSoftKeyBoardChangeListener() { @Override public void keyBoardShow(int height) { linearLayout.scrollBy(0,height); } @Override public void keyBoardHide(int height) { linearLayout.scrollBy(0,0-height); } });
使用scrollBy函数,使linearLayou整体上移height高度,正数上移,负的就是下移,监听到键盘显示就上移,隐藏就下移。
但要注意的是Manifest里面的activity里,一定要是 android:windowSoftInputMode=”adjustPan”。
本人初学者,不喜勿喷!!!
阅读全文
0 0
- 实现qq聊天界面设计 完美解决edittext 软键盘弹出时listview背景不被挤压+listview Item和edittext的相对位置不变
- 关于Edittext 弹出软键盘时 ListView背景被挤压的问题(已经解决)
- 当listview的item为相对布局时item高度被挤压解决
- Android 点击listView的item弹出软键盘并且EditText获取焦点
- listview和edittext一起使用时弹出软键盘问题
- ToolBar+Listview+EditText,类似微信聊天页面软键盘弹出问题
- 解决打开Activity相应的edittext不弹出软键盘
- 关于ListView中EditText点击弹出软键盘及软键盘弹出后的焦点问题
- 关于ListView、EditText、光标、和软键盘
- android 完美解决ListView + editText
- [问题]Android listView item edittext 不能调用软键盘输入法
- ListVIew EditText 软键盘 光标
- edittext不弹出软键盘
- Edittext不弹出软键盘
- edittext不弹出软键盘
- EditText不弹出软键盘
- 解决ListView和 EditText焦点和软键盘问题
- 当EditText被点击的时候不弹出软键盘
- EcmaScript 6 箭头函数
- Broadcast的简单封装
- 解决:CentOS下MySQL执行select ... into outfile ...: Can't create/write to file '...' (Errcode: 13)
- 又是线段树,看来还得温习
- 2017年上海金马五校程序设计竞赛(网上资格赛) A : Corn's new language(括号匹配+求深度)
- 实现qq聊天界面设计 完美解决edittext 软键盘弹出时listview背景不被挤压+listview Item和edittext的相对位置不变
- 抽象类的规则
- SpringMVC学习笔记(八):Ajax用法二(借助json传对象数据)
- leetcode.463. Island Perimeter
- Python-Numpy-Basics-Notes
- MySQL大小写问题
- HTML5 <ruby>注释标签
- 手机联网时断时续原因之一
- Java程序设计教程(第三版) 雍俊海 9.6 答案/代码