Android TV 原生VideoView抢占焦点问题
在遥控操作的Android TV等产品中,打开含有原生VideoView的Activity时会出现焦点丢失,或者焦点在VideoView上的问题
问题原因为在VideoView初始化中会进行焦点处理,导致无论是在xml中还是其它地方设置都无效
// An highlighted block
public VideoView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
super(context, attrs, defStyleAttr, defStyleRes);
mVideoWidth = 0;
mVideoHeight = 0;
mAudioManager = (AudioManager) mContext.getSystemService(Context.AUDIO_SERVICE);
mAudioAttributes = new AudioAttributes.Builder().setUsage(AudioAttributes.USAGE_MEDIA)
.setContentType(AudioAttributes.CONTENT_TYPE_MOVIE).build();
getHolder().addCallback(mSHCallback);
getHolder().setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
//start 初始化中对焦点的处理
setFocusable(true);
setFocusableInTouchMode(true);
requestFocus();
//end
mCurrentState = STATE_IDLE;
mTargetState = STATE_IDLE;
}
解决方案:
public class MyVideoView extends VideoView {
public MyVideoView(Context context) {
super(context);
initView();
}
public MyVideoView(Context context, AttributeSet attrs) {
super(context, attrs);
initView();
}
public MyVideoView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
initView();
}
public MyVideoView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
super(context, attrs, defStyleAttr, defStyleRes);
initView();
}
private void initView(){
setFocusable(false);
setFocusableInTouchMode(false);
clearFocus();
}
}
在遥控操作的Android TV应用中,遇到VideoView初始化时自动抢占焦点导致焦点管理失效的问题。深入分析发现,VideoView内部的焦点处理机制是问题根源。为了解决这个问题,需要采取特定的解决方案来正确管理焦点。
1072

被折叠的 条评论
为什么被折叠?



