在android:fitsSystemWindows="true"在沉浸式布局下设置



packagecom.ph.demo.test.two;

importandroid.app.Activity;

importandroid.content.Context;

importandroid.content.res.Resources;

importandroid.graphics.Color;

importandroid.graphics.Rect;

importandroid.os.Build;

importandroid.os.Bundle;

importandroid.support.v7.app.AppCompatActivity;

importandroid.util.Log;

importandroid.view.View;

importandroid.view.ViewConfiguration;

importandroid.view.ViewTreeObserver;

importandroid.view.Window;

importandroid.view.WindowManager;

importandroid.widget.Button;

importandroid.widget.ListView;

importandroid.widget.RelativeLayout;

importandroid.widget.SimpleAdapter;

importandroid.widget.TextView;

importandroid.widget.Toast;

importcom.ph.demo.test.R;

importcom.ph.demo.test.ViewUtils;

importjava.lang.reflect.Field;

importjava.lang.reflect.Method;

importjava.util.ArrayList;

importjava.util.List;

import staticcom.ph.demo.test.ViewUtils.TAG;

public classMainActivityTwoextendsActivity {

ViewdecorView;

//Bar布局监听器

ViewTreeObserver.OnGlobalLayoutListeneronGlobalLayoutListener;

//记录上一次底部的间距

intbottomSign=0;

@Override

protected voidonCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

getWindow().requestFeature(Window.FEATURE_NO_TITLE);

if(Build.VERSION.SDK_INT>= Build.VERSION_CODES.LOLLIPOP) {

Window window = getWindow();

window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS

| WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);

window.getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN

| View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION

| View.SYSTEM_UI_FLAG_LAYOUT_STABLE);

window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);

window.setStatusBarColor(Color.TRANSPARENT);

//            window.setNavigationBarColor(Color.TRANSPARENT);

}else{

getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);

}

setContentView(R.layout.activity_main_two);

decorView= getWindow().getDecorView();

//        final TextView textView = (TextView) findViewById(R.id.tv_hide);

finalTextView textView = (TextView) findViewById(R.id.tv_hide);

Button navHide = (Button) findViewById(R.id.btn_nav_hide);

navHide.setOnClickListener(newView.OnClickListener() {

@Override

public voidonClick(View view) {

toggleHideyBar();

}

});

ListView listView = (ListView) findViewById(R.id.lv_info);

List list =newArrayList<>();

for(inti =0;i <30;i++) {

list.add("String "+ i);

}

twoAdapter twoAdapter =newtwoAdapter();

twoAdapter.initAdapter(this,list);

listView.setAdapter(twoAdapter);

ViewUtils.setViewGroupHeightBasedOnChildren(listView);

finalRelativeLayout.LayoutParams olp = (RelativeLayout.LayoutParams) textView.getLayoutParams();

addOnSoftKeyBoardVisibleListener(newIKeyBoardVisibleListener() {

@Override

public voidonSoftKeyBoardVisible(intwindowBottom) {

olp.setMargins(0,0,0,windowBottom);

textView.setLayoutParams(olp);

}

});

}

interfaceIKeyBoardVisibleListener {

voidonSoftKeyBoardVisible(intwindowBottom);

}

public void addOnSoftKeyBoardVisibleListener(finalIKeyBoardVisibleListener listener) {

onGlobalLayoutListener=newViewTreeObserver.OnGlobalLayoutListener() {

@Override

public voidonGlobalLayout() {

Rect rect =newRect();

decorView.getWindowVisibleDisplayFrame(rect);

//计算出可见屏幕的高度

intdisplayHight = rect.bottom- rect.top;

//获得屏幕整体的高度

inthight =decorView.getHeight();

//获得键盘高度

intkeyboardHeight = hight - displayHight - getStatusBarHeight();

if(bottomSign!= keyboardHeight) {

bottomSign= keyboardHeight;

listener.onSoftKeyBoardVisible(keyboardHeight);

}

}

};

decorView.getViewTreeObserver().addOnGlobalLayoutListener(onGlobalLayoutListener);

}

private static intgetNavigationBarHeight(Context context) {

intnavigationBarHeight =0;

Resources rs = context.getResources();

intid = rs.getIdentifier("navigation_bar_height","dimen","android");

if(id >0&&hasNavBar(context)) {

navigationBarHeight = rs.getDimensionPixelSize(id);

}

returnnavigationBarHeight;

}

/**

*检查是否存在虚拟按键栏

*

*@paramcontext

*@return

*/

