学习Android中设计风格之一的沉浸式状态栏布局效果:适配了Activity和Fragment的工具类,注意在使用此工具类的过程中需要把application里的theme属性修改为NoActionBar
android:theme="@style/Theme.AppCompat.Light.NoActionBar"
以下先贴出所有代码
自定义的BaseActivity
@SuppressLint("NewApi")
public abstract class BaseActivity extends AppCompatActivity {
private FragmentManager fragmentManager;//fragment管理器
//当前正在展示的fragment
private BaseFragment showFragment;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(getContentId());
//注册activity
//获得fragment 管理对象
fragmentManager = getSupportFragmentManager();
/**
* 沉浸式状态栏
*/
if(isOpenStatus()) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
Window window = getWindow();
window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
window.getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_LAYOUT_STABLE);
window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
window.setStatusBarColor(Color.TRANSPARENT);
} else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
}
//获得状态栏的高度
int height = ScreenUtil.getStatusHeight(this);
if(height != -1){
//设置padding
View view = findViewById(R.id.actionbar);
if(view != null){
view.setPadding(0,height,0,0);
if(view instanceof Toolbar){
setSupportActionBar((Toolbar) view);
//隐藏标题
getSupportActionBar().setDisplayShowTitleEnabled(false);
}
}
}
}
init();
bindListener();
loadDatas();
}
/**
* 初始化
*/
protected void init(){
}
/**
* 绑定监听
*/
protected void bindListener(){
}
/**
* 加载数据
*/
protected void loadDatas(){
}
/**
* 以动画的方式启动activity
* @param intent
* @param animinid
* @param animoutid
*/
public void startActivityForAnimation(Intent intent, int animinid, int animoutid){
startActivity(intent);
overridePendingTransition(animinid, animoutid);
}
/**
* 展示fragment
*/
protected void showFragment(int resid,BaseFragment fragment){
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();//开始一个新的事物
//隐藏正在展示的fragment
if(showFragment != null){
fragmentTransaction.hide(showFragment);
}
//展示需要显示的fragment对象
Fragment mfragment = fragmentManager.findFragmentByTag(fragment.getClass().getName());
if(mfragment != null){
fragmentTransaction.show(mfragment);
showFragment = (BaseFragment) mfragment;
}else{
fragmentTransaction.add(resid,fragment,fragment.getClass().getName());
showFragment = fragment;
}
fragmentTransaction.commit();//提交事物
}
/**
* 获得activity显示的布局ID
* @return
*/
protected abstract int getContentId();
/**
* 是否打开沉浸式状态栏
* @return
*/
public boolean isOpenStatus(){
return true;
}
}
自定义的BaseFragment
public abstract class BaseFragment extends Fragment {
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View view = inflater.inflate(getContentId(), container, false);
return view;
}
/**
* 该方法紧跟onCreateView之后执行
* @param view
* @param savedInstanceState
*/
@Override
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
//查找actionbar控件设置paddingtop
BaseActivity activity = (BaseActivity) getActivity();
//判断activity是否开启沉浸式通知栏
if(activity.isOpenStatus()){
View actionbarview = view.findViewById(R.id.actionbar);
if(actionbarview != null){
int heigth = ScreenUtil.getStatusHeight(getActivity());
actionbarview.setPadding(0, heigth, 0, 0);
}
}
init(view);
bindListener();
loadDatas();
}
@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
Bundle bundle = getArguments();
if(bundle != null){
getDatas(bundle);
}
}
/**
*获得数据
*/
protected void getDatas(Bundle bundle) {
}
/**
*初始化的方法
* @param view
*/
protected void init(View view) {
}
/**
*绑定的监听
*/
protected void bindListener() {
}
/**
*加载数据
*/
protected void loadDatas() {
}
/**
*传入布局ID
*/
protected abstract int getContentId();
}
代码内用到的ScreenUtil
public static int getStatusHeight(Context context){
/**
* 获取资源文件的id文件
*/
int resid = context.getResources().getIdentifier("status_bar_height","dimen","android");
if(resid > 0){
return context.getResources().getDimensionPixelSize(resid);
}
return -1;
}
最后在values文件夹下床架一个idsXML文件
<resources>
<item name="actionbar" type="id">actionbar_id</item>
</resources>
最后大功告成,在使用过程中只需要定义自己的activity类或者fragment去继承BaseActivity或者BaseFragment就可以实现完美的沉浸式状态栏布局