我们一般使用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(); }
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:android="http://schemas.android.com/apk/res/android"
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:id="@+id/lan_video_title_bar" 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>
了解了它的作用,接下来我们还要啰嗦一句,就是这个函数什么时候调用,能做什么事?
比如你 自定义一个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后,就会执行那个方法。 |