之前的Android沉浸式状态栏实现并没有考虑软键盘的影响,接下来的内容将会针对这个问题给出解决方式,先看一下效果图

这个是一个留言板的效果图:

即弹出软键盘的时候并不会导致整个布局上移。

详细怎样实现?依照下面步骤进行设置:

1、布局文件里声明例如以下

 <activity
android:name="com.storm.durian.activity.LeaveMessageDetailsActivity"
android:screenOrientation="portrait"
/>

2、这里重写了RelativeLayout。并重写了fitSystemWindows,这个是最最关键的。

/**
* 自适应布局
*/
public class FitsSystemWindowsLayout extends RelativeLayout {
private static final String TAG = FitsSystemWindowsLayout.class.getSimpleName();
private SoftKeyBoardStateListener softKeyBoardStateListener; public FitsSystemWindowsLayout(Context context) {
super(context);
} public FitsSystemWindowsLayout(Context context, AttributeSet attrs) {
super(context, attrs);
} public FitsSystemWindowsLayout(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
} @Override
protected void onMeasure(final int widthMeasureSpec, final int heightMeasureSpec) { dispatchListenerLow(heightMeasureSpec);
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
} /**
* 处理低版本号键盘弹出
*
* @param heightMeasureSpec 高度
*/
private void dispatchListenerLow(int heightMeasureSpec) {
if (softKeyBoardStateListener == null || Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
return;
}
int oldSpec = getMeasuredHeight(); if (oldSpec <= 0) {
return;
}
int newSpec = MeasureSpec.getSize(heightMeasureSpec);
int offset = oldSpec - newSpec;
if (offset > 100) {
LogHelper.i(TAG, "键盘打开");
softKeyBoardStateListener.onSoftKeyBoardStateChange(true);
} else if (offset < -100) {
LogHelper.i(TAG, "键盘关闭");
softKeyBoardStateListener.onSoftKeyBoardStateChange(false);
}
} @Override
protected boolean fitSystemWindows(Rect insets) {
dispatchListener(insets);
insets.top = 0;
return super.fitSystemWindows(insets);
} /**
* 分发监听
*
* @param insets
*/
private void dispatchListener(Rect insets) {
if (softKeyBoardStateListener == null || android.os.Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT) {
return;
}
if (insets.top != 0 && insets.bottom != 0) {
LogHelper.i(TAG, "键盘打开");
softKeyBoardStateListener.onSoftKeyBoardStateChange(true);
} else {
LogHelper.i(TAG, "键盘关闭");
softKeyBoardStateListener.onSoftKeyBoardStateChange(false);
} } /**
* 设置软键盘监听事件
*
* @param softKeyBoardStateListener
*/
public void setSoftKeyBoardListener(SoftKeyBoardStateListener softKeyBoardStateListener) {
this.softKeyBoardStateListener = softKeyBoardStateListener;
} public interface SoftKeyBoardStateListener { public void onSoftKeyBoardStateChange(boolean isOpen); }
}

尽管以上布局也提供了键盘打开或者关闭的回调,可是在某些低版本号手机上还是支持的不太好,须要这个回调的能够将此回调作为当中一个方法。可是不要过分依赖

3、布局文件

使用com.storm.durian.view.FitsSystemWindowsLayout包裹整个布局,并设置android:fitsSystemWindows=“true”

<?xml version="1.0" encoding="utf-8"?

>
<com.storm.durian.view.FitsSystemWindowsLayout android:id="@+id/leave_message_layout"
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/ececec"
android:fitsSystemWindows="true"> <include
android:id="@+id/leave_message_title"
layout="@layout/common_back"/> <LinearLayout
android:id="@+id/ll_leave_message_input"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:background="@drawable/leave_message_bottom_bg"
android:orientation="horizontal"> <EditText
android:id="@+id/et_leave_message"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="3"
android:background="@drawable/et_leave_message_bg"
android:hint="亲,给我留言我会回复你哒~"
android:maxLines="4"
android:textColor="@color/_3e363d"
android:textSize="@dimen/text_size_small"/> <Button
android:id="@+id/btn_leave_message_send"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginLeft="10dp"
android:layout_weight="1"
android:background="@drawable/btn_leave_message_send_selector"
android:singleLine="true"
android:text="发送"
android:textColor="@color/_3e363d"
android:textSize="@dimen/text_size_middle"/>
</LinearLayout> <ListView
android:id="@+id/lv_leave_message"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_above="@id/ll_leave_message_input"
android:layout_below="@id/leave_message_title"
android:cacheColorHint="#00000000"
android:divider="@color/dbdbdb"
android:dividerHeight="1dp"
android:fadingEdge="none"/> <ViewStub
android:id="@+id/activity_leave_message_loading_stub"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_below="@id/leave_message_title"
android:inflatedId="@+id/activity_leave_message_loading_subTree"
android:layout="@layout/common_loading"/> <ViewStub
android:id="@+id/leave_message_empty_stub"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_above="@id/ll_leave_message_input"
android:layout_below="@id/leave_message_title"
android:inflatedId="@+id/leave_message_empty_subTree"
android:layout="@layout/common_tips_layout"/> <ViewStub
android:id="@+id/leave_message_net_error_stub"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_below="@id/leave_message_title"
android:inflatedId="@+id/leave_message_net_error_subTree"
android:layout="@layout/common_net_error_layout"/> </com.storm.durian.view.FitsSystemWindowsLayout>

4、Activity中处理

设置setImmerseLayout(findViewById(R.id.leave_message_title));

  @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_leave_detail_message);
setImmerseLayout(findViewById(R.id.leave_message_title));
logic = LeaveMessageLogic.getInstance(getApplicationContext());
mHandler = new MyHandler(this);
initView();
}

