本篇內(nèi)容有:
創(chuàng)新互聯(lián)公司專業(yè)為企業(yè)提供韶山網(wǎng)站建設(shè)、韶山做網(wǎng)站、韶山網(wǎng)站設(shè)計、韶山網(wǎng)站制作等企業(yè)網(wǎng)站建設(shè)、網(wǎng)頁設(shè)計與制作、韶山企業(yè)網(wǎng)站模板建站服務(wù),10多年韶山做網(wǎng)站經(jīng)驗,不只是建網(wǎng)站,更提供有價值的思路和整體網(wǎng)絡(luò)服務(wù)。
定制BaseActivity
定制BaseFragment
定制BaseApplication
前言
初學(xué)者肯定會遇到一個日常任務(wù),那么就是findViewById,setOnClickListener(暫且把它們稱為日常任務(wù)),而且很多人會把他們混在一起,導(dǎo)致項目結(jié)構(gòu)混亂,最主要的是寫多了會煩,不覺得嗎?當(dāng)項目的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);
定制解決的問題:盡量寫少的代碼,做更多事
定制的目的:理清代碼結(jié)構(gòu),讓你編程更有邏輯性
定制的內(nèi)容:一切都是根據(jù)項目的需求去實現(xiàn)
定制BaseActivity
我們就針對日常任務(wù)簡單的定制一份我們的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設(shè)置OnClick事件
*/
public <E extends View> void setOnClick(E view){
view.setOnClickListener(this);
}
}
代碼其實很簡單,光從代碼可能不知道這段代碼的意思,那么就從實現(xiàn)這段代碼來理解它的真正作用,下面是實現(xiàn)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() {
//這里用來設(shè)置數(shù)據(jù)、獲取數(shù)據(jù)、讀取網(wǎng)絡(luò)數(shù)據(jù)、這里所做的一切都可以在Controller實現(xiàn)
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() {
}
}
是不是覺得代碼結(jié)構(gòu)很清晰,而且比起之前的日常任務(wù)來說,代碼確實少了不少,各個方法都放著自己應(yīng)該做的事情,這樣能保證你在編程的時候邏輯不會出錯,讓別人讀起來也很輕松,當(dāng)然,除了常用的setOnClickListener還有setOnItemClickListener,這就需要根據(jù)項目需要而定制
如果你是很酷很有性格的人,那么也可以嘗試下面這種用法,用一個字母作為方法,一切定制因你心情而定
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);
}
//用起來也很帥哦
@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就很簡單了,可以模仿Activity實現(xiàn),如果和上面的一模一樣那么就沒有樂趣了,這里由于個人項目原因,我把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)不是可見的
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,則不加載數(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,我們只好抽取出來
2.setUserVisibleHint:這個方法當(dāng)切換Fragment時會調(diào)用,會返回當(dāng)前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進(jìn)行緩存,那么必須對ViewPager進(jìn)行緩存設(shè)置
//設(shè)置緩存頁面 viewPager.setOffscreenPageLimit(5);
下面是設(shè)置了緩存的懶加載模式的效果圖,可以看到第一次切換需要加載數(shù)據(jù),而第二次切回去則界面不會變化,效果和手機(jī)淘寶一樣

定制BaseApplication
定制BaseApplication那就簡單了,在Application中經(jīng)常用到的就是第三方的設(shè)置、數(shù)據(jù)庫的加載,具體可以根據(jù)項目需求進(jìn)行定制
public abstract class BaseApplication extends Application {
public abstract void initConfigs();
@Override
public void onCreate() {
super.onCreate();
initConfigs();
}
}
結(jié)語
學(xué)習(xí)完之后,建議大家將BaseTemplate用到你們的項目中,當(dāng)然從中也要學(xué)習(xí)抽象方法,抽取常用的方法,比如:在加載數(shù)據(jù)的時候可以抽取BaseController,在Adapter中可以抽取通用的BaseAdapter,具體還需要大家去研究。
源碼下載:BaseTemplate
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持創(chuàng)新互聯(lián)。
新聞標(biāo)題:Android快速開發(fā)之定制BaseTemplate
瀏覽地址:http://chinadenli.net/article18/ipgjdp.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供云服務(wù)器、響應(yīng)式網(wǎng)站、微信公眾號、企業(yè)網(wǎng)站制作、小程序開發(fā)、網(wǎng)站收錄
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)