继上一篇文章,问什么在自定义UI的时候会出现下面情况。
自定义UI框架中:
/***************************************************** * 再调用时,重写函数 * */ protected void prepare() { // do nothing or you override it } /***************************************************** * 再调用时,重写函数 * */ protected View getTop() { // do nothing or you override it return null; } protected int getTabCount() { return mTabHost.getTabWidget().getTabCount(); } /** TabItem函数功能*****************************************/ abstract protected void setTabItemTextView(TextView textView, int position); abstract protected String getTabItemId(int position); abstract protected Intent getTabItemIntent(int position); abstract protected int getTabItemCount(); protected void setCurrentTab(int index) { mTabHost.setCurrentTab(index); } protected void focusCurrentTab(int index) { mTabWidget.focusCurrentTab(index); }
@Override protected void setTabItemTextView(TextView textView, int position) { Log.i(TAG, "setTabItemTextView"); textView.setPadding(3, 3, 3, 3); textView.setText(mItems.get(position).getTitle()); textView.setBackgroundResource(mItems.get(position).getBg()); textView.setCompoundDrawablesWithIntrinsicBounds(0, mItems.get(position).getIcon(), 0, 0); } @Override protected String getTabItemId(int position) { Log.i(TAG, "getTabItemId"); return mItems.get(position).getTitle(); //鑾峰彇褰撳墠ID } @Override protected Intent getTabItemIntent(int position) { Log.i(TAG, "getTabItemIntent"); return mItems.get(position).getIntent(); } @Override protected int getTabItemCount() { Log.i(TAG, "getTabItemCount"); return mItems.size(); }
重载:
(1) 方法重载是让类以统一的方式处理不同类型数据的一种手段。多个同名函数同时存在,具有不同的参数个数/类型。
重载Overloading是一个类中多态性的一种表现。
(2) Java的方法重载,就是在类中可以创建多个方法,它们具有相同的名字,但具有不同的参数和不同的定义。
调用方法时通过传递给它们的不同参数个数和参数类型来决定具体使用哪个方法, 这就是多态性。
(3) 重载的时候,方法名要一样,但是参数类型和个数不一样,返回值类型可以相同也可以不相同。无法以返回型别作为重载函数的区分标准。
重写:
(1) 父类与子类之间的多态性,对父类的函数进行重新定义。如果在子类中定义某方法与其父类有相同的名称和参数,我们说该方法被重写 (Overriding)。在Java中,子类可继承父类中的方法,而不需要重新编写相同的方法。
但有时子类并不想原封不动地继承父类的方法,而是想作一定的修改,这就需要采用方法的重写。
方法重写又称方法覆盖。
(2)若子类中的方法与父类中的某一方法具有相同的方法名、返回类型和参数表,则新方法将覆盖原有的方法。
如需父类中原有的方法,可使用super关键字,该关键字引用了当前类的父类。
(3)子类函数的访问修饰权限不能少于父类的;
引用:http://www.cnblogs.com/bluestorm/archive/2012/03/01/2376236.html
2 运行过程下面是我截取的一段log:
06-03 03:02:21.667: I/TabActivity(335): ------------------this is TabActivity-----------
06-03 03:02:21.667: I/MainActivity(335): prepare--
06-03 03:02:21.707: I/TabActivity(335): initTabSpec
06-03 03:02:21.707: I/MainActivity(335): getTabItemCount
06-03 03:02:21.727: I/MainActivity(335): setTabItemTextView
06-03 03:02:21.777: I/MainActivity(335): getTabItemId
06-03 03:02:21.787: I/MainActivity(335): getTabItemIntent
06-03 03:02:21.888: I/MainActivity(335): setTabItemTextView
06-03 03:02:21.897: I/MainActivity(335): getTabItemId
06-03 03:02:21.897: I/MainActivity(335): getTabItemIntent
06-03 03:02:21.917: I/MainActivity(335): setTabItemTextView
06-03 03:02:21.987: I/MainActivity(335): getTabItemId
06-03 03:02:21.987: I/MainActivity(335): getTabItemIntent
06-03 03:02:22.007: I/MainActivity(335): setTabItemTextView
06-03 03:02:22.038: I/MainActivity(335): getTabItemId
06-03 03:02:22.038: I/MainActivity(335): getTabItemIntent
06-03 03:02:22.051: I/MainActivity(335): ---------this is MainAcitvity--------
可见,我们在public class MainActivity extends TabHostActivity 其中MainActivity继承了TabhostActivity类,那么马上跳转到MainActivity类中执行当前的构造函数
protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // set theme because we do not want the shadow setContentView(R.layout.ui_tabhost); Log.i(TAG, "------------------this is TabActivity-----------"); mLayoutflater = getLayoutInflater(); mTabHost = getTabHost(); //Returns the TabHost the activity is using to host its tabs mTabWidget = getTabWidget();//Returns the TabWidget the activity is using to draw the actual tabs. prepare(); initTabSpec(); }
以上我们在不改变框架代码的情况下,通过重写框架代码的方法实现UI的自定义。