沉浸式通知栏Android44以上才支持的新特性。43不支持。
具体实现方式如下:
1新建个公共style,设置android:fitsSystemWindows=true
<!-- 设置应用布局时是否考虑系统窗口布局;true --> <style name="AppBaseTheme" parent="android:ThemeLightNoTitleBar"> <item name="android:fitsSystemWindows">true</item> </style>
2 修改AndroidManifestxml,让所有的activity样式默认设置为AppBaseTheme(不同项目要灵活处理,笔者项目的activity样式都是统一的所以这样设置没问题,但是实际情况下不同的activity可能调用的样式不一样,需要读者自行按自己的项目来设置)
<application android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppBaseTheme" android:name="">
3新增沉浸式通知栏实现类,实现原理很简单。
1)判断当前系统版本是不是44以上,判断代码如下:
if (VERSIONSDK_INT >= VERSION_CODESKITKAT)
2)如果大于44则设置状态栏透明化,代码如下:
windowsetFlags(WindowManagerLayoutParamsFLAG_TRANSLUCENT_STATUS,WindowManagerLayoutParamsFLAG_TRANSLUCENT_STATUS);
3)获取activity的根rootView(DecorView),然后创建一个新的view stateBarView并把它添加到rootView(这里手动给它设置个ID,下次进来时先判断rootView是否已创建stateBarView,如果已创建则直接获取该View这样可以防止重复创建,导致内存泄露)
以下是具体代码实现:
import androidannotationSuppressLint;import androidappActivity;import androidcontentresResources;import androidgraphicsdrawableDrawable;import androidosBuild;import androidviewGravity;import androidviewView;import androidviewViewGroup;import androidviewWindow;import androidviewWindowManager;import androidwidgetFrameLayoutLayoutParams;/ 沉浸式通知栏公共类 @author hurrican /@SuppressLint({ "InlinedApi", "ResourceAsColor" })public class ImmersedNotificationBar { private Activity activity ; //设置沉浸式通知栏的ID(防止重复创建) private final static int IMMERSED_NOTIFICATION_BAR_ID = 12345678 ; private final static String STATUS_BAR_HEIGHT_RES_NAME = "status_bar_height" ; public ImmersedNotificationBar(Activity activity){ thisactivity = activity ; } //获取状态栏高度 private int getStatusBarHeight(Resources res){ int statusBarHeight = 0; int resourceId = resgetIdentifier(STATUS_BAR_HEIGHT_RES_NAME, "dimen", "android"); if (resourceId > 0) { statusBarHeight = resgetDimensionPixelSize(resourceId); } return statusBarHeight ; } //添加顶部状态栏 private View addStateBar(Activity activity,ViewGroup rootView,int statusBarHeight){ //创建新的View,并添加到rootView顶部) View statusBarView ; if(null!=rootViewfindViewById(IMMERSED_NOTIFICATION_BAR_ID)){ statusBarView = rootViewfindViewById(IMMERSED_NOTIFICATION_BAR_ID); }else{ statusBarView = new View(activity); rootViewaddView(statusBarView); } statusBarViewsetId(IMMERSED_NOTIFICATION_BAR_ID) ; LayoutParams params = new LayoutParams(LayoutParamsMATCH_PARENT,statusBarHeight); paramsgravity = GravityTOP; statusBarViewsetLayoutParams(params); statusBarViewsetVisibility(ViewVISIBLE); return statusBarView ; } / 设置状态栏颜色 @param ColorId / public void setStateBarColor(int ColorId){ if (BuildVERSIONSDK_INT >= BuildVERSION_CODESKITKAT) { Window window = activitygetWindow(); //activity的顶级布局 ViewGroup rootView = (ViewGroup) windowgetDecorView(); //透明化状态栏 windowsetFlags(WindowManagerLayoutParamsFLAG_TRANSLUCENT_STATUS, WindowManagerLayoutParamsFLAG_TRANSLUCENT_STATUS); Resources res = activitygetResources(); //获取状态栏目的高度 int statusBarHeight = getStatusBarHeight(res); View stateBarView = addStateBar(activity,rootView,statusBarHeight) ; stateBarViewsetBackgroundColor(ColorId) ; } } / 设置状态栏颜色 @param ColorId / public void setStateBarDrawable(Drawable drawable){ if (BuildVERSIONSDK_INT >= BuildVERSION_CODESKITKAT) { Window window = activitygetWindow(); //activity的顶级布局 ViewGroup rootView = (ViewGroup) windowgetDecorView(); //透明化状态栏 windowsetFlags(WindowManagerLayoutParamsFLAG_TRANSLUCENT_STATUS, WindowManagerLayoutParamsFLAG_TRANSLUCENT_STATUS); Resources res = activitygetResources(); //获取状态栏目的高度 int statusBarHeight = getStatusBarHeight(res); View stateBarView = addStateBar(activity,rootView,statusBarHeight) ; stateBarViewsetBackgroundDrawable(drawable) ; } }}
在很多Android App 开发的过程中,需要对Activity 中 软键盘的d起和关闭进项监听,但是Andoid中并没有提供相对应的api进行监听, 我有一个简单的方法。
首先需要知道一些基础知识
在manifest文件中可以设置Activity的android:windowSoftInputMode属性,这个属性值常见的设置如下:android:windowSoftInputMode="stateAlwaysHidden|adjustPan"
那么这里值的含义列表如下:
1、stateUnspecified:软键盘的状态并没有指定,系统将选择一个合适的状态或依赖于主题的设置
2、stateUnchanged:当这个activity出现时,软键盘将一直保持在上一个activity里的状态,无论是隐藏还是显示
3、stateHidden:用户选择activity时,软键盘总是被隐藏
4、stateAlwaysHidden:当该Activity主窗口获取焦点时,软键盘也总是被隐藏的
5、stateVisible:软键盘通常是可见的
6、stateAlwaysVisible:用户选择activity时,软键盘总是显示的状态
7、adjustUnspecified:默认设置,通常由系统自行决定是隐藏还是显示
8、adjustResize:该Activity总是调整屏幕的大小以便留出软键盘的空间
9、adjustPan:当前窗口的内容将自动移动以便当前焦点从不被键盘覆盖和用户能总是看到输入内容的部分
案例:
1我们需要将监听所在的Activity在Manifest文件中的设置为如下形式:
<activity
android:name="comzyprojectMainActivity"
android:label="@string/app_name"
android:windowSoftInputMode="stateAlwaysHidden|adjustResize" >
<intent-filter>
<action android:name="androidintentactionMAIN/>
<category android:name="androidintentcategoryLAUNCHER/>
</intent-filter>
</activity>
当有软键盘d起时,Activity的布局大小会被滚动上去,但是你仍然可以通过滑动浏览所有。
2 需要在外层布局文件设置一个id,并在activity 中设置监听
import androidappActivity;
import androidosBundle;
import androidviewView;
import androidviewViewOnLayoutChangeListener;
import androidwidgetToast;
public class MainActivity extends Activity implements OnLayoutChangeListener{
//Activity最外层的Layout视图
private View rootView;
//屏幕高度
private int screenHeight = 0;
//软件盘d起后所占高度阀值 一般是占用屏幕的1/3
private int keyHeight = 0;
@Override
protected void onCreate(Bundle savedInstanceState) {
superonCreate(savedInstanceState);
setContentView(Rlayoutactivity_main);
rootView = findViewById(Ridroot_layout);
//获取屏幕高度
screenHeight = thisgetWindowManager()getDefaultDisplay()getHeight();
//阀值设置为屏幕高度的1/3
keyHeight = screenHeight/3;
}
@Override
protected void onResume() {
superonResume();
//添加layout大小发生改变监听器
rootViewaddOnLayoutChangeListener(this);
}
@Override
public void onLayoutChange(View v, int left, int top, int right,int bottom, int oldLeft, int oldTop, int oldRight, int oldBottom) {
//old是改变前的左上右下坐标点值,没有old的是改变后的左上右下坐标点值
// Systemoutprintln(oldLeft + " " + oldTop +" " + oldRight + " " + oldBottom);
// Systemoutprintln(left + " " + top +" " + right + " " + bottom);
//现在认为只要控件将Activity向上推的高度超过了1/3屏幕高,就认为软键盘d起
if(oldBottom != 0 && bottom != 0 &&(oldBottom - bottom > keyHeight)){
ToastmakeText(MainActivitythis, "监听到软键盘d起", ToastLENGTH_SHORT)show();
}else if(oldBottom != 0 && bottom != 0 &&(bottom - oldBottom > keyHeight)){
ToastmakeText(MainActivitythis, "监听到软件盘关闭", ToastLENGTH_SHORT)show();
}
}
本文来自:>
以上就是关于如何实现android沉浸式状态栏全部的内容,包括:如何实现android沉浸式状态栏、Android 手机软键盘的d起和关闭的监听、等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)