成人午夜视频全免费观看高清-秋霞福利视频一区二区三区-国产精品久久久久电影小说-亚洲不卡区三一区三区一区

Android快速開(kāi)發(fā)之定制BaseTemplate

本篇內(nèi)容有:

創(chuàng)新互聯(lián)公司專(zhuān)業(yè)為企業(yè)提供韶山網(wǎng)站建設(shè)、韶山做網(wǎng)站、韶山網(wǎng)站設(shè)計(jì)、韶山網(wǎng)站制作等企業(yè)網(wǎng)站建設(shè)、網(wǎng)頁(yè)設(shè)計(jì)與制作、韶山企業(yè)網(wǎng)站模板建站服務(wù),10多年韶山做網(wǎng)站經(jīng)驗(yàn),不只是建網(wǎng)站,更提供有價(jià)值的思路和整體網(wǎng)絡(luò)服務(wù)。

定制BaseActivity
定制BaseFragment
定制BaseApplication

前言

初學(xué)者肯定會(huì)遇到一個(gè)日常任務(wù),那么就是findViewById,setOnClickListener(暫且把它們稱(chēng)為日常任務(wù)),而且很多人會(huì)把他們混在一起,導(dǎo)致項(xiàng)目結(jié)構(gòu)混亂,最主要的是寫(xiě)多了會(huì)煩,不覺(jué)得嗎?當(dāng)項(xiàng)目的Activity越多時(shí),每次添加控件都要重新寫(xiě)一次,想想都累

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);

定制解決的問(wèn)題:盡量寫(xiě)少的代碼,做更多事
定制的目的:理清代碼結(jié)構(gòu),讓你編程更有邏輯性
定制的內(nèi)容:一切都是根據(jù)項(xiàng)目的需求去實(shí)現(xiàn)

定制BaseActivity

我們就針對(duì)日常任務(wù)簡(jiǎn)單的定制一份我們的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();
 }

 /**
 * 通過(guò)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設(shè)置OnClick事件
 */
 public <E extends View> void setOnClick(E view){
 view.setOnClickListener(this);
 }
}

代碼其實(shí)很簡(jiǎn)單,光從代碼可能不知道這段代碼的意思,那么就從實(shí)現(xiàn)這段代碼來(lái)理解它的真正作用,下面是實(shí)現(xiàn)BaseActivity的代碼

public class SearchActivity extends BaseActivity {

 BannerController bannerController;
 ShopController shopController;

 private ImageView iv_zxing;
 private TextView tv_sure;

 @Override
 public int getLayoutId() {
 //這里用來(lái)獲取Activity的layout
 return R.layout.activity_search;
 }

 @Override
 public void initViews() {
 //這里用來(lái)初始化View
 iv_zxing = findView(R.id.iv_zxing);
 tv_sure = findView(R.id.tv_sure);
 }

 @Override
 public void initListener() {
 //這里用來(lái)初始化點(diǎn)擊事件
 setOnClick(iv_zxing);
 setOnClick(tv_sure);
 }

 @Override
 public void initData() {
 //這里用來(lái)設(shè)置數(shù)據(jù)、獲取數(shù)據(jù)、讀取網(wǎng)絡(luò)數(shù)據(jù)、這里所做的一切都可以在Controller實(shí)現(xiàn)
 bannerController = new BannerController(getActivity());
 shopController = new ShopController(getActivity());

 initShop();
 initBanner();
 }


 @Override
 public void processClick(View v) {
 //這里用來(lái)處理點(diǎn)擊事件
 switch (v.getId()) {
 case R.id.iv_zxing:

 break;
 case R.id.tv_sure:

 break;
 }
 }

 private void initShop() {

 }

 private void initBanner() {

 }
}

