国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統 > Android > 正文

Android快速開發之定制BaseTemplate

2019-10-23 19:44:35
字體:
來源:轉載
供稿:網友

本篇內容有:

定制BaseActivity
定制BaseFragment
定制BaseApplication

前言

初學者肯定會遇到一個日常任務,那么就是findViewById,setOnClickListener(暫且把它們稱為日常任務),而且很多人會把他們混在一起,導致項目結構混亂,最主要的是寫多了會煩,不覺得嗎?當項目的Activity越多時,每次添加控件都要重新寫一次,想想都累

tv_cz_10 = (TextView) findViewById(R.id.tv_cz_10);tv_cz_20 = (TextView) findViewById(R.id.tv_cz_20);tv_cz_30 = (TextView) findViewById(R.id.tv_cz_30);tv_cz_50 = (TextView) findViewById(R.id.tv_cz_50);tv_cz_10.setOnClickListener(this);tv_cz_20.setOnClickListener(this);tv_cz_30.setOnClickListener(this);tv_cz_50.setOnClickListener(this);

定制解決的問題:盡量寫少的代碼,做更多事
定制的目的:理清代碼結構,讓你編程更有邏輯性
定制的內容:一切都是根據項目的需求去實現

定制BaseActivity

我們就針對日常任務簡單的定制一份我們的BaseActivity

public abstract class BaseActivity extends FragmentActivity implements View.OnClickListener { private SparseArray<View> mViews; public abstract int getLayoutId(); public abstract void initViews(); public abstract void initListener(); public abstract void initData(); public abstract void processClick(View v); public void onClick(View v) { processClick(v); } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); mViews = new SparseArray<>(); setContentView(getLayoutId()); initViews(); initListener(); initData(); } /** * 通過ID找到View */ public <E extends View> E findView(int viewId) { E view = (E) mViews.get(viewId); if (view == null) { view = (E) findViewById(viewId); mViews.put(viewId, view); } return view; } /** * View設置OnClick事件 */ public <E extends View> void setOnClick(E view){ view.setOnClickListener(this); }}

代碼其實很簡單,光從代碼可能不知道這段代碼的意思,那么就從實現這段代碼來理解它的真正作用,下面是實現BaseActivity的代碼