public static booleanhasNavBar(Context context) {

Resources res = context.getResources();

//这种方式一定要注意写法要正确,内部应该是通过反射去调用的。

intresourceId = res.getIdentifier("config_showNavigationBar","bool","android");

if(resourceId !=0) {

booleanhasNav = res.getBoolean(resourceId);

// check override flag

String sNavBarOverride =getNavBarOverride();

if("1".equals(sNavBarOverride)) {

hasNav =false;

}else if("0".equals(sNavBarOverride)) {

hasNav =true;

}

returnhasNav;

}else{// fallback

return!ViewConfiguration.get(context).hasPermanentMenuKey();

}

}

/**

*判断虚拟按键栏是否重写

*

*@return

*/

private staticStringgetNavBarOverride() {

String sNavBarOverride =null;

if(Build.VERSION.SDK_INT>= Build.VERSION_CODES.KITKAT) {

try{

Class c = Class.forName("android.os.SystemProperties");

Method m = c.getDeclaredMethod("get",String.class);

m.setAccessible(true);

sNavBarOverride = (String) m.invoke(null,"qemu.hw.mainkeys");

}catch(Throwable e) {

}

}

returnsNavBarOverride;

}

/**

*获取顶部状态栏的高度

*

*@return

*/

private intgetStatusBarHeight() {

Class c =null;

Object obj =null;

Field field =null;

intx =0,sbar =0;

try{

c = Class.forName("com.android.internal.R$dimen");

obj = c.newInstance();

field = c.getField("status_bar_height");

x = Integer.parseInt(field.get(obj).toString());

sbar =this.getResources().getDimensionPixelSize(x);

}catch(Exception e1) {

e1.printStackTrace();

}

returnsbar;

}

/**

*隐藏和显示顶部底部状态栏

*

*@return

*/

public voidtoggleHideyBar() {

intuiOptions = getWindow().getDecorView().getSystemUiVisibility();

intnewUiOptions = uiOptions;

booleanisImmersiveModeEnabled =

((uiOptions | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY) == uiOptions);

if(isImmersiveModeEnabled) {

Log.i(TAG,"Turning immersive mode mode off. ");

}else{

Log.i(TAG,"Turning immersive mode mode on.");

}

// Navigation bar hiding:  Backwards compatible to ICS.

if(Build.VERSION.SDK_INT>=14) {

newUiOptions ^= View.SYSTEM_UI_FLAG_HIDE_NAVIGATION;

}

// Status bar hiding: Backwards compatible to Jellybean

//        if (Build.VERSION.SDK_INT >= 16) {

//            newUiOptions ^= View.SYSTEM_UI_FLAG_FULLSCREEN;

//        }

// Immersive mode: Backward compatible to KitKat.

// Note that this flag doesn't do anything by itself, it only augments the behavior

// of HIDE_NAVIGATION and FLAG_FULLSCREEN.  For the purposes of this sample

// all three flags are being toggled together.

// Note that there are two immersive mode UI flags, one of which is referred to as "sticky".

// Sticky immersive mode differs in that it makes the navigation and status bars

// semi-transparent, and the UI flag does not get cleared when the user interacts with

// the screen.

if(Build.VERSION.SDK_INT>=18) {

newUiOptions ^= View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY;

}

getWindow().getDecorView().setSystemUiVisibility(newUiOptions);

}

@Override

protected voidonDestroy() {

super.onDestroy();

decorView.getViewTreeObserver().removeOnGlobalLayoutListener(onGlobalLayoutListener);

}

}


更多相关文章

  1. android 屏幕适配之自动生成多重values
  2. Android横竖屏幕切换生命周期详解
  3. android 亮屏及屏幕解锁代码
  4. android AlertDialog自定义大小
  5. 【Android】 dialog 设置maxHeight 最大高度
  6. Android简易计算器——LinearLayout布局
  7. Android(安卓)开启闪光灯做手电筒 源码
  8. Android窗口浮在屏幕上效果
  9. Android如何获取手机的屏幕宽高

随机推荐

  1. Android(安卓)DrawBitmap绘制图像
  2. android画一条虚线
  3. >>>> Android(安卓)adb shell后面可用的
  4. android声音服务
  5. Android通过PopupMenu定义弹出菜单的位置
  6. Android(安卓)UI Fundamentals Develop a
  7. android API Level 19 No system images
  8. Android(安卓)LOG机制流程图
  9. 关于android的webview打开淘宝天猫链接问
  10. Android(安卓)APP增量升级的实现方式