2013-10-09 7 views
6

के अंदर मीडिया नियंत्रक स्थिति के लिए Fragment के अंदरकी स्थिति से संबंधित एक समस्या देखी गई है। यह इस प्रकार से नेक्सस 7 पर चल रहा Android 4.3 का एक स्क्रीनशॉट है: Screenshot of app with MediaController on 4.3स्थिति फ्रैगमेंट

और यहाँ चल नेक्सस 7 पर अनुप्रयोग का स्क्रीनशॉट Android 4.2.2 है: enter image description here

आप देख सकते हैं, स्थिति MediaController का एपीआई 17 या उससे कम पर मेरी गतिविधि के बीच में है (4.1.2 के साथ एक और टैबलेट पर भी परीक्षण किया गया है)। मैंने देखा है कि MediaController का आकार सही है।

मेरा टुकड़ा फ़्रेमलेआउट में दिखाया गया है जिसका चौड़ाई इसके वजन (0.6 यहां) द्वारा परिभाषित किया गया है, इसलिए एक विशिष्ट डीपीआई मान से नहीं।

मैंने Grepcode पर मीडिया कंट्रोलर के स्रोत कोड की जांच की है और 4.2.2 के कोड के साथ 4.3 में से एक की तुलना की है और लेआउटपैम्स के साथ कुछ छोटे बदलाव हैं, लेकिन मुझे यह काम करने का कोई तरीका नहीं मिल रहा है ।

मैं अपने टुकड़ा की onActivityCreated() में अपने VideoView और MediaController प्रारंभ

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

किसी पता है कि कैसे मैं यह सही रख सकते हैं?

उत्तर

2

सबसे पहले, हम इसे एंड्रॉयड पूर्व 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 की जगह बदलने के लिए कस्टम MediaController की आवश्यकता होगी। कारण 4.3 से पहले एंड्रॉइड कोड बग किया गया था। हम शो() विधि में स्थिति को सही करने के लिए प्रतिबिंब का उपयोग कर रहे हैं।

एंड्रॉइड 4.0 के साथ परीक्षण किया गया।

+0

"नियंत्रक" ऑब्जेक्ट क्या है? – kmas

+0

नियंत्रक क्या है? – delive