2013-10-09 17 views
6

Tôi đã nhận thấy một vấn đề liên quan đến vị trí của một MediaController cho một VideoView bên trong một Fragment. Dưới đây là một ảnh chụp màn hình của nó trông như thế nào trên Nexus 7 chạy Android 4.3: Screenshot of app with MediaController on 4.3vị trí MediaController bên trong một Fragment

Và đây là một ảnh chụp màn hình của ứng dụng trên Nexus 7 chạy Android 4.2.2: enter image description here

Như bạn thấy, vị trí của MediaController đang ở giữa Hoạt động của tôi trên API 17 trở xuống (cũng được thử nghiệm trên một máy tính bảng khác có 4.1.2). Tôi đã nhận thấy rằng kích thước của MediaController là chính xác.

Phân đoạn của tôi được hiển thị trong FrameLayout có chiều rộng được xác định bởi trọng lượng của nó (0.6 ở đây), do đó không phải bởi giá trị dpi cụ thể.

Tôi đã kiểm tra mã nguồn của MediaController trên Grepcode và so sánh mã nguồn của 4.3 với mã 4.2.2 và có một số thay đổi nhỏ với LayoutParams, nhưng tôi không thể tìm cách tạo công việc này .

tôi khởi VideoView và MediaController tôi trong onActivityCreated() của Fragment tôi

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

Có ai đó biết làm thế nào tôi có thể vị trí của nó phải không?

Trả lời

2

Trước hết, chúng ta sẽ cần phải tùy chỉnh MediaController thay đổi đó là hành vi kỳ lạ trong android trước 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(); 
      } 
     } 
    } 
} 

Sau đó chỉ cần thay thế MediaController trong khai báo biến với CustomMediaController và mọi thứ sẽ làm. Lý do là mã Android trước 4.3 bị lỗi. Chúng tôi đang sử dụng phản chiếu để sửa vị trí trong phương thức hiển thị().

Đã thử nghiệm với Android 4.0.

+0

Đối tượng "điều khiển" đó là gì? – kmas

+0

Bộ điều khiển là gì? – delive

Các vấn đề liên quan