状态栏一体化及其带来的软键盘自适应问题

状态栏一体化及其带来的软键盘自适应问题
应项目需求才开始了解状态栏一体化的问题,作为一个android新手,之前从未接触过。第一反应是网上搜索,不得不说网络确实给我带来很大的帮助,但是对于类似小白的我来说,还不够,不够详细。
几经周折,最终完成效果。代码专不专业,不清楚,但是解决了我遇到的问题。在此记录一下我的学习成果,也给像我一样需要的人提供一些帮助。

首先状态栏一体化是android4.4以上版本才有的。

先上效果图:
这里写图片描述 这里写图片描述

实现:
上图第一张:自定义标题栏
布局:activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <include
        layout="@layout/title_layout"></include>

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="图片"
        android:id="@+id/button"
        android:layout_marginTop="10dp"
        android:layout_marginLeft="20dp" />
</LinearLayout>

自定义标题栏title_layout.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/title"
    android:layout_width="match_parent"
    android:layout_height="48dp"
    android:background="#1f9ff9"
    android:fitsSystemWindows="true"
    android:clipToPadding="true">


    <RelativeLayout
        android:layout_width="50dp"
        android:layout_height="50dp"
        android:background="@android:color/transparent"
        android:layout_alignParentLeft="true">

        <ImageView
            android:id="@+id/title_iv_back"
            android:layout_width="8dp"
            android:layout_height="14dp"
            android:layout_centerInParent="true"
            android:layout_marginLeft="15dp"
            android:src="@drawable/back" />
    </RelativeLayout>


    <TextView
        android:id="@+id/title_tv_name"
        android:layout_width="wrap_content"
        android:layout_height="48dp"
        android:background="@android:color/transparent"
        android:ellipsize="end"
        android:maxWidth="240dp"
        android:singleLine="true"
        android:text="标题"
        android:textColor="@android:color/white"
        android:textSize="18sp"
        android:layout_centerHorizontal="true"
        android:layout_alignParentBottom="true"
        android:gravity="center" />
</RelativeLayout>

activity实现:MainActivity.java

import android.app.Activity;
import android.content.Intent;
import android.os.Build;
import android.os.Bundle;
import android.view.View;
import android.view.ViewGroup;
import android.view.Window;
import android.view.WindowManager;
import android.widget.RelativeLayout;

public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        RelativeLayout rlTitle = (RelativeLayout)findViewById(R.id.title);
        //4.4版本以上
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
            Window win = getWindow();
            WindowManager.LayoutParams winParams = win.getAttributes();
            final int bits = WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS;
            winParams.flags |= bits;
            win.setAttributes(winParams);

            ViewGroup.LayoutParams params = rlTitle.getLayoutParams();
            params.height = params.height + getStatusBarHeight();
            rlTitle.setLayoutParams(params);
        }
        findViewById(R.id.button).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                startActivity(new Intent(MainActivity.this,NewActivity.class));
            }
        });
    }

    /**
     * 获取状态栏的高度
     * @return
     */
    private int getStatusBarHeight() {
        int result = 0;
        int resourceId = getResources().getIdentifier("status_bar_height", "dimen", "android");
        if (resourceId > 0) {
            result = getResources().getDimensionPixelSize(resourceId);
        }
        return result;
    }
}

是不是很简单呢~~
接着第二张图片一体化
布局activity_new.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <ImageView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/imageView"
        android:src="@drawable/test"
        android:scaleType="fitXY" />
</LinearLayout>

NewActivity.java

public class NewActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_new);
        //4.4版本以上 
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
            Window win = getWindow();
            WindowManager.LayoutParams winParams = win.getAttributes();
            final int bits = WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS;
            winParams.flags |= bits;
            win.setAttributes(winParams);

        }
    }

}

OK,接着来说一下我探索中遇到的一些问题:
1.//4.4版本以上
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
Window win = getWindow();
WindowManager.LayoutParams winParams = win.getAttributes();
final int bits = WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS;
winParams.flags |= bits;
win.setAttributes(winParams);
}

这段代码主要是使状态栏透明化
2.android:fitsSystemWindows="true"
android:clipToPadding="true"

fitSystemWindows属性:
官方描述:

    Boolean internal attribute to adjust view layout based on system windows such as the status bar. If true, adjusts the padding of this view to leave space for the system windows. Will only take effect if this view is in a non-embedded activity.
    当status bar状态栏为透明或半透明时(4.4以上),系统会设置窗口view的paddingTop值为一个适合的值(status bar的高度)让view的内容不被上拉到状态栏,当在不占据status bar的情况下(4.4以下)会设置paddingTop值为0(因为没有占据status bar所以不用留出空间)。

3.ViewGroup.LayoutParams params = rlTitle.getLayoutParams();
params.height = params.height + getStatusBarHeight();
rlTitle.setLayoutParams(params);

调整标题栏的高度,在原有高度上再加上状态栏的高度。

问题来了:
上述3段代码在具体实现中的作用,只有 1 时,会出现这样的效果
这里写图片描述
状态栏消失了,看上去一体化了,但是效果是标题栏整体上移了,占据了状态栏的位置,文字 图片都和状态栏重叠了,显然不是我们要的效果
这是在加上第 2 段代码,在布局文件中,注意这段代码是要加在 你希望一体化的那个控件布局中,就如现在我们希望状态栏的颜色和我们自定义的标题栏title_layout的颜色一样,那么我们就把代码 2 加在title_layout的根布局中,加上后效果图:
这里写图片描述
与上张图比效果好点,至少文字没有上升到状态栏,但是我们的标题栏高度呢,没。。有。。了。。。 怎么可以这样,这不是我们想要的啊。。。所以我们我们把标题栏的高度调一下,就是把代码 3 加上,在标题栏原有高度上加上状态栏高度。然后 Ok
这里写图片描述

看,这就是最终效果,完美实现。。。。

然后是图片的问题。从上述问题中,我想已经看出来,我们第一步的效果,完全就可以用来解决图片一体化啊,对 ,就是这样,加图片时,我们只需要一步,在代码中加入上述代码1,布局文件完全不需要更改。。
这里写图片描述

有没有很简单呢。。。

一体化写到这里,下篇写关于一体化android:fitsSystemWindows=”true” ,带来的软键盘自适应问题。。。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值