Android 通过反射 getDeclaredField 设置按钮的监听事件

作者: black_wizard 分类: android,java 发布时间: 2018-03-22 15:24

使用阿里云的UI播放器,全屏放大后点击 “< ” 返回按钮会缩小会小屏播放,再点击一次才会结束当前activity

进入布局AliyunVodPlayerView看到的返回按钮相关的代码是

private com.aliyun.vodplayerview.c.a.a d;
this.d.setOnBackClickListener(new com.aliyun.vodplayerview.c.a.a.a() {
    public void onClick() {
        if(AliyunVodPlayerView.this.p == AliyunScreenMode.Full) {
            AliyunVodPlayerView.this.changeScreenMode(AliyunScreenMode.Small);
        } else if(AliyunVodPlayerView.this.p == AliyunScreenMode.Small) {
            Context context = AliyunVodPlayerView.this.getContext();
            if(context instanceof Activity) {
                ((Activity)context).finish();
            }
        }

    }
});

全屏的情况下点击返回按钮先变回小屏模式,再次点击才会结束。
GG,我想要的是点击返回按钮后直接结束当前activity,只通过放大缩小按钮进行大小屏缩放
com.aliyun.vodplayerview.c.a.a d是private ,不能直接修改监听事件。
不过类 com.aliyun.vodplayerview.c.a.a 的监听事件方法
private a.a K;
public void setOnBackClickListener(a.a l) {
    this.K = l;
}
有搞头
通过使用java的反射设置按钮的监听事件
1.从AliyunVodPlayerView 获取实例 com.aliyun.vodplayerview.c.a.a d
2.从 com.aliyun.vodplayerview.c.a.a 获取监听实例com.aliyun.vodplayerview.c.a.a.a K
3.设置d 的setOnBackClickListener 监听事件
try {
    Field field = AliyunVodPlayerView.class.getDeclaredField("d");  //获取AliyunVodPlayerView私有属性字段
    field.setAccessible(true);                                              //成员变量d为private,故必须进行此操作
    Object  d = field.get(mAliyunVodPlayerView);
    Class infoClazz = Class.forName("com.aliyun.vodplayerview.c.a.a");      
    Field listenerField = infoClazz.getDeclaredField("K");          //获取返回按钮的类私有属性字段 监听事件 setOnBackClickListener(a.a l)
    listenerField.setAccessible(true);  
    listenerField.set(d, new com.aliyun.vodplayerview.c.a.a.a() {
        @Override
        public void onClick() {
            finish();
        }
    });
} catch (NoSuchFieldException e) {
    e.printStackTrace();
} catch (IllegalAccessException e) {
    e.printStackTrace();
} catch (ClassNotFoundException e) {
    e.printStackTrace();
}
这样点击返回"<"就直接结束当前activity