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;
}

}



}
0 0