public class SearchActivity extends BaseActivity { BannerController bannerController; ShopController shopController; private ImageView iv_zxing; private TextView tv_sure; @Override public int getLayoutId() { //這里用來獲取Activity的layout return R.layout.activity_search; } @Override public void initViews() { //這里用來初始化View iv_zxing = findView(R.id.iv_zxing); tv_sure = findView(R.id.tv_sure); } @Override public void initListener() { //這里用來初始化點擊事件 setOnClick(iv_zxing); setOnClick(tv_sure); } @Override public void initData() { //這里用來設置數據、獲取數據、讀取網絡數據、這里所做的一切都可以在Controller實現 bannerController = new BannerController(getActivity()); shopController = new ShopController(getActivity()); initShop(); initBanner(); } @Override public void processClick(View v) { //這里用來處理點擊事件 switch (v.getId()) { case R.id.iv_zxing: break; case R.id.tv_sure: break; } } private void initShop() { } private void initBanner() { }}

是不是覺得代碼結構很清晰,而且比起之前的日常任務來說,代碼確實少了不少,各個方法都放著自己應該做的事情,這樣能保證你在編程的時候邏輯不會出錯,讓別人讀起來也很輕松,當然,除了常用的setOnClickListener還有setOnItemClickListener,這就需要根據項目需要而定制

如果你是很酷很有性格的人,那么也可以嘗試下面這種用法,用一個字母作為方法,一切定制因你心情而定

public <E extends View> E F(int viewId) { E view = (E) mViews.get(viewId); if (view == null) { view = (E) findViewById(viewId); mViews.put(viewId, view); } return view;}public <E extends View> void C(E view){ view.setOnClickListener(this);}//用起來也很帥哦@Overridepublic void initViews() { iv_zxing = F(R.id.iv_zxing); tv_sure = F(R.id.tv_sure);}@Overridepublic void initListener() { C(iv_zxing); C(tv_sure);}

定制BaseFragment

介紹完了Activity,那么Fragment就很簡單了,可以模仿Activity實現,如果和上面的一模一樣那么就沒有樂趣了,這里由于個人項目原因,我把Fragment默認設置成了懶加載模式,并且只加載一次數據

public abstract class BaseFragment extends Fragment implements View.OnClickListener { private boolean isVisible = false; private boolean isInitView = false; private boolean isFirstLoad = true; public View convertView; private SparseArray<View> mViews; public abstract int getLayoutId(); public abstract void initViews(); public abstract void initListener(); public abstract void initData(); public abstract void processClick(View v); @Override public void onClick(View v) { processClick(v); } @Override public void setUserVisibleHint(boolean isVisibleToUser) { super.setUserVisibleHint(isVisibleToUser); if (isVisibleToUser) { isVisible = true; lazyLoad(); } else { //設置已經不是可見的 isVisible = false; } } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { mViews = new SparseArray<>(); convertView = inflater.inflate(getLayoutId(), container, false); initViews(); isInitView = true; lazyLoad(); return convertView; } //懶加載 private void lazyLoad() { if (!isFirstLoad || !isVisible || !isInitView) { //如果不是第一次加載、不是可見的、不是初始化View,則不加載數據 return; } //加載數據 initListener(); initData(); //設置已經不是第一次加載 isFirstLoad = false; } public <E extends View> E findView(int viewId) { if (convertView != null) { E view = (E) mViews.get(viewId); if (view == null) { view = (E) convertView.findViewById(viewId); mViews.put(viewId, view); } return view; } return null; } public <E extends View> void setOnClick(E view){ view.setOnClickListener(this); }}

這里和Activity最大的區別

1.convertView:由于Fragment的findID需要convertView,我們只好抽取出來
2.setUserVisibleHint:這個方法當切換Fragment時會調用,會返回當前Fragment是否用戶可見

public class HomeFragment extends BaseFragment { ShopController shopController; private ImageView iv_speech; private TextView tv_search; @Override public int getLayoutId() { return R.layout.fragment_home; } @Override public void initViews() {  iv_speech = findView(R.id.iv_speech); tv_search = findView(R.id.tv_search); } @Override public void initData() { shopController = new ShopController(getActivity()); initShop(); } @Override public void initListener() { setOnClick(iv_speech); setOnClick(tv_search); } @Override public void processClick(View v) { switch (v.getId()) { case R.id.iv_speech: break; case R.id.tv_search: break; } } private void initShop() { }}

這里采用的是ViewPager+Fragment,如果需要讓Fragment進行緩存,那么必須對ViewPager進行緩存設置

//設置緩存頁面viewPager.setOffscreenPageLimit(5);

下面是設置了緩存的懶加載模式的效果圖,可以看到第一次切換需要加載數據,而第二次切回去則界面不會變化,效果和手機淘寶一樣

Android,BaseTemplate

定制BaseApplication

定制BaseApplication那就簡單了,在Application中經常用到的就是第三方的設置、數據庫的加載,具體可以根據項目需求進行定制

public abstract class BaseApplication extends Application { public abstract void initConfigs(); @Override public void onCreate() { super.onCreate(); initConfigs(); }}

結語

學習完之后,建議大家將BaseTemplate用到你們的項目中,當然從中也要學習抽象方法,抽取常用的方法,比如:在加載數據的時候可以抽取BaseController,在Adapter中可以抽取通用的BaseAdapter,具體還需要大家去研究。

源碼下載:BaseTemplate

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持VEVB武林網。


注:相關教程知識閱讀請移步到Android開發頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 奉贤区| 霍林郭勒市| 冷水江市| 安义县| 昭通市| 秀山| 林周县| 民和| 卢龙县| 罗江县| 桓仁| 体育| 江达县| 云南省| 眉山市| 嘉祥县| 松潘县| 虎林市| 普洱| 黎川县| 台江县| 沭阳县| 宁明县| 南投县| 多伦县| 盱眙县| 屏南县| 武穴市| 通山县| 泰和县| 阿尔山市| 汶川县| 大同县| 如东县| 工布江达县| 林周县| 宝鸡市| 辽中县| 德兴市| 大石桥市| 铜山县|