Android基于4.4沉侵式状态栏和继承BaseActivity不用findViewbyid得到控件id
来源:互联网 发布:淘宝商城入驻费用 编辑:程序博客网 时间:2024/04/30 06:32
package com.liu.test.baseactivity;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import android.annotation.SuppressLint;
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.content.res.Resources;
import android.graphics.Color;
import android.os.Build;
import android.os.Bundle;
import android.support.annotation.LayoutRes;
import android.support.v4.app.FragmentActivity;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.VelocityTracker;
import android.view.View;
import android.view.ViewGroup;
import android.view.Window;
import android.view.WindowManager;
import android.widget.LinearLayout;
import com.liu.home.R;
import com.liu.test.app.App;
import com.liu.test.util.DensityUtil;
/**
* 继承自该类的Activity不需要使用findViewById(),只需要把控件声明称类内全局的,</br>并且和activity对应的布局中的id的名字相同,这样setContentView后就可以直接使用控件了,</br>
* 同时不需要为控件设置clickListener, 直接在类上implements onClickListener,</br>
* 并在activity中 重写onClick()方法,当点击控件时即可自动调用onClick()方法
*
* </br>参考
*
* </br></br>
* 沉浸式状态栏 ,设置状态栏颜色使用setStatusBarColor,参数为颜色资源id,默认为橙色状态栏
* @author
*
*
*/
@SuppressLint("NewApi") public class BaseActivity extends FragmentActivity {
private View statusBar;
private LinearLayout container;
/**
* 是否开启 右划关闭activity 手势,默认开启
*/
private boolean isGestureOpen=true;
@SuppressLint("InlinedApi")
@Override
protected void onCreate(Bundle arg0) {
super.onCreate(arg0);
App.ctx.addActivity(this);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
Window window = getWindow();
// Translucent status bar
window.setFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS,
WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
statusBar = new View(this);
ViewGroup.LayoutParams param = new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,
getStatusBarHeight());
statusBar.setLayoutParams(param);
// setStatusBarColor(R.color.orange);
container =new ViewContainer(getApplicationContext());
container.setOrientation(LinearLayout.VERTICAL);
container.addView(statusBar);
//App.getInstance().addActivity(this);
}
}
@Override
public void startActivityForResult(Intent intent, int requestCode) {
super.startActivityForResult(intent, requestCode);
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN) {
overridePendingTransition(R.anim.anim_enter_open_activity, R.anim.anim_exit_open_activity);
}
}
@SuppressLint("NewApi")
public void startActivityForResult(Intent intent, int requestCode, Bundle options) {
super.startActivityForResult(intent, requestCode, options);
overridePendingTransition(R.anim.anim_enter_open_activity, R.anim.anim_exit_open_activity);
}
@Override
public void finish() {
// TODO Auto-generated method stub
super.finish();
overridePendingTransition(R.anim.anim_enter_finish_activity, R.anim.anim_exit_finish_activity);
}
/**
* 设置状态栏颜色,
*
* @param color 颜色资源id, 如 R.color.orange</br>
* 0 黑色
*/
protected void setStatusBarColor(int color) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
if (color == 0) {
statusBar.setBackgroundColor(Color.BLACK);
} else {
statusBar.setBackgroundColor(getResources().getColor(color));
}
}
}
@Override
public void setContentView(@LayoutRes int layoutResID) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
LayoutInflater.from(this).inflate(layoutResID, container, true);
setContentView(container);
}else{
super.setContentView(layoutResID);
}
smartInject();
// FrameLayout container = new FrameLayout(this);
// // 在用户布局外面嵌套一个FrameLayout,防止用户布局中根控件的margin失效
// LayoutInflater.from(this).inflate(layoutResID, container, true);
// setContentView(container);
}
// @Override
// public void setContentView(View view) {
//
// container.addView(view);
//
// super.setContentView(container);
//
// adjustContentMargin(view);
// ((ViewGroup) getWindow().getDecorView()).addView(statusBar);
// smartInject();
// }
//
// private void adjustContentMargin(View view) {
// ViewGroup.LayoutParams param = view.getLayoutParams();
//
// ViewGroup.MarginLayoutParams margParam;
// if (param instanceof ViewGroup.MarginLayoutParams) {
//
// margParam = (ViewGroup.MarginLayoutParams) param;
// margParam.setMargins(margParam.leftMargin, margParam.topMargin + getStatusBarHeight(),
// margParam.rightMargin, margParam.bottomMargin);
// } else {
//
// margParam = new ViewGroup.MarginLayoutParams(param);
// margParam.setMargins(0, getStatusBarHeight(), 0, 0);
// }
// view.setLayoutParams(margParam);
// }
protected int getStatusBarHeight() {
int result = 0;
int resourceId = getResources().getIdentifier("status_bar_height", "dimen", "android");
if (resourceId > 0) {
result = getResources().getDimensionPixelSize(resourceId);
}
return result;
}
/**
* 设置是否允许屏幕左侧 快速 右划关闭activity,默认允许
* @param b
*/
protected void isGestureSensitive(boolean b) {
isGestureOpen=b;
}
private void smartInject() {
try {
Class<? extends Activity> clz = getClass();
while (clz!=BaseActivity.class) {
Field[] fs = clz.getDeclaredFields();
Resources res = getResources();
String packageName = getPackageName();
for (Field field : fs) {
if (!View.class.isAssignableFrom(field.getType())) {
continue;
}
int viewId = res.getIdentifier(field.getName(), "id", packageName);
if (viewId == 0)
continue;
field.setAccessible(true);
try {
View v = findViewById(viewId);
field.set(this, v);
Class<?> c = field.getType();
Method m = c.getMethod("setOnClickListener", android.view.View.OnClickListener.class);
m.invoke(v, this);
} catch (Throwable e) {
}
field.setAccessible(false);
}
clz=(Class<? extends Activity>) clz.getSuperclass();
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
/**
* 屏幕左侧右划返回容器 ,
* @author Young
*
*/
private class ViewContainer extends LinearLayout{
private int leftMargin;
private VelocityTracker tracker;
private float startX;
private float startY;
public ViewContainer(Context context) {
super(context);
leftMargin=DensityUtil.dip2px(35);
}
@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
if (isGestureOpen==false) {
return super.dispatchTouchEvent(ev);
}
switch (ev.getAction()) {
case MotionEvent.ACTION_CANCEL:
case MotionEvent.ACTION_UP:
//当满足下面条件时 视为 右划关闭手势
//起始按压位置x坐标小与leftMargin&& 向右滑动 && 向右滑动距离 > 竖直方向距离
if (startX<leftMargin&& ev.getRawX()>startX && ev.getRawX()-startX>Math.abs(ev.getRawY()-startY) ) {
//速度大于2500时关闭activity
tracker.computeCurrentVelocity(1000);
if (tracker.getXVelocity()>2500) {
finish();
}
}
tracker.recycle();
break;
case MotionEvent.ACTION_DOWN:
startX=ev.getRawX();
startY=ev.getRawY();
tracker=VelocityTracker.obtain();
tracker.addMovement(ev);
break;
case MotionEvent.ACTION_MOVE:
tracker.addMovement(ev);
break;
}
return super.dispatchTouchEvent(ev);
}
@Override
public boolean onTouchEvent(MotionEvent event) {
if (isGestureOpen==false) {
return super.onTouchEvent(event);
}
return true;
}
}
}
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import android.annotation.SuppressLint;
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.content.res.Resources;
import android.graphics.Color;
import android.os.Build;
import android.os.Bundle;
import android.support.annotation.LayoutRes;
import android.support.v4.app.FragmentActivity;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.VelocityTracker;
import android.view.View;
import android.view.ViewGroup;
import android.view.Window;
import android.view.WindowManager;
import android.widget.LinearLayout;
import com.liu.home.R;
import com.liu.test.app.App;
import com.liu.test.util.DensityUtil;
/**
* 继承自该类的Activity不需要使用findViewById(),只需要把控件声明称类内全局的,</br>并且和activity对应的布局中的id的名字相同,这样setContentView后就可以直接使用控件了,</br>
* 同时不需要为控件设置clickListener, 直接在类上implements onClickListener,</br>
* 并在activity中 重写onClick()方法,当点击控件时即可自动调用onClick()方法
*
* </br>参考
*
* </br></br>
* 沉浸式状态栏 ,设置状态栏颜色使用setStatusBarColor,参数为颜色资源id,默认为橙色状态栏
* @author
*
*
*/
@SuppressLint("NewApi") public class BaseActivity extends FragmentActivity {
private View statusBar;
private LinearLayout container;
/**
* 是否开启 右划关闭activity 手势,默认开启
*/
private boolean isGestureOpen=true;
@SuppressLint("InlinedApi")
@Override
protected void onCreate(Bundle arg0) {
super.onCreate(arg0);
App.ctx.addActivity(this);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
Window window = getWindow();
// Translucent status bar
window.setFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS,
WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
statusBar = new View(this);
ViewGroup.LayoutParams param = new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,
getStatusBarHeight());
statusBar.setLayoutParams(param);
// setStatusBarColor(R.color.orange);
container =new ViewContainer(getApplicationContext());
container.setOrientation(LinearLayout.VERTICAL);
container.addView(statusBar);
//App.getInstance().addActivity(this);
}
}
@Override
public void startActivityForResult(Intent intent, int requestCode) {
super.startActivityForResult(intent, requestCode);
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN) {
overridePendingTransition(R.anim.anim_enter_open_activity, R.anim.anim_exit_open_activity);
}
}
@SuppressLint("NewApi")
public void startActivityForResult(Intent intent, int requestCode, Bundle options) {
super.startActivityForResult(intent, requestCode, options);
overridePendingTransition(R.anim.anim_enter_open_activity, R.anim.anim_exit_open_activity);
}
@Override
public void finish() {
// TODO Auto-generated method stub
super.finish();
overridePendingTransition(R.anim.anim_enter_finish_activity, R.anim.anim_exit_finish_activity);
}
/**
* 设置状态栏颜色,
*
* @param color 颜色资源id, 如 R.color.orange</br>
* 0 黑色
*/
protected void setStatusBarColor(int color) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
if (color == 0) {
statusBar.setBackgroundColor(Color.BLACK);
} else {
statusBar.setBackgroundColor(getResources().getColor(color));
}
}
}
@Override
public void setContentView(@LayoutRes int layoutResID) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
LayoutInflater.from(this).inflate(layoutResID, container, true);
setContentView(container);
}else{
super.setContentView(layoutResID);
}
smartInject();
// FrameLayout container = new FrameLayout(this);
// // 在用户布局外面嵌套一个FrameLayout,防止用户布局中根控件的margin失效
// LayoutInflater.from(this).inflate(layoutResID, container, true);
// setContentView(container);
}
// @Override
// public void setContentView(View view) {
//
// container.addView(view);
//
// super.setContentView(container);
//
// adjustContentMargin(view);
// ((ViewGroup) getWindow().getDecorView()).addView(statusBar);
// smartInject();
// }
//
// private void adjustContentMargin(View view) {
// ViewGroup.LayoutParams param = view.getLayoutParams();
//
// ViewGroup.MarginLayoutParams margParam;
// if (param instanceof ViewGroup.MarginLayoutParams) {
//
// margParam = (ViewGroup.MarginLayoutParams) param;
// margParam.setMargins(margParam.leftMargin, margParam.topMargin + getStatusBarHeight(),
// margParam.rightMargin, margParam.bottomMargin);
// } else {
//
// margParam = new ViewGroup.MarginLayoutParams(param);
// margParam.setMargins(0, getStatusBarHeight(), 0, 0);
// }
// view.setLayoutParams(margParam);
// }
protected int getStatusBarHeight() {
int result = 0;
int resourceId = getResources().getIdentifier("status_bar_height", "dimen", "android");
if (resourceId > 0) {
result = getResources().getDimensionPixelSize(resourceId);
}
return result;
}
/**
* 设置是否允许屏幕左侧 快速 右划关闭activity,默认允许
* @param b
*/
protected void isGestureSensitive(boolean b) {
isGestureOpen=b;
}
private void smartInject() {
try {
Class<? extends Activity> clz = getClass();
while (clz!=BaseActivity.class) {
Field[] fs = clz.getDeclaredFields();
Resources res = getResources();
String packageName = getPackageName();
for (Field field : fs) {
if (!View.class.isAssignableFrom(field.getType())) {
continue;
}
int viewId = res.getIdentifier(field.getName(), "id", packageName);
if (viewId == 0)
continue;
field.setAccessible(true);
try {
View v = findViewById(viewId);
field.set(this, v);
Class<?> c = field.getType();
Method m = c.getMethod("setOnClickListener", android.view.View.OnClickListener.class);
m.invoke(v, this);
} catch (Throwable e) {
}
field.setAccessible(false);
}
clz=(Class<? extends Activity>) clz.getSuperclass();
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
/**
* 屏幕左侧右划返回容器 ,
* @author Young
*
*/
private class ViewContainer extends LinearLayout{
private int leftMargin;
private VelocityTracker tracker;
private float startX;
private float startY;
public ViewContainer(Context context) {
super(context);
leftMargin=DensityUtil.dip2px(35);
}
@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
if (isGestureOpen==false) {
return super.dispatchTouchEvent(ev);
}
switch (ev.getAction()) {
case MotionEvent.ACTION_CANCEL:
case MotionEvent.ACTION_UP:
//当满足下面条件时 视为 右划关闭手势
//起始按压位置x坐标小与leftMargin&& 向右滑动 && 向右滑动距离 > 竖直方向距离
if (startX<leftMargin&& ev.getRawX()>startX && ev.getRawX()-startX>Math.abs(ev.getRawY()-startY) ) {
//速度大于2500时关闭activity
tracker.computeCurrentVelocity(1000);
if (tracker.getXVelocity()>2500) {
finish();
}
}
tracker.recycle();
break;
case MotionEvent.ACTION_DOWN:
startX=ev.getRawX();
startY=ev.getRawY();
tracker=VelocityTracker.obtain();
tracker.addMovement(ev);
break;
case MotionEvent.ACTION_MOVE:
tracker.addMovement(ev);
break;
}
return super.dispatchTouchEvent(ev);
}
@Override
public boolean onTouchEvent(MotionEvent event) {
if (isGestureOpen==false) {
return super.onTouchEvent(event);
}
return true;
}
}
}
0 0
- Android基于4.4沉侵式状态栏和继承BaseActivity不用findViewbyid得到控件id
- Android基于4.4以上沉侵式状态栏和继承BaseActivity不用findViewbyid得到控件id
- android 自动初始化控件 不用注解不用findViewByid
- android继承BaseActivity
- 获取控件ID函数findViewById
- Android 基于BaseActivity封装
- Android得到状态栏和标题栏的高度
- findViewById获取控件ID时返回Null
- Android使用Fragment,不能得到Fragment内部控件,findViewById()结果是Null--已经解决
- 4.4以上BaseActivity 设置状态栏背景
- Android--xml控件写法和findViewById的对应使用
- 得到Android状态栏高度
- android中在Layout布局文件中添加控件ID,在Activity中findViewById找不到
- android中在Layout布局文件中添加控件ID,在Activity中findViewById找不到
- Android Studio自动生成控件Id插件的使用--findViewById自动化
- Android 继承BaseActivity的典型用法
- Android fragment 获取id,findViewById为空
- Android开发中的findViewById(R.id.textView)
- Centos 6.4 python 2.6 升级到 2.7
- iOS预留
- 织梦如何修改图片水印
- modsecurity系列二:主文件配置
- Twitter的分布式自增ID算法snowflake (Java版)
- Android基于4.4沉侵式状态栏和继承BaseActivity不用findViewbyid得到控件id
- LINQ查询操作符
- RHEL/CentOS and Debian/Ubuntu上使用Nginx安装odoo9
- HTTPS
- 【C/PY】浮点型 float
- iOS9 UIStackView 简介
- tomcat configuration path报错
- 人脸识别技术在公安领域的应用浅析【识别过程描述】
- 如何搭建一个git服务器?