我們一般使用View的流程是在onCreate中使用setContentView來設置要顯示Layout文件或直接創建一個View,
在當設置了ContentView之后系統會對這個View進行解析,然后回調當前視圖View中的onFinishInflate方法。
只有解析了這個View我們才能在這個View容器中獲取到擁有Id的組件,同樣因為系統解析完View之后才會調用onFinishInflate方法,
所以我們自定義組件時可以onFinishInflate方法中獲取指定子View的引用。
onFinishInflate() 當View中所有的子控件均被映射成xml后觸發
onMeasure(int, int) 確定所有子元素的大小
onLayout(boolean, int, int, int, int) 當View分配所有的子元素的大小和位置時觸發
onSizeChanged(int, int, int, int) 當view的大小發生變化時觸發
onDraw(Canvas) view渲染內容的細節
onKeyDown(int, KeyEvent) 有按鍵按下后觸發
onKeyUp(int, KeyEvent) 有按鍵按下后彈起時觸發
onTrackballEvent(MotionEvent) 軌跡球事件
onTouchEvent(MotionEvent) 觸屏事件
onFocusChanged(boolean, int, Rect) 當View獲取或失去焦點時觸發
onWindowFocusChanged(boolean) 當窗口包含的view獲取或失去焦點時觸發
onAttachedToWindow() 當view被附著到一個窗口時觸發
onDetachedFromWindow() 當view離開附著的窗口時觸發,該方法和 onAttachedToWindow() 是相反。
onWindowVisibilityChanged(int) 當窗口中包含的可見的view發生變化時觸發
這里只看onFinishInflate()方法。下面從網上看到一個簡單的測試代碼,貼在下面,我后面講到的Android抽屜效果也會再一次說到這個函數,
public class HeaderBar extends LinearLayout{....}
構造函數:
public HeaderBar(Context context, AttributeSet attrs) { this(context, attrs, R.style.headerTitleBarStyle); } public HeaderBar(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); LayoutInflater.from(context).inflate(R.layout.header, this, true); TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.HeaderBar); mLeftButtonBg = a.getDrawable(R.styleable.HeaderBar_leftButtonBackground); if (mLeftButtonBg == null) { mLeftButtonBg = context.getResources().getDrawable(R.drawable.back_btn_selector); } mRightButtonBg = a.getDrawable(R.styleable.HeaderBar_rightButtonBackground); if (mRightButtonBg == null) { mRightButtonBg = context.getResources().getDrawable(R.drawable.refresh); } mTitleTextViewButtonBg = a.getDrawable(R.styleable.HeaderBar_titleTextViewBackground); mTitle = a.getText(R.styleable.HeaderBar_title); a.recycle(); }
關于R.styleable.HeaderBar_.....的問題請我看我的專題文章有介紹這個知識點
http://blog.csdn.net/u014737138/article/details/40789899
重載onFinishInflate()
@Override protected void onFinishInflate() { //super.onFinishInflate(); this.mTitleTextView = (TextView) this.findViewById(R.id.tv_header_title); this.mLeftButton = (Button) this.findViewById(R.id.btn_header_left); this.mRightButton = (Button) this.findViewById(R.id.btn_header_right); this.mLeftButton.setBackgroundDrawable(this.mLeftButtonBg); this.mRightButton.setBackgroundDrawable(this.mRightButtonBg); if (this.mTitleTextViewButtonBg != null) { //titleTextViewButtonBg = context.getResources().getDrawable(R.drawable.refresh); this.mTitleTextView.setBackgroundDrawable(this.mTitleTextViewButtonBg); } if (this.mTitle != null) { this.mTitleTextView.setText(this.mTitle); } }
從這個函數中的代碼我們很清楚的知道它們干的是啥:
就是一個作用:獲取指定子View布局文件中組件的引用,也就是找到這個組件的ID
onFinishInflate 當View中所有的子控件均被映射成xml后觸發 |
---|
我們接下來就是怎么使用的問題?
在需要使用自定義控件的layout文件,以包名+控件名作為標簽名
注意:如果需要用自己的屬性,要加上自己的命名空間:xmlns:xl=http://schemas.android.com/apk/res/com.xxx.abc 規則是:http://schemas.android.com/apk/res/ + 包名
這個在前面的自定義控件的文章也有講過,詳細的請看我前面的文章
<RelativeLayout xmlns:andro
xmlns:xl="http://schemas.android.com/apk/res/com.xxx.abc" android:layout_width="fill_parent" android:layout_height="fill_parent" android:background="#f9f9f9" android:orientation="vertical" > <com.xxx.abc.view.HeaderBar android: android:layout_width="match_parent" android:layout_height="wrap_content" xunlei:title="@string/lan_video_title" xl:rightButtonBackground="@drawable/lan_video_add_btn_selector"> </com.xxx.abc.view.HeaderBar>
參考地址: http://www.cnblogs.com/vivid-stanley/archive/2012/05/25/2518500.html
了解了它的作用,接下來我們還要啰嗦一句,就是這個函數什么時候調用,能做什么事?
比如你 自定義一個view叫myView ,路徑是,com.test.view.MyView,此view是繼承LinearLayout,定義的布局文件是my_view.xml里面內容是:<com.test.view.MyView> <xxxx /></com.test.view.MyView>當你在使用的時候,可以這樣使用MyView mv = (MyView)View.inflate (context,R.layout.my_view,null);當加載完成xml后,就會執行那個方法。 |
---|
執行這個方法我們獲得的是什么呢?---------------------------- 獲得對這個布局文件中的組件的引用
本文由 貴州做網站公司 整理發布,部分圖文來源于互聯網,如有侵權,請聯系我們刪除,謝謝!
網絡推廣與網站優化公司(網絡優化與推廣專家)作為數字營銷領域的核心服務提供方,其價值在于通過技術手段與策略規劃幫助企業提升線上曝光度、用戶轉化率及品牌影響力。這...
在當今數字化時代,公司網站已成為企業展示形象、傳遞信息和開展業務的重要平臺。然而,對于許多公司來說,網站建設的價格是一個關鍵考量因素。本文將圍繞“公司網站建設價...
在當今的數字化時代,企業網站已成為企業展示形象、吸引客戶和開展業務的重要平臺。然而,對于許多中小企業來說,高昂的網站建設費用可能會成為其發展的瓶頸。幸運的是,隨...
什么是熱更新?熱更新是什么意思?如果您經常玩游戲,您應該會看到,當您打開游戲客戶端時,系統會提示您有更新,您需要下載更新包。對于手機游戲來說,可能從幾米到幾百米不等。對于電腦游戲,如lol,它的范圍也從幾十米到幾百兆字節。這樣,您只需要下載客戶端本身的更新包,而不需要再次下載整個客戶端的更新方法稱為熱更新。蘋果對應用程序和游戲的內容有嚴格的控制。每個應用程序或游戲在上架前都會經過審核。也就是說,蘋...
趕集網賣的二手車市真的?您好,市場發布的二手車信息真實可靠,二手信息由真實用戶發布。市場上所有的二手車信息都是需要審批的,只有符合要求的二手車信息才能被審批。交易會發布的二手車信息全部屬實。太原哪有賣二手柴油農用三輪車的?你可以去太原當地的網站,如Jiji.com、People.com、胡巴同城等。你可能會發現二手柴油農用三輪車的銷售信息。太原市哪有比較好的二手車交易市場?陜西萬國二手車交易市場地...
趕集網是干什么的哦?市場是做什么的?市場是做什么的?趕集網是一個官方的線上平臺。你可以用它在網上購物、交易、查詢、租房或找工作。它是一個為你提供各種信息供參考的平臺。在它的幫助下,你可以去市場,在網上感受。趕集網是干什么的哦?市場是個網站,賣各種各樣的東西,就像上一屆一樣,就像買東西一樣。它是一個銷售商品的軟件。趕集網如何發布求租信息?1.先登錄市場。,選擇自己的城市,2.點擊租房,3.點擊發布租...