Android自定义VideoView设置尺寸无效且遇类加载异常求助
先帮你拆解两个核心问题:致命ClassNotFoundException崩溃和VideoView尺寸不生效,一步步来解决:
一、先解决致命异常(ClassNotFoundException)
从你的日志和代码细节来看,崩溃有两个明确的原因:
1. 包名不一致导致类找不到
异常日志里显示你的应用进程是com.nati_1.ImageGallerySwitching_v6,但代码和XML布局里的包名却是com.nati_1.ImageGallerySwitching_v8——系统在错误的包路径下找自定义View,肯定找不到。你需要:
- 检查
AndroidManifest.xml里的包名,确保和代码的包路径完全一致; - 修正XML布局里自定义View的引用路径,保证和实际包名匹配。
2. 非静态内部类无法在XML中直接实例化
你的MyVideoView是VideoActivity的非静态内部类,Android布局 inflater没办法直接创建它的实例(非静态内部类依赖外部Activity的实例才能存在)。解决方法二选一:
- 把
MyVideoView改成静态内部类,在类定义前加static关键字:public static class MyVideoView extends VideoView { // 保留原有的成员变量和方法逻辑 } - 或者把
MyVideoView单独提取成一个独立的Java类文件(比如MyVideoView.java),放在同一个包下,这样XML里的引用可以简化成com.nati_1.ImageGallerySwitching_v8.MyVideoView。
二、解决VideoView尺寸不生效的问题
你调用video1.setVideoSize(70,70)后看不到变化,主要有这几个问题:
1. 自定义方法和系统方法重名,逻辑冲突
系统自带的VideoView本身就有setVideoSize(int width, int height)方法,作用是设置视频的解码分辨率,而你自定义的同名方法是用来控制View的显示尺寸——这会造成逻辑混淆,系统可能优先执行系统方法而非你的自定义逻辑。建议把你的方法改名,比如改成setViewDisplaySize(int width, int height)。
2. 布局约束限制了View的尺寸
你的XML里给MyVideoView设置了layout_width="0dp"、layout_height="0dp",并且用ConstraintLayout的约束让它完全绑定父布局的上下左右,这种情况下,你自定义的onMeasure逻辑会被ConstraintLayout的布局规则覆盖。调整方案:
- 如果想要固定尺寸,直接把
layout_width和layout_height改成具体的dp值(比如70dp),而不是0dp; - 如果要保留约束布局,需要修改
onMeasure逻辑,让自定义尺寸优先级更高:@Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { if (mVideoWidth > 0 && mVideoHeight > 0) { // 把dp转换成像素,保证不同设备显示一致 float density = getResources().getDisplayMetrics().density; int pixelWidth = (int) (mVideoWidth * density); int pixelHeight = (int) (mVideoHeight * density); setMeasuredDimension(pixelWidth, pixelHeight); } else { // 没有设置自定义尺寸时,用默认测量逻辑 super.onMeasure(widthMeasureSpec, heightMeasureSpec); } }
3. 触发布局重新测量
设置完尺寸后,记得调用video1.requestLayout(),强制View重新执行测量和布局流程,确保尺寸变化生效。
额外调试建议
先注释掉尺寸设置的代码,确保异常问题解决后视频能正常播放,再逐步加入尺寸逻辑调试,这样更容易定位问题。
内容的提问来源于stack exchange,提问作者Nati Levi

