Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/234.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 将MediaController放置在片段中_Android_Android View_Android Mediaplayer - Fatal编程技术网

Android 将MediaController放置在片段中

Android 将MediaController放置在片段中,android,android-view,android-mediaplayer,Android,Android View,Android Mediaplayer,我注意到一个关于视频视图的媒体控制器在片段中的位置的问题。 以下是运行Android 4.3的Nexus 7上的屏幕截图: 下面是运行安卓4.2.2的Nexus 7应用程序的屏幕截图: 正如你所看到的,中间控制器的位置在我的API 17或更低的活动中间(在另一个平板上也有4.1.2的测试)。我注意到MediaController的大小是正确的 我的片段显示在一个FrameLayout中,其宽度是由它的权重(这里是0.6)定义的,因此不是由特定的dpi值定义的 我已经检查了MediaContr

我注意到一个关于
视频视图
媒体控制器
片段中的位置的问题。
以下是运行Android 4.3的Nexus 7上的屏幕截图:

下面是运行安卓4.2.2的Nexus 7应用程序的屏幕截图:

正如你所看到的,中间控制器的位置在我的API 17或更低的活动中间(在另一个平板上也有4.1.2的测试)。我注意到MediaController的大小是正确的

我的片段显示在一个FrameLayout中,其宽度是由它的权重(这里是0.6)定义的,因此不是由特定的dpi值定义的

我已经检查了MediaController的源代码,并将4.3版本的源代码与4.2.2版本的源代码进行了比较,LayoutParams有一些小的更改,但我找不到一种方法来实现这一点

我在片段的onActivityCreated()中初始化VideoView和MediaController

mMediaController = new MediaController(getActivity());
mMediaController.setAnchorView(videoView);
videoView.setMediaController(mMediaController);

有人知道我如何正确定位它吗?

首先,我们需要定制MediaController来改变它在android 4.3之前版本中的怪异行为

class CustomMediaController extends MediaController
{

    public CustomMediaController(Context context) {
        super(context);
    }

    public CustomMediaController(Context context, AttributeSet attrs) {
    super(context, attrs);
    }

    public CustomMediaController(Context context, boolean useFastForward) {
        super(context, useFastForward);
    }

    @Override
    public void show(int timeout) {
        super.show(timeout);
        int currentapiVersion = android.os.Build.VERSION.SDK_INT;
        if (currentapiVersion < 18) //android.os.Build.VERSION_CODES.JELLY_BEAN_MR2
        {
            try {
                Field field1 = MediaController.class.getDeclaredField("mAnchor");
                field1.setAccessible(true);
                View mAnchor = (View)field1.get(controller);

                Field field2 = MediaController.class.getDeclaredField("mDecor");
                field2.setAccessible(true);
                View mDecor = (View)field2.get(controller);

                Field field3 = MediaController.class.getDeclaredField("mDecorLayoutParams");
                field3.setAccessible(true);
                WindowManager.LayoutParams mDecorLayoutParams = (WindowManager.LayoutParams)field3.get(controller);

                Field field4 = MediaController.class.getDeclaredField("mWindowManager");
                field4.setAccessible(true);
                WindowManager mWindowManager = (WindowManager)field4.get(controller);

                int [] anchorPos = new int[2];
                mAnchor.getLocationOnScreen(anchorPos);

                // we need to know the size of the controller so we can properly position it
                // within its space
                mDecor.measure(MeasureSpec.makeMeasureSpec(mAnchor.getWidth(), MeasureSpec.AT_MOST),
                                MeasureSpec.makeMeasureSpec(mAnchor.getHeight(), MeasureSpec.AT_MOST));

                WindowManager.LayoutParams p = mDecorLayoutParams;
                p.width = mAnchor.getWidth();
                p.x = anchorPos[0] + (mAnchor.getWidth() - p.width) / 2;
                p.y = anchorPos[1] + mAnchor.getHeight() - mDecor.getMeasuredHeight();
                mWindowManager.updateViewLayout(mDecor, mDecorLayoutParams);

            } catch (Exception e) {
                    e.printStackTrace();
            }
        }
    }
}
类CustomMediaController扩展MediaController
{
公共CustomMediaController(上下文){
超级(上下文);
}
公共CustomMediaController(上下文、属性集属性){
超级(上下文,attrs);
}
公共CustomMediaController(上下文,布尔useFastForward){
super(上下文,使用快进);
}
@凌驾
公共无效显示(整数超时){
super.show(超时);
int currentapiVersion=android.os.Build.VERSION.SDK\u int;
if(currentapiVersion<18)//android.os.Build.VERSION\u code.JELLY\u BEAN\u MR2
{
试一试{
field1=MediaController.class.getDeclaredField(“mAnchor”);
字段1.setAccessible(true);
查看mAnchor=(查看)字段1.get(控制器);
field2=MediaController.class.getDeclaredField(“mDecor”);
字段2.setAccessible(true);
View mDecor=(View)field2.get(controller);
field3=MediaController.class.getDeclaredField(“mDecorLayoutParams”);
字段3.setAccessible(true);
WindowManager.LayoutParams mDecorLayoutParams=(WindowManager.LayoutParams)字段3.get(控制器);
field4=MediaController.class.getDeclaredField(“mWindowManager”);
字段4.setAccessible(true);
WindowManager mWindowManager=(WindowManager)字段4.get(控制器);
int[]主播=新int[2];
mAnchor.getLocationOnScreen(主播);
//我们需要知道控制器的大小,以便能够正确定位它
//在其空间内
mDecor.measure(MeasureSpec.makeMeasureSpec(mAnchor.getWidth(),MeasureSpec.至多),
MeasureSpec.makeMeasureSpec(mAnchor.getHeight(),MeasureSpec.AT_MOST));
WindowManager.LayoutParams p=mDecorLayoutParams;
p、 width=mAnchor.getWidth();
p、 x=主播[0]+(mAnchor.getWidth()-p.width)/2;
p、 y=anchorPos[1]+mAnchor.getHeight()-mDecor.getMeasuredHeight();
mWindowManager.updateViewLayout(mDecor、mDecorLayoutParams);
}捕获(例外e){
e、 printStackTrace();
}
}
}
}
然后只需将变量声明中的MediaController替换为CustomMediaController,一切都可以完成。原因是4.3之前的android代码被窃听了。我们在show()方法中使用反射来纠正位置


用android 4.0测试。

什么是“控制器”对象?什么是控制器?