再看BaseActivity中的setImmerseLayout方法

版本号要求仍然是4.4以上

  @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
isStart = true;
ShareSDK.initSDK(this);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
//透明状态栏
getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
//透明导航栏
// getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);
statusBarHeight = ScreenUtil.getStatusBarHeight(this);
}
ScreenManager.getScreenManager().pushActivity(this);
}
   protected void setImmerseLayout(View view) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
Window window = getWindow();
window.setFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS,
WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
// window.addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS); int statusBarHeight = ScreenUtil.getStatusBarHeight(this.getBaseContext());
view.setPadding(0, statusBarHeight, 0, 0);
}
}

OK。须要的朋友们能够自己尝试一下!

有空的话会将这个沉浸式的留言板的功能写一下分享出来!

【Android实战】Android沉浸式状态栏实现(下)的更多相关文章

  1. Android中的沉浸式状态栏效果

    无意间了解到沉浸式状态栏,感觉贼拉的高大上,于是就是试着去了解一下,就有了这篇文章.下面就来了解一下啥叫沉浸式状态栏.传统的手机状态栏是呈现出黑色条状的,有的和手机主界面有很明显的区别.这一样就在一定 ...

  2. Android 4.4沉浸式状态栏的实现

    要实现Android 4.4上面的沉浸式状态栏要用到开源项目SystemBarTint(https://github.com/hexiaochun/SystemBarTint) public clas ...

  3. Android Studio 关于沉浸式状态栏

    values-v19/style.xml <style name="AppTheme" parent="Theme.AppCompat.Light.NoAction ...

  4. [置顶] Xamarin android沉浸式状态栏

    虽然关于android "沉浸式"状态栏有很多博客介绍过,从小菜到大神无一例外.我第一次看到这种"沉浸"式的效果我也以为真的是这么叫,然而根本不是这么回事,完全 ...

  5. 81.Android之沉浸式状态栏攻略

    转载:http://blog.csdn.net/lmj623565791/article/details/48649563/ 一.概述 近期注意到QQ新版使用了沉浸式状态栏,ok,先声明一下:本篇博客 ...

  6. android沉浸式状态栏设置(4.4以上版本)

    其实设置比较简单,我用了小米和htc的几款机型都可以用. 主要代码就是这个(注意要在Activity的setContentView之前调用才行) /** * 开启沉浸式状态栏 * */ public ...

  7. Android 沉浸式状态栏攻略 让你的状态栏变色吧

    转载请标明出处: http://blog.csdn.net/lmj623565791/article/details/48649563: 本文出自:[张鸿洋的博客] 一.概述 近期注意到QQ新版使用了 ...

  8. Android 沉浸式状态栏完美解决方案

    现在搜索Android 沉浸式状态栏,真的是一堆一堆,写的特别多,但是真正用的舒服的真没有,在这里自己整理一下开发记录 注意,在使用这个步骤过程之前,请把之前设置的代码注释一下 把布局带有androi ...

  9. android -------- 沉浸式状态栏和沉浸式导航栏(ImmersionBar)

    android 4.4以上沉浸式状态栏和沉浸式导航栏管理,包括状态栏字体颜色,适用于Activity.Fragment.DialogFragment.Dialog,并且适配刘海屏,适配软键盘弹出等问题 ...

随机推荐

  1. 36.创建自定义的指令directive

    转自:https://www.cnblogs.com/best/tag/Angular/ 1. <html> <head> <meta charset="utf ...

  2. luogu 1280 尼克的任务

    题目描述 尼克每天上班之前都连接上英特网,接收他的上司发来的邮件,这些邮件包含了尼克主管的部门当天要完成的全部任务,每个任务由一个开始时刻与一个持续时间构成. 尼克的一个工作日为N分钟,从第一分钟开始 ...

  3. Python的matplotlib库画图不能显示中文问题解决

    有两种解决办法: 一种是在代码里设置为能显示中文的字体,如微软雅黑(msyh.ttf)和黑体(simsun.ttc) 如下在要画图的代码前添加: import matplotlib.pyplot as ...

  4. nginx省去每次查看进程操作

       在我们想要关闭.重启等操作时需要查看 nginx 的进程,那么有没有一种方法省去查看的步骤?                                  kill -HUP `cat lo ...

  5. 洛谷2474 [SCOI2008] 天平 差分约束->枚举

    题目描述 你有n个砝码,均为1克,2克或者3克.你并不清楚每个砝码的重量,但你知道其中一些砝码重量的大小关系.你把其中两个砝码A 和B 放在天平的左边,需要另外选出两个砝码放在天平的右边.问:有多少种 ...

  6. oracle创建静态监听

    [oracle@localhost admin]$ pwd /u01/app/oracle/product/11.2.0/dbhome_1/network/admin [oracle@localhos ...

  7. Kubernetes本地私有仓库配置

    实验环境 master 10.6.191.181 node1 10.6.191.182 node2 10.6.191.183 本地私有仓库 10.6.191.184 一.安装本地私有仓库 1.安装do ...

  8. db2部署

    下载地址: wget   ftp://public.dhe.ibm.com/software/hk/cobra/db2exc_970_LNX_x86_64.tar.gz 上传压缩包到/opt,再解压d ...

  9. Codeforces Round #313 (Div. 2) 解题报告

    A. Currency System in Geraldion: 题意:有n中不同面额的纸币,问用这些纸币所不能加和到的值的最小值. 思路:显然假设这些纸币的最小钱为1的话,它就能够组成随意面额. 假 ...

  10. C语言之基本算法26—佩尔方程求解

    //穷举法! /* ====================================================== 题目:求佩尔方程x*x-73*y*y=1的解. =========== ...