本文主要是介绍Android应用中捕捉所有点击事件实现,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
一、思路
(1)获取Activity对象;
(2)遍历所有子控件;
(3)注册点击事件。
二、实现
(1)获取Activity对象
activity对象的获取可以考虑多个方面,从两个方面进行选择:
①获取当前运行的activity对象
@TargetApi(Build.VERSION_CODES.KITKAT)public static Activity getRunningActivity() {try {Class activityThreadClass = Class.forName("android.app.ActivityThread");Object activityThread = activityThreadClass.getMethod("currentActivityThread").invoke(null);Field activitiesField = activityThreadClass.getDeclaredField("mActivities");activitiesField.setAccessible(true);ArrayMap activities = (ArrayMap) activitiesField.get(activityThread);for (Object activityRecord : activities.values()) {Class activityRecordClass = activityRecord.getClass();Field pausedField = activityRecordClass.getDeclaredField("paused");pausedField.setAccessible(true);if (!pausedField.getBoolean(activityRecord)) {Field activityField = activityRecordClass.getDeclaredField("activity");activityField.setAccessible(true);return (Activity) activityField.get(activityRecord);}}} catch (Exception e) {throw new RuntimeException(e);}throw new RuntimeException("Didn't find the running activity");}
②重写application注册activity生命周期回调
public void RegisterActivityCallback(Context context){((Application)context.getApplicationContext()).registerActivityLifecycleCallbacks(new Application.ActivityLifecycleCallbacks() {@Overridepublic void onActivityCreated(Activity activity, Bundle savedInstanceState) {}@Overridepublic void onActivityStarted(Activity activity) {}@Overridepublic void onActivityResumed(Activity activity) {}@Overridepublic void onActivityPaused(Activity activity) {}@Overridepublic void onActivityStopped(Activity activity) {}@Overridepublic void onActivitySaveInstanceState(Activity activity, Bundle outState) {}@Overridepublic void onActivityDestroyed(Activity activity) {}});}
(2)遍历所有子控件
public List<View> getAllChildViews(View view) {List<View> allchildren = new ArrayList<View>();if (view instanceof ViewGroup) {ViewGroup vp = (ViewGroup) view;for (int i = 0; i < vp.getChildCount(); i++) {View viewchild = vp.getChildAt(i);allchildren.add(viewchild);allchildren.addAll(getAllChildViews(viewchild));}}return allchildren;}
(3)注册点击事件
public static void registerRunningActivityTouchEvent(){Activity activity = getRunningActivity();for(View view : getAllChildViews(activity.getWindow().getDecorView())){view.setOnTouchListener(new View.OnTouchListener(){@Overridepublic boolean onTouch(View v, MotionEvent event) {//捕捉到的点击事件return false;}});}}
三、注意
点击事件捕捉后,onTouch实现有对应返回true/false,分别表示点击事件是否被消耗,如果消耗了就不会在继续传递。
这篇关于Android应用中捕捉所有点击事件实现的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!