Android几行代码解决键盘遮挡问题
将libray模块复制到项目中,或者直接在build.gradle中依赖:
allprojects {
repositories {
maven { url 'https://jitpack.io' }
}
}
dependencies {
compile 'com.github.AnJiaoDe:Keyboard:V1.0.0'
}
注意:如果sync报错,是因为和com.android.tools.build:gradle 3.0有关,
可以改将compile改为implementation 或者api
1.scrollTo、scrollBy实现键盘不遮挡
使用方法:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="44dp"
android:background="@color/colorPrimary">
<TextView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center"
android:text="提现"
android:textColor="#ffffff" />
</RelativeLayout>
<LinearLayout
android:id="@+id/layout_content"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#E9F4FB"
android:orientation="vertical">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="38dp"
android:layout_marginLeft="15dp"
android:layout_marginRight="15dp"
android:gravity="center_vertical"
android:orientation="horizontal">
<View
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1" />
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
android:orientation="vertical">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginLeft="15dp"
android:orientation="horizontal">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="可提余额:"
android:textColor="#333333"
android:textSize="15sp" />
<TextView
android:id="@+id/tv_yue"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="2000.00"
android:textColor="#666666"
android:textSize="14sp" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="元"
android:textColor="#333333"
android:textSize="14sp" />
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginLeft="15dp"
android:layout_marginTop="20dp"
android:orientation="horizontal">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="手续费(0.6%):"
android:textColor="#333333"
android:textSize="15sp" />
<TextView
android:id="@+id/tv_shouxufei"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="0.00"
android:textColor="#666666"
android:textSize="14sp" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="元"
android:textColor="#333333"
android:textSize="14sp" />
</LinearLayout>
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="15dp"
android:layout_marginTop="20dp"
android:gravity="center_vertical"
android:orientation="horizontal">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="提现方式:"
android:textColor="#333333"
android:textSize="15sp" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="3dp"
android:text="支付宝"
android:textColor="#666666"
android:textSize="14sp" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="3dp"
android:text="银行卡"
android:textColor="#666666"
android:textSize="14sp" />
</LinearLayout>
<View
android:layout_width="match_parent"
android:layout_height="1dp"
android:layout_marginTop="20dp"
android:background="@color/line" />
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="11dp"
android:gravity="center"
android:text="申请提现金额"
android:textColor="#333333"
android:textSize="15sp" />
<LinearLayout
android:id="@+id/layout_et"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginLeft="23dp"
android:layout_marginRight="23dp"
android:layout_marginTop="13dp"
android:orientation="vertical">
<View
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"/>
<EditText
android:id="@+id/et_jine"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="30dp"
android:background="@null"
android:gravity="center"
android:hint="请输入提现金额"
android:inputType="numberDecimal|number"
android:maxLength="20"
android:minHeight="44dp"
android:textColorHint="#999999"
android:textSize="14sp" />
<View
android:layout_width="match_parent"
android:layout_height="1dp"
android:layout_marginTop="30dp"
android:background="#A7ABB1" />
</LinearLayout>
<Button
android:id="@+id/tv_submit"
android:layout_width="match_parent"
android:layout_height="49dp"
android:layout_marginLeft="38dp"
android:layout_marginRight="38dp"
android:layout_marginTop="33dp"
android:gravity="center"
android:text="确定"
android:textColor="@color/white"
android:textSize="16sp" />
</LinearLayout>
</LinearLayout>
</LinearLayout>
public class EditTextActivity extends KeyboardActivity {
private View layout_content;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_edit_text);
layout_content=findViewById(R.id.layout_content);
//设置监听器
setOnCYGlobalLayoutListener(new OnCYGlobalLayoutListener() {
//键盘刚显示
@Override
public void onKeyboardShowedNow(Rect rect) {
//rect 可视区域
//screenHight-rect.bottom就是键盘高度
layout_content.scrollTo(0,screenHight-rect.bottom);
}
//键盘刚隐藏,可以对输入的内容进行修改
@Override
public void onKeyboardHideNow() {
layout_content.scrollTo(0,0);
}
});
}
}
2.列表中的Edittext,利用假键盘实现键盘不遮挡
使用方法:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/activity_modify_price2"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<RelativeLayout
android:background="@color/colorPrimary"
android:layout_width="match_parent"
android:layout_height="44dp">
<TextView
android:layout_width="match_parent"
android:gravity="center"
android:layout_height="match_parent"
android:text="修改价格"
android:textColor="#ffffff" />
</RelativeLayout>
<com.cy.cyrvadapter.recyclerview.VerticalRecyclerView
android:id="@+id/vrv"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1" />
<View
android:id="@+id/view_keyboard"
android:layout_width="match_parent"
android:layout_height="0dp" />
</LinearLayout>
public class RVEdittextActivity extends KeyboardMockActivity {
private RVAdapter<String> rvAdapter;
private View view_keybord;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_rvedittext);
List<String> list = new ArrayList<>();
list.add("dojij");
list.add("dojij");
list.add("dojij");
list.add("dojij");
list.add("dojij");
list.add("dojij");
list.add("dojij");
list.add("dojij");
list.add("dojij");
list.add("dojij");
list.add("dojij");
list.add("dojij");
list.add("dojij");
list.add("dojij");
list.add("dojij");
list.add("dojij");
list.add("dojij");
list.add("dojij");
list.add("dojij");
list.add("dojij");
list.add("dojij");
list.add("dojij");
list.add("dojij");
list.add("dojij");
list.add("dojij");
rvAdapter = new RVAdapter<String>(list) {
@Override
public void bindDataToView(RVViewHolder holder, int position, String bean, boolean isSelected) {
}
@Override
public int getItemLayoutID(int position, String bean) {
return R.layout.item_price_modify;
}
@Override
public void onItemClick(int position, String bean) {
}
};
//万能适配器:https://github.com/AnJiaoDe/RecyclerViewAdapter
((VerticalRecyclerView) findViewById(R.id.vrv)).setAdapter(rvAdapter);
//设置监听器
setOnCYGlobalLayoutListener(view_keybord, new OnCYGlobalLayoutListener() {
//键盘刚显示
@Override
public void onKeyboardShowedNow(Rect rect) {
}
//键盘刚隐藏,可以对输入的内容进行修改
@Override
public void onKeyboardHideNow() {
}
//假键盘高度
@Override
public int getViewKeyboardHeight(Rect rect) {
return screenHight-rect.bottom;//screenHight-rect.bottom就是键盘高度
}
});
}
}
源码:
/**
* Created by cy on 2018/9/6.,用在普通界面中的edittext
*/
public abstract class KeyboardActivity extends AppCompatActivity implements ViewTreeObserver.OnGlobalLayoutListener {
public int screenHight = 0;
private OnCYGlobalLayoutListener onCYGlobalLayoutListener;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
screenHight = ScreenUtils.getScreenHeight(getApplicationContext());
}
@Override
protected void onResume() {
super.onResume();
addGlobal();
}
@Override
protected void onStop() {
super.onStop();
removeGlobal();
}
private void addGlobal() {
if (onCYGlobalLayoutListener!=null)
getWindow().getDecorView().getViewTreeObserver().addOnGlobalLayoutListener(this);
}
private void removeGlobal() {
getWindow().getDecorView().getViewTreeObserver().removeOnGlobalLayoutListener(this);
}
@Override
public void onGlobalLayout() {
// CYLogUtils.log("布局变化", "---------------------------------------");
Rect r = new Rect();
//获取当前界面可视部分
getWindow().getDecorView().getWindowVisibleDisplayFrame(r);
//如果屏幕高度和Window可见区域高度差值大于整个屏幕高度的1/3,则表示软键盘显示中,否则软键盘为隐藏状态。
// int heightDifference = screenHeight - (r.bottom - r.top);
boolean isKeyboardShowing = r.bottom < ScreenUtils.getScreenHeight(getApplicationContext());
if (isKeyboardShowing) {
// Toast.makeText(this, "键盘显示", Toast.LENGTH_SHORT).show();
removeGlobal();
onCYGlobalLayoutListener.onKeyboardShowedNow(r);
//会导致布局不断刷新,无限制回调当前方法,所以做延迟回调处理
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
addGlobal();
}
}, 100);
} else {
// Toast.makeText(this, "键盘隐藏", Toast.LENGTH_SHORT).show();
removeGlobal();
onCYGlobalLayoutListener.onKeyboardHideNow();
//会导致布局不断刷新,无限制回调当前方法,所以做延迟回调处理
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
addGlobal();
}
}, 100);
}
}
public int getScreenHight() {
return screenHight;
}
/**
* @param onCYGlobalLayoutListener
*/
public void setOnCYGlobalLayoutListener( OnCYGlobalLayoutListener onCYGlobalLayoutListener) {
this.onCYGlobalLayoutListener = onCYGlobalLayoutListener;
addGlobal();
}
public interface OnCYGlobalLayoutListener {
public void onKeyboardShowedNow(Rect rect);//键盘刚显示
public void onKeyboardHideNow();//键盘刚隐藏
}
}
/**
* Created by cy on 2018/9/6.,假键盘,用在列表中的edittext
*/
public abstract class KeyboardMockActivity extends AppCompatActivity implements ViewTreeObserver.OnGlobalLayoutListener {
private View view_keyboard;
public int screenHight = 0;
private OnCYGlobalLayoutListener onCYGlobalLayoutListener;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
screenHight = ScreenUtils.getScreenHeight(getApplicationContext());
}
@Override
protected void onResume() {
super.onResume();
addGlobal();
}
@Override
protected void onStop() {
super.onStop();
removeGlobal();
}
private void addGlobal() {
if (view_keyboard == null) return;
getWindow().getDecorView().getViewTreeObserver().addOnGlobalLayoutListener(this);
}
private void removeGlobal() {
getWindow().getDecorView().getViewTreeObserver().removeOnGlobalLayoutListener(this);
}
@Override
public void onGlobalLayout() {
if (view_keyboard == null) {
removeGlobal();
return;
}
// CYLogUtils.log("布局变化", "---------------------------------------");
Rect r = new Rect();
//获取当前界面可视部分
getWindow().getDecorView().getWindowVisibleDisplayFrame(r);
//如果屏幕高度和Window可见区域高度差值大于整个屏幕高度的1/3,则表示软键盘显示中,否则软键盘为隐藏状态。
// int heightDifference = screenHeight - (r.bottom - r.top);
boolean isKeyboardShowing = r.bottom < ScreenUtils.getScreenHeight(getApplicationContext());
if (isKeyboardShowing) {
if (view_keyboard.getVisibility() == View.VISIBLE) return;
// Toast.makeText(this, "键盘显示", Toast.LENGTH_SHORT).show();
removeGlobal();
LinearLayout.LayoutParams layoutParams = (LinearLayout.LayoutParams) view_keyboard.getLayoutParams();
layoutParams.height = onCYGlobalLayoutListener.getViewKeyboardHeight(r);
view_keyboard.setVisibility(View.VISIBLE);
onCYGlobalLayoutListener.onKeyboardShowedNow(r);
//会导致布局不断刷新,无限制回调当前方法,所以做延迟回调处理
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
addGlobal();
}
}, 100);
} else {
// Toast.makeText(this, "键盘隐藏", Toast.LENGTH_SHORT).show();
if (view_keyboard.getVisibility() == View.GONE) return;
removeGlobal();
view_keyboard.setVisibility(View.GONE);
onCYGlobalLayoutListener.onKeyboardHideNow();
//会导致布局不断刷新,无限制回调当前方法,所以做延迟回调处理
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
addGlobal();
}
}, 100);
}
}
public int getScreenHight() {
return screenHight;
}
/**
* @param view_keyboard 假键盘布局,使用时必须自行设置其高度,以满足 需要
* @param onCYGlobalLayoutListener
*/
public void setOnCYGlobalLayoutListener(View view_keyboard, OnCYGlobalLayoutListener onCYGlobalLayoutListener) {
this.view_keyboard = view_keyboard;
this.onCYGlobalLayoutListener = onCYGlobalLayoutListener;
addGlobal();
}
public interface OnCYGlobalLayoutListener {
public void onKeyboardShowedNow(Rect rect);//键盘刚显示
public void onKeyboardHideNow();//键盘刚隐藏
public int getViewKeyboardHeight(Rect rect);//返回假键盘的高度,rect 可视区域
}
}
关注专题Android开发常用开源库
简书
微信公众号
QQ群

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
-
上一篇
Android开发教程 - 使用Data Binding(二)集成与配置
本系列目录 使用Data Binding(一)介绍 使用Data Binding(二)集成与配置 使用Data Binding(三)在Activity中的使用 使用Data Binding(四)在Fragment中的使用 使用Data Binding(五)数据绑定 使用Data Binding(六)RecyclerView Adapter中的使用 使用Data Binding(七)使用BindingAdapter简化图片加载 使用Data Binding(八)使用自定义Interface 使用Data Binding Android Studio不能正常生成相关类/方法的解决办法 安装依赖库,配置工程 Data Binding安装和配置都非常简单,仅需简单的两步即可完成。 更新SDK 打开SDK管理工具,下载最新的Android Support库。 配置工程的Gradle android { … dataBinding { enabled = true } } 加入完成后,然后点击Sync Now,完成后就可以使用Data Binding强大的功能了。 总结 这一篇我们介绍了Data ...
-
下一篇
Android 几行代码解决6.0以上权限适配问题
GitHub APK 将libray模块复制到项目中,或者直接在build.gradle中依赖: allprojects { repositories { maven { url 'https://jitpack.io' } } } dependencies { compile 'com.github.AnJiaoDe:Permission:V1.0.0' } 注意:如果sync报错,是因为和com.android.tools.build:gradle 3.0有关,可以改将compile改为implementation 或者api Android 6.0以上,危险权限必须经过动态请求,危险权限分组图 1.全部允许 2.拒绝 3.拒绝 4.用户拒绝并且选中了不再询问,弹窗让用户去授权 5.用户同意了授权,闲的难受去关闭了授权 使用方法: public class MainActivity extends PermissionActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onC...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- CentOS6,7,8上安装Nginx,支持https2.0的开启
- Dcoker安装(在线仓库),最新的服务器搭配容器使用
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果
- CentOS关闭SELinux安全模块
- Windows10,CentOS7,CentOS8安装Nodejs环境
- MySQL8.0.19开启GTID主从同步CentOS8
- CentOS7,8上快速安装Gitea,搭建Git服务器
- CentOS8编译安装MySQL8.0.19
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- MySQL数据库在高并发下的优化方案