編輯:關於Android編程
一、情形描述
在常使用的頁面布局中,為保持用戶一貫的使用風格,會保持頁面的整體風格相似。除開底部導航外,標題欄是使用頻率較高的另一種頁面布局。如圖所示:
在程序猿“懶惰”的催促下,總是希望能夠抽取成為公共的部分,在使用的時候就修改需要修改的地方就行。
二、第一種抽取方法
custom_common_title.xml
BaseActivity.java
/** * 功能描述:抽取公共的基礎Activity * <p> * <p> * 當前方式標題欄高度不能自由控制【有待於優化】 * 時間:2016/8/9 * 作者:vision */ public abstract class BaseActivity extends Activity { /** * 標題左邊文字欄 */ private TextView titleLeftTV; /** * 標題左邊圖像欄 */ private ImageView titleLeftIV; /** * 標題標題欄 */ private TextView titleNameTV; /** * 標題右邊文字欄 */ private TextView titleRightTV; /** * 標題右邊圖像欄 */ private ImageView titleRightIV; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); } @Override public void setContentView(int layoutResID) { View contentView = LayoutInflater.from(this).inflate(layoutResID, null); setContentView(contentView); } @Override public void setContentView(View view) { ViewGroup.LayoutParams lp = new ViewGroup.LayoutParams( ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT); setContentView(view, lp); } @Override public void setContentView(View view, ViewGroup.LayoutParams lp) { boolean hasTitle = hasTitle(); if (hasTitle) { int titleLayoutId = getCustomTitleLayoutId(); requestWindowFeature(Window.FEATURE_CUSTOM_TITLE); if (lp == null) { super.setContentView(view); } else { super.setContentView(view, lp); } Window w = getWindow(); w.setFeatureInt(Window.FEATURE_CUSTOM_TITLE, titleLayoutId); Drawable titleBg = getTitleBg(); ViewGroup titleGroup = (ViewGroup) findViewById(R.id.title_root_group); if (titleBg != null) { titleGroup.addView(titleGroup, ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT); } else { titleGroup.setBackgroundColor(Color.GREEN); } initTitle(); } else { requestWindowFeature(Window.FEATURE_NO_TITLE); if (lp == null) { super.setContentView(view); } else { super.setContentView(view, lp); } } } /** * 初始化View,分三部分: * Left、Center、Right:可以設置圖片、文字、點擊事件 */ private void initTitle() { titleLeftTV = (TextView) findViewById(R.id.title_left_tv); titleLeftIV = (ImageView) findViewById(R.id.title_left_iv); titleNameTV = (TextView) findViewById(R.id.title_name_tv); titleRightTV = (TextView) findViewById(R.id.title_right_tv); titleRightIV = (ImageView) findViewById(R.id.title_right_iv); //下面三個方法根據自己的要求實現; setTitleLeftView(titleLeftTV, titleLeftIV); setTitleNameView(titleNameTV); setTitleRightView(titleRightTV, titleRightIV); } /** * 屬性方法形成空實現,子類可重寫可不重寫 */ /** * 設置標題欄右標題屬性 * * @param titleRightTV 右標題欄文字 * @param titleRightIV 右標題欄圖像 */ public void setTitleRightView(TextView titleRightTV, ImageView titleRightIV) { } /** * 設置標題欄屬性 * * @param titleNameTV 標題欄標題信息 */ public void setTitleNameView(TextView titleNameTV) { } /** * 設置標題欄左標題屬性 * * @param titleLeftTV 左標題文字 * @param titleLeftIV 左標題圖像 */ public void setTitleLeftView(TextView titleLeftTV, ImageView titleLeftIV) { } /** * 是否顯示Title,子類可重寫 * * @return */ protected boolean hasTitle() { return true; } /** * Title布局文件; * * @return */ protected int getCustomTitleLayoutId() { return R.layout.custom_common_title; } /** * Title背景,子類可以重寫; * * @return */ protected Drawable getTitleBg() { return null; } }
三、第二種抽取方法
head_layout.xml
NewBaseActivity.java
public abstract class NewBaseActivity extends Activity { /** * 標題中部文字描述 */ private TextView titleText; /** * 標題右邊View布局 */ private LinearLayout rightLayout; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); requestWindowFeature(Window.FEATURE_NO_TITLE);//去掉標題欄 initCreateView(); initView(); initData(); initLitener(); try { View titlebarView = findViewById(R.id.title_bar_back); if (titlebarView != null) { titlebarView.setOnClickListener(new MyBackListener()); } } catch (Exception e) { e.printStackTrace(); } } private class MyBackListener implements View.OnClickListener { @Override public void onClick(View v) { mySelfDestory(); if (getLeftBtn()) { Toast.makeText(NewBaseActivity.this, "您點擊了返回!", Toast.LENGTH_SHORT).show(); } else { finish(); } } } /** * 初始化View */ protected void initView() { //添加右邊按鈕 rightLayout = (LinearLayout) findViewById(R.id.base_activity_right); if (getRightBtn() != null) { rightLayout.addView(getRightBtn()); } titleText = (TextView) findViewById(R.id.base_activity_title); if (getTopTitleText() != null) { titleText.setText(getTopTitleText()); } } /** * 獲取右邊自定義按鈕,由用戶自己定義 * * @return */ protected View getRightBtn() { return null; } /** * 獲取頂部標題 * * @return */ public abstract String getTopTitleText(); /** * 設置布局文件 */ public abstract void initCreateView(); /** * 初始化數據 */ public abstract void initData(); /** * 初始化監聽器 */ public abstract void initLitener(); /** * 銷毀自我 */ private void mySelfDestory() { } /** * 是否獲取標題左部按鈕 * * @return */ protected boolean getLeftBtn() { return false; } }
四、總結
1,展示效果如圖
2,說明:
點擊確定--點擊返回,均是第一種實現的效果。
點擊跳轉新BaseActivity是第二種實現方式。
很明顯的看出第一種實現方式是真的太糙了,第二種方式相對來講,就是夏日中一泓清泉。
兩種方式展示出來,一是為了看到做出的工作,習慣性給自己一點“甜頭”;二是給自己挖一個深坑。在前行的路上,我還有很多東西需要學習、研究。也正是一個個坑的天平逐步讓自己強壯一點點。
給大家推薦第二種,如果你看到,你用就好。要是你喜歡研究,歡迎你來填坑。
第一種方式的坑就是:返回或者確定,使用切圖展示效果很差;整個頭部布局的高度不能自由控制。
Android中的消息處理機制大量依賴於Handler。每個Handler都有對應的Looper,用於不斷地從對應的MessageQueue中取出消息處理。 一直以來,覺
兩周廢寢忘食的創作終於成功了,現在拿出來分享一下。先不說別的看一下程序運行效果圖,我沒怎麼設計ui所以界面不是很好看但是能說明問題~~~現在我們來看看實現這個功能需要些什
由於努比亞 Z5S(NX503A)對底包的要求較高,安卓4.2的升級到4.4的需要升級4.4的底包再進行刷機,反之亦然刷機精靈降級教程步驟如下 1、首先下
微信公眾號開發者中心提供了使用代碼開發微信微應用的功能,使用代碼開發微應用需要用到服務器,以存放編寫的代碼,因此我們需要一個服務器。那麼在微信那裡設置服務器呢?在微信公眾