是不是覺(jué)得代碼結(jié)構(gòu)很清晰,而且比起之前的日常任務(wù)來(lái)說(shuō),代碼確實(shí)少了不少,各個(gè)方法都放著自己應(yīng)該做的事情,這樣能保證你在編程的時(shí)候邏輯不會(huì)出錯(cuò),讓別人讀起來(lái)也很輕松,當(dāng)然,除了常用的setOnClickListener還有setOnItemClickListener,這就需要根據(jù)項(xiàng)目需要而定制

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

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);
}

//用起來(lái)也很帥哦
@Override
public void initViews() {
 iv_zxing = F(R.id.iv_zxing);
 tv_sure = F(R.id.tv_sure);
}

@Override
public void initListener() {
 C(iv_zxing);
 C(tv_sure);
}

定制BaseFragment

介紹完了Activity,那么Fragment就很簡(jiǎn)單了,可以模仿Activity實(shí)現(xiàn),如果和上面的一模一樣那么就沒(méi)有樂(lè)趣了,這里由于個(gè)人項(xiàng)目原因,我把Fragment默認(rèn)設(shè)置成了懶加載模式,并且只加載一次數(shù)據(jù)

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 {
 //設(shè)置已經(jīng)不是可見(jiàn)的
 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) {
 //如果不是第一次加載、不是可見(jiàn)的、不是初始化View,則不加載數(shù)據(jù)
 return;
 }
 //加載數(shù)據(jù)
 initListener();
 initData();
 //設(shè)置已經(jīng)不是第一次加載
 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最大的區(qū)別

1.convertView:由于Fragment的findID需要convertView,我們只好抽取出來(lái)
2.setUserVisibleHint:這個(gè)方法當(dāng)切換Fragment時(shí)會(huì)調(diào)用,會(huì)返回當(dāng)前Fragment是否用戶(hù)可見(jiàn)

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進(jìn)行緩存,那么必須對(duì)ViewPager進(jìn)行緩存設(shè)置

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

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

Android快速開(kāi)發(fā)之定制BaseTemplate

定制BaseApplication

定制BaseApplication那就簡(jiǎn)單了,在Application中經(jīng)常用到的就是第三方的設(shè)置、數(shù)據(jù)庫(kù)的加載,具體可以根據(jù)項(xiàng)目需求進(jìn)行定制

public abstract class BaseApplication extends Application {

 public abstract void initConfigs();

 @Override
 public void onCreate() {
 super.onCreate();
 initConfigs();
 }

}

結(jié)語(yǔ)

學(xué)習(xí)完之后,建議大家將BaseTemplate用到你們的項(xiàng)目中,當(dāng)然從中也要學(xué)習(xí)抽象方法,抽取常用的方法,比如:在加載數(shù)據(jù)的時(shí)候可以抽取BaseController,在Adapter中可以抽取通用的BaseAdapter,具體還需要大家去研究。

源碼下載:BaseTemplate

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持創(chuàng)新互聯(lián)。

新聞標(biāo)題:Android快速開(kāi)發(fā)之定制BaseTemplate
瀏覽地址:http://jinyejixie.com/article18/ipgjdp.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供云服務(wù)器響應(yīng)式網(wǎng)站、微信公眾號(hào)企業(yè)網(wǎng)站制作、小程序開(kāi)發(fā)、網(wǎng)站收錄

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶(hù)投稿、用戶(hù)轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

成都網(wǎng)站建設(shè)公司
天镇县| 丰顺县| 光泽县| 资兴市| 江安县| 德保县| 民勤县| 资溪县| 壶关县| 肥城市| 始兴县| 长沙县| 南昌县| 当阳市| 项城市| 锦屏县| 龙里县| 自治县| 周至县| 荃湾区| 哈巴河县| 邢台县| 隆林| 韩城市| 云梦县| 顺平县| 阳春市| 武功县| 扬中市| 华亭县| 玉环县| 福海县| 五台县| 宁国市| 泌阳县| 巴中市| 合江县| 宜昌市| 德格县| 安阳县| 乐安县|