,因此前面导入的头文件只需有BUTTON即可 */ 8 public class Hello_to_worldActivity extends Activity implements Button.OnClickListener android.app.Activity; 2 import android.os.Bundle; 3 import android.view.View; 4 import android.view.View.OnClickListener import android.widget.TextView; 7 8 public class Hello_to_worldActivity extends Activity implements OnClickListener hello_world = (TextView) findViewById(R.id.textView1); 18 btn_say_hello.setOnClickListener(new Button.OnClickListener btn_listener为监听方法的接口 17 } // 因此设置监听的参数只需传本类的对象即可 18 } 19 20 class btn_listener implements Button.OnClickListener
image.png 目录 第一章:android hook介绍 第二章:hook之替换View.OnClickListener 使用Hook修改View.OnClickListener 事件\ 首先 public void setOnClickListener(@Nullable OnClickListener l) { if (! 实战 执行分为三步: 第一步:获取 ListenerInfo 对象 第二步:获取原始的 OnClickListener事件方法 第三步:偷梁换柱,用 Hook代理类 替换原始的 OnClickListener Hook代理类 替换原始的 OnClickListener View.OnClickListener hookedOnClickListener = new HookedClickListenerProxy { private View.OnClickListener origin; public HookedClickListenerProxy(View.OnClickListener
The method setPositiveButton(int, DialogInterface.OnClickListener) in the type AlertDialog.Builder is not applicable for the arguments (String, new View.OnClickListener(){}) Here is your solution, you It should not be .setNegativeButton("Don't Remind", new OnClickListener() It should be .setNegativeButton ("Don't Remind", new DialogInterface.OnClickListener() 发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/150707
onClickListener) { onClickListener.onClick() } // 使用闭包创建接口对象 OnClickListener listener = { println 执行结果 : OnClickListener2 OnClickListener2 OnClickListener2 三、完整代码示例 ---- 完整代码示例 : // I. onClickListener) { onClickListener.onClick() } // 使用闭包创建接口对象 OnClickListener listener = { println (OnClickListener2 onClickListener) { onClickListener.onClick() } // 使用闭包创建接口对象 OnClickListener2 () setOnClickListener2(listener2) 执行结果 : OnClickListener OnClickListener OnClickListener2 OnClickListener2
接口 , interface OnClickListener { void onClick() } 将 OnClickListener 接口对象 作为函数参数 , 传递到函数中 , void setOnClickListener (OnClickListener onClickListener) { onClickListener.onClick() } 然后调用上述函数 , 传递一个 OnClickListener 的匿名内部类 , setOnClickListener(new OnClickListener() { @Override void onClick() onClickListener) { onClickListener.onClick() } setOnClickListener{ println "OnClick2" } 执行结果 (OnClickListener onClickListener) { onClickListener.onClick() } // 正常参数调用 setOnClickListener(new
下面通过 Hook View 的 OnClickListener 来说明 Hook 的使用方法。 首先进入 View 的 setOnClickListener 方法,我们看到 OnClickListener 对象被保存在了一个叫做 ListenerInfo 的内部类里,其中 mListenerInfo ListeneInfo 里面保存了 View 的各种监听事件,比如 OnClickListener、OnLongClickListener、OnKeyListener 等等。 OnClickListener 替换原始的 OnClickListener View.OnClickListener hookedOnClickListener = new HookedOnClickListener private View.OnClickListener origin; HookedOnClickListener(View.OnClickListener origin) {
Android 给自己的类加个事件 1、定义一个接口 public abstract interface ISpriteAction { public interface OnClickListener { void onClick(Sprite v); } } 2、给你的类定义事件 private ISpriteAction.OnClickListener onClickListener = null; public void setOnClickListener(ISpriteAction.OnClickListener listener){ this.onClickListener = listener; } 触发事件 if(onClickListener ! = null) onClickListener.onClick(this); 3、设置事件处理代码 代码title.setOnClickListener(new ISpriteAction.OnClickListener
*/ public static void hookListener(Activity activity, OnClickListener onClickListener) { getView(View view, OnClickListener onClickListener) { //递归遍历,判断当前view是不是ViewGroup,如果是继续遍历,直到不是为止 OnClickListener * * @param view * @param onClickListener */ private static void viewHook(View view onclickListener; public OnClickListenerProxy(View.OnClickListener object, ClickCollectionManager.OnClickListener onclickListener) { this.object = object; this.onclickListener = onclickListener
{ override fun onClick(view: View) { // 点击事件 } } 对应的就是 Java 中的 匿名内部类 ; new View.OnClickListener( */ public interface OnClickListener { /** * 当视图被单击时调用。 (object : OnClickListener{ override fun onClick(v: View?) 表达式 : // 添加按钮点击事件 , 设置一个 OnClickListener#onClick 函数类型的 Lambda 表达式 // 作为点击事件 函数类型的 Lambda 表达式 , 其 Lambda 表达式类型为 (View) -> Unit 传入 View 类型实例对象 , 返回值为 void , 对应的就是 OnClickListener
() { @Override public void onClick(View v) { Log.i(TAG, "Button OnClickListener onClick "); } }); 2、熟悉底层源码 使用 Hook 的前提是 , 必须熟悉要 Hook 功能的底层源码 , 如 : Hook 按钮点击事件 , 必须熟悉 View 组件的 OnClickListener getListenerInfo() 获取的是 ListenerInfo 类型的对象 , 其中就封装了 OnClickListener mOnClickListener 成员 , 点击监听器就是设置在这里 监听器 获取 ListenerInfo 中的 public OnClickListener mOnClickListener 成员 , 并重新设置新的成员 , 注入业务逻辑 ; ① 先根据全类名获取 mOnClickListener = null; try { mOnClickListener = (View.OnClickListener) field.get(mListenerInfo
我们可以写一个Proxy动态代理OnClickListener。 . */ public class ClickProxy implements View.OnClickListener{ private static boolean isStartLoadingClick =false; private static boolean isStartSingleClick=false; private View.OnClickListener onClickListener onClickListener, Context context){ this.onClickListener=onClickListener; this.mC=context 否则使用方式和普通的OnclickListener使用没有差别。
onClickListener; private Context context; private int colorId; public ButtonSpan(Context context, View.OnClickListener onClickListener) { this(context, onClickListener, R.color.color_theme ); } public ButtonSpan(Context context, View.OnClickListener onClickListener, int colorId) { this.onClickListener = onClickListener; this.context = context; this.colorId = null) { onClickListener.onClick(widget); } } } 设置: // content为全部的字符串,keyWord
下面通过 Hook View 的 OnClickListener 来说明 Hook 的使用方法。 ,所以就要在给 View 设置监听事件后,替换 OnClickListener 对象,注入自定义的操作。 // 用自定义的 OnClickListener 替换原始的 OnClickListener View.OnClickListener hookedOnClickListener = , e); } } class HookedOnClickListener implements View.OnClickListener { private View.OnClickListener 下面是调用的部分,在给 Button 设置 OnClickListener 后,执行 Hook 操作。
四、Hook View的点击事件 先看看View 点击事件的源码 public void setOnClickListener(@Nullable OnClickListener l) { 如果我们可以通过反射将这个ListenerInfo里面的mOnClickListener 替换成我们自定义的OnClickListener是不是就可以实现我们目的了。接下来我们试试! originOnClickListener = (View.OnClickListener) mOnClickListener.get(listenerInfo); // 用自定义的 hookedOnClickListener 替换原始的 mOnClickListener View.OnClickListener hookedOnClickListener { private View.OnClickListener origin; HookOnClickListener(View.OnClickListener
onClickListener; private Context context; private int colorId; public ButtonSpan(Context context, View.OnClickListener onClickListener) { this(context, onClickListener, R.color.color \_theme); } public ButtonSpan(Context context, View.OnClickListener onClickListener, int colorId) { this.onClickListener = onClickListener; this.context = context; = null) { onClickListener.onClick(widget); } } } 设置: // content为全部的字符串,keyWord
mFalseButton.setOnClickListaner(new View.OnClickListener(){ @Override public void onClick QuizActivity实例作为Context的参数值.注意此处应输入的参数是QuizActivity.this,不要想当然的直接输入this作为参数.因为匿名类的使用,这里的this指的是监听器View.OnClickListener 也就是说,直接在监听器View.OnClickListener里使用this,代表的是创建的这个匿名类,也就是实现了View.OnClickListener接口的一个类. 理论上说,如果View.OnClickListener匿名类继承自context,那么makeText(this,R.string.correct_toast,Toast.LENGTH_SHORT)从语法上来说就是正确的 ,但是View.OnClickListener只是一个接口,不会继承类.所以从语法上来说makeText(this,R.string.correct_toast,Toast.LENGTH_SHORT)是错误的
OnClickListener和其他Listener方法一样,都是View类的接口,重载实现后就能使用,其接口定义如下: public interface OnClickListener { android:text="Button6" /> </LinearLayout> 2、Main.java public class Main extends Activity implements OnClickListener ()对象, 即class Main 对象 * 用这种方式的话,public void onClick 方法必须写在该Main类中, 且Main类开头实现implements OnClickListener clickListener = new OnClickListener() { @Override public void onClick(View v) { String strTmp strTmp = "点击Button05"; tv.setText(strTmp); } }; } 3、callOut 类 public class callOut implements OnClickListener
; aldg.setButton(DialogInterface.BUTTON_POSITIVE, "进入", new OnClickListener() { @ ; aldg.setButton(DialogInterface.BUTTON_NEGATIVE,"确定",new OnClickListener() { @Override ; aldg.setButton(DialogInterface.BUTTON_POSITIVE, "重开游戏", new OnClickListener() { @Override ; aldg.setButton(DialogInterface.BUTTON_POSITIVE, "重开游戏", new OnClickListener() { ; aldg.setButton(DialogInterface.BUTTON_POSITIVE, "继续游戏", new OnClickListener() { @Override
android.content.Intent; import android.os.Bundle; import android.view.View; import android.view.View.OnClickListener android.view.Window; import android.widget.Button; public class MainApp extends Activity implements OnClickListener 未实现的方法 list.setOnClickListener(this);// 这里面this代表上下文 写完它只会需要实现OnClickListener未实现的方法 当布局文件中有很多id的时候,我们最好采用让主类去实现 OnClickListener未实现的方法,也就是让MainApp去implements OnClickListener 然后重载未实现的方法public void onClick(View todo break; case R.id.aboutbutton: //todo break; } (二)在内部类中实现未实现的方法 list.setOnClickListener(new OnClickListener
} }); normalDialog.setNegativeButton("Negative", new DialogInterface.OnClickListener ,此处设置为0 singleChoiceDialog.setSingleChoiceItems(items, mChoice, new DialogInterface.OnClickListener }); singleChoiceDialog.setPositiveButton("Positive", new DialogInterface.OnClickListener }); multiChoiceDialog.setPositiveButton("Positive", new DialogInterface.OnClickListener ").setView(editText); inputDialog.setPositiveButton("Positive", new DialogInterface.OnClickListener