Android AndBase框架內(nèi)部封裝實(shí)現(xiàn)進(jìn)度框、Toast框、彈出框、確認(rèn)框(二)
本文是針對AndBase框架學(xué)習(xí)整理的第二篇筆記,想要了解AndBase框架的朋友可以閱讀本文,大家共同學(xué)習(xí)。
使用AbActivity內(nèi)部封裝的方法實(shí)現(xiàn)進(jìn)度框,Toast框,彈出框,確認(rèn)框
AndBase中AbActivity封裝好了許多方法提供我們?nèi)ナ褂?,使得在使用的時(shí)候更加的方便,只需要傳遞相關(guān)參數(shù)即可..省去了我們自己使用基礎(chǔ)的函數(shù)進(jìn)行構(gòu)造...
就好比進(jìn)度框,Toast框,彈出框,確認(rèn)框...這些基本的東西都在AndBase的AbActivity封裝好了...我們只需要傳遞參數(shù)調(diào)用其中內(nèi)部的方法就可以完成這些視圖的創(chuàng)建...無論是進(jìn)度條的調(diào)用,還是Toast框,還是彈出框,確認(rèn)框(確認(rèn)框和彈出框基本相似),只是確認(rèn)框比彈出框多了一些相關(guān)控件而已,彈出框一般用于直接彈出一段文本信息,而去確認(rèn)框則還需要添加相關(guān)的按鈕...總之調(diào)用的方式也就非常的簡單...
/* * * 多功能菜單... * * */ package com.example.andbaseanotheractivity; import com.ab.activity.AbActivity; import com.ab.global.AbConstant; import android.content.DialogInterface; import android.content.DialogInterface.OnClickListener; import android.os.Bundle; import android.view.Menu; import android.view.View; import android.widget.Button; public class MainActivity extends AbActivity implements View.OnClickListener { private Button but[]=new Button[6]; private View view; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setAbContentView(R.layout.activity_main); InitFindID(); } public void InitFindID(){ for(int i=0;i<but.length;i++){ String resID="but_"+i; but[i]=(Button) findViewById(this.getResources().getIdentifier(resID, "id", "com.example.andbaseanotheractivity")); //尋找ID的一種比較好的方式..這種方式的使用前提是ID的定義一定要有一定的規(guī)則... but[i].setOnClickListener(this); } } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.main, menu); return true; } @Override public void onClick(View v) { // TODO Auto-generated method stub view=mInflater.inflate(R.layout.demo_text, null); switch(v.getId()){ case R.id.but_0: showProgressDialog(); //直接彈出圓形進(jìn)度框... break; case R.id.but_1: showToast("Toast文本框"); //Toast文本框... break; case R.id.but_2: showDialog(AbConstant.DIALOGTOP, view); //彈出框..傳遞參數(shù)為顯示的位置以及顯示的視圖...這里表示在最上方彈出... break; case R.id.but_3: showDialog(AbConstant.DIALOGCENTER, view); // break; case R.id.but_4: showDialog(AbConstant.DIALOGBOTTOM, view); break; case R.id.but_5: //可以看到確認(rèn)框也是調(diào)用showDialog方法..只是傳遞的參數(shù)不相同..AbActivity也針對這幾種不同的彈出框定義了不同的方法... showDialog("標(biāo)題", "描述", new OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { // TODO Auto-generated method stub showToast("點(diǎn)擊確認(rèn)"); } }); break; } } }
這里我們可以看到,只需要調(diào)用相關(guān)的方法,傳遞相關(guān)的參數(shù)就能夠完成這些基本View的創(chuàng)建..從而使得我們的操作更加的方便...
以前的Toast信息彈出框調(diào)用的方式:
Toast.makeText(getApplicationContext(),"需要想要顯示的信息",Toast.LENGTH).show();
現(xiàn)在的方式就是這樣:
showToast("需要顯示的信息");
這樣直接就可以完成Toast信息框的顯示..對于這樣的簡單方式的封裝,可能我們不以為然..但是如果是更多的代碼量呢?就拿我們的確認(rèn)彈出框來說吧...如果是在以往的Activity中書寫一個(gè)確認(rèn)彈出框,我們需要手動(dòng)去進(jìn)行重寫...下面就是基于Activity來手寫的一個(gè)確認(rèn)框...
AlertDialog.Builder builder=new Builder(MainActivity.this); builder.setTitle("提示"); builder.setMessage("確認(rèn)退出"); builder.setPositiveButton("確認(rèn)", new OnClickListener() { //添加確認(rèn)按鈕... @Override public void onClick(DialogInterface dialog, int which) { // TODO Auto-generated method stub dialog.dismiss(); /提示框消失.. } }); builder.setNegativeButton("取消", new OnClickListener() { //添加取消按鈕.. @Override public void onClick(DialogInterface dialog, int which) { // TODO Auto-generated method stub dialog.dismiss(); } });
使用AndBase框架通過調(diào)用函數(shù)的方式,這樣就使得這個(gè)過程就非常的簡單..我們只需要傳遞相關(guān)的參數(shù)調(diào)用方法就可以了...這個(gè)函數(shù)的調(diào)用和上面的書寫方式所帶來的效果是相同的,并且這里我們不需要再設(shè)置dialog.dismiss();只要點(diǎn)擊了按鈕,那么彈出框就會(huì)消失...這里的OnClick方法是后續(xù)彈出框消失后需要執(zhí)行的操作...相比而言,使用框架還是簡化了代碼量
showDialog("提示", "確認(rèn)退出", new OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { // TODO Auto-generated method stub showToast("點(diǎn)擊確認(rèn)"); } });
其實(shí)這些簡單的View還是非常的簡單的...雖然看起來代碼量減少的并不是非常的多,但是如果對于更加復(fù)雜的操作...框架中優(yōu)化好的方法還是非常的好用的...即減少了代碼的冗余度,而且還實(shí)現(xiàn)了更多的功能...
還是看一下源碼的實(shí)現(xiàn)過程吧...
Toast框的源碼實(shí)現(xiàn)過程...我們可以看到,框架中的方法把原生態(tài)的方法進(jìn)行了封裝,我們只需要傳遞相關(guān)參數(shù)就可以直接使用Toast框...其實(shí)源碼內(nèi)部還有showToastInThread()的源碼..通過開啟一個(gè)新的線程
/** * 描述:Toast提示文本. * @param text 文本 */ public void showToast(String text) { Toast.makeText(this,""+text, Toast.LENGTH_SHORT).show(); //這里已經(jīng)把這個(gè)方法封裝好了...我們只需要傳遞需要顯示的文本就行了... } /** * 描述:Toast提示文本. * @param resId 文本的資源ID */ public void showToast(int resId) { Toast.makeText(this,""+this.getResources().getText(resId), Toast.LENGTH_SHORT).show(); //這種方法則是通過resID來設(shè)置需要顯示的文本... }
進(jìn)度框的源碼實(shí)現(xiàn)過程...源碼非常的簡單...我們在使用一個(gè)進(jìn)度條的時(shí)候只需要調(diào)用這兩種方法就可以了...
/** * 描述:顯示進(jìn)度框. */ public void showProgressDialog() { showProgressDialog(null); //沒有顯示進(jìn)度的進(jìn)度框.. } /** * 描述:顯示進(jìn)度框. * @param message the message */ public void showProgressDialog(String message) { // 創(chuàng)建一個(gè)顯示進(jìn)度的Dialog if(!AbStrUtil.isEmpty(message)){ mProgressMessage = message; //設(shè)置進(jìn)度框顯示的信息... } if (mProgressDialog == null) { mProgressDialog = new ProgressDialog(this); // 設(shè)置點(diǎn)擊屏幕Dialog不消失 mProgressDialog.setCanceledOnTouchOutside(false); } mProgressDialog.setMessage(mProgressMessage);//設(shè)置進(jìn)度框顯示的消息.. showDialog(AbConstant.DIALOGPROGRESS); }
彈出框的源碼我就不進(jìn)行粘貼了,由于源碼寫的確實(shí)有點(diǎn)多...這里就只粘貼一下封裝的方法...
這個(gè)方法顯示的對話框是一個(gè)信息彈出框,沒有按鈕,只是進(jìn)行信息的提示...id的作用設(shè)置彈出框顯示的位置...View表示需要顯示的視圖...這樣就創(chuàng)建了一個(gè)彈出框在指定的位置進(jìn)行顯示...
public void showDialog(int id,View view) {}
上面方法的執(zhí)行過程中,會(huì)調(diào)用setDialogLayoutParams()函數(shù)去設(shè)置相關(guān)屬性,設(shè)置彈出框布局的參數(shù),也就是彈出框如何在屏幕上更好的顯示的一個(gè)設(shè)置...
這是源碼的調(diào)用過程,看起來并不是很難理解...
private void setDialogLayoutParams(Dialog dialog,int dialogPadding,int gravity){ dialog.requestWindowFeature(Window.FEATURE_NO_TITLE); //設(shè)置沒有標(biāo)題.. Window window = dialog.getWindow(); //獲取窗口... WindowManager.LayoutParams lp = window.getAttributes();//獲取窗口屬性... //此處可以設(shè)置dialog顯示的位置 window.setGravity(gravity); //設(shè)置窗口的對其方式... //設(shè)置寬度 lp.width = diaplayWidth-dialogPadding; lp.type = WindowManager.LayoutParams.TYPE_APPLICATION_ATTACHED_DIALOG; //背景透明 //lp.screenBrightness = 0.2f; lp.alpha = 0.8f; lp.dimAmount = 0f; window.setAttributes(lp); // 添加動(dòng)畫 window.setWindowAnimations(android.R.style.Animation_Dialog); // 設(shè)置點(diǎn)擊屏幕Dialog不消失 dialog.setCanceledOnTouchOutside(false); }
這個(gè)方法的彈出框是一個(gè)帶有按鈕的確認(rèn)框,title和msg表示對話框的標(biāo)題內(nèi)容和提示內(nèi)容...以及點(diǎn)擊確認(rèn)按鈕時(shí)發(fā)生的監(jiān)聽事件的傳遞...
public void showDialog(String title,String msg,DialogInterface.OnClickListener mOkOnClickListener) {}
這個(gè)方法的彈出框和上面的唯一區(qū)別就是,彈出框的內(nèi)容不是指定的字符串,而是一個(gè)我們自定義的一個(gè)視圖..
public AlertDialog showDialog(String title,View view,DialogInterface.OnClickListener mOkOnClickListener) {}
彈出框基本都是這些模式...源碼的實(shí)現(xiàn)非常的簡單...原理都是對那些基本函數(shù)的一些封裝...剩下的幾個(gè)就不粘貼了..萬變不離其宗。
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助。
相關(guān)文章
Android 限制edittext 整數(shù)和小數(shù)位數(shù) 過濾器(詳解)
下面小編就為大家?guī)硪黄狝ndroid 限制edittext 整數(shù)和小數(shù)位數(shù) 過濾器(詳解)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-04-04Android實(shí)現(xiàn)從緩存中讀取圖片與異步加載功能類
這篇文章主要介紹了Android實(shí)現(xiàn)從緩存中讀取圖片與異步加載功能類,涉及Android針對緩存的操作及圖片異步加載相關(guān)實(shí)現(xiàn)技巧,需要的朋友可以參考下2016-08-08Android編程實(shí)現(xiàn)PendingIntent控制多個(gè)鬧鐘的方法
這篇文章主要介紹了Android編程實(shí)現(xiàn)PendingIntent控制多個(gè)鬧鐘的方法,涉及PendingIntent屬性設(shè)置與使用的相關(guān)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-12-12使用ViewPager實(shí)現(xiàn)左右循環(huán)滑動(dòng)及滑動(dòng)跳轉(zhuǎn)
今天實(shí)現(xiàn)了左右滑動(dòng),至于在最后一頁滑動(dòng)跳轉(zhuǎn),這個(gè)也做了但是效果不是太好,也希望有實(shí)現(xiàn)的朋友能夠分享下2013-01-01下載、編譯、運(yùn)行android 7.1系統(tǒng)詳解(ubuntu 16.0.4)
Android 7的系統(tǒng)版本新增的很多的新功能,本篇文章主要介紹了基于ubuntu 16.0.4環(huán)境的下載、編譯、運(yùn)行android 7.1系統(tǒng),有興趣的可以了解一下。2017-01-01Flutter時(shí)間軸Timeline的實(shí)現(xiàn)
時(shí)間軸在很多地方都可以用的到,本文介紹了Flutter時(shí)間軸Timeline的實(shí)現(xiàn),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-05-05