編輯:關於Android編程
問題描述:
android 機頂盒應用:
應用程序主界面(MainActivity)只有兩個控件,一個videoview和一個button。
視頻框設置無焦點,按鍵有焦點。
首次進入應用時焦點正常,聚焦在button上;但是當點擊button跳轉到下一個activity並返回時,焦點卻聚焦到了videoview上,並且代碼裡強制設置焦點:
Button.requestFocus();
無效,現象是視頻加載時,焦點是在button處,但是當視頻加載完成開始播放時,整個activity失去焦點,幾秒後,焦點跑到videoview上面。
原因分析:
查看了一下VideoView的源碼,發現原因出在初始化上面上:
private void initVideoView() { mVideoWidth = 0; mVideoHeight = 0; getHolder().addCallback(mSHCallback); getHolder().setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); setFocusable(true);//問題出在這裡 setFocusableInTouchMode(true); requestFocus(); mPendingSubtitleTracks = new Vector<Pair<InputStream, MediaFormat>>(); mCurrentState = STATE_IDLE; mTargetState = STATE_IDLE; }
看到這裡就豁然開朗了,這就解釋了為什麼xml中設置了android:focusable="false"而videoview仍然能獲取焦點的問題,也解釋了為什麼button會獲得焦點而當視頻加載好後被videoview搶占的問題。
解決方法:
明白了問題所在就好解決了,因為只是解決焦點問題,所以無需自定義videoview那麼麻煩,只需要重寫onResume()方法即可:
@Override protected void onResume() { super.onResume(); videoView.setFocusable(false); }
總結:
一定要多看源碼!
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持本站。
在之前的一篇博客Android 異步消息處理機制:Looper、Handler、Message中,我們講解了Looper、Handler、Message三者的關系。實際開
前提概要:上一篇文章已經介紹過了RecyclerView的基本使用方法,原文如下:android RecyclerView布局真的只是那麼簡單!此篇文章算是對Recycl
本文實例講述了Android簡單創建一個Activity的方法。分享給大家供大家參考,具體如下:1) 創建一個android項目填寫項目信息2) 創建一個新Activit
SharedPreference:1.是一種輕型的數據存貯方式2.本質是基於xml文件存貯key_value鍵值對數據3.通常用來存貯一些簡單的配置信息(密碼,窗口狀態,