狀態(tài)封裝布局

狀態(tài)封裝布局

1.分析疚漆,我們加載一個(gè)頁(yè)面它的顯示樣式有三種:正在加載酣胀、加載錯(cuò)誤
、顯示內(nèi)容娶聘,那我們?cè)趺慈ヅ袛嗄匚畔猓晕覀冃枰趦?nèi)部寫(xiě)一個(gè)方法來(lái)判斷我們是應(yīng)該顯示那個(gè)頁(yè)面。

2.我們更具分析結(jié)果丸升,我們來(lái)看看我么將要去寫(xiě)的方法:

  • ProgressLayout(Context context){···}

  • ProgressLayout(Context context, @Nullable AttributeSet attrs){···}

  • ProgressLayout(Context context, @Nullable AttributeSet attrs, int defStyleAttr){···}(基本的構(gòu)造方法)

  • init(AttributeSet attrs) (在這個(gè)方法中铆农,我們拿到我們的布局)

  • onDetachedFromWindow()(該方法用于顯示錯(cuò)誤頁(yè)面是,我們點(diǎn)擊刷新頁(yè)面狡耻,重繪頁(yè)面)

  • public void showLoading(){···}暴露給外面可以使用的方法墩剖,顯示我們的加載頁(yè)面

  • public void showContent(){···}暴露給外面可以使用的方法,顯示我們的內(nèi)容頁(yè)面

  • public void showError (OnClickListener click){···}暴露給外面可以使用的方法夷狰,顯示我們的顯示錯(cuò)誤頁(yè)面岭皂,值得注意的是我們?cè)诳吹剿膮?shù)中有一個(gè)點(diǎn)擊事件,用戶在加載錯(cuò)誤時(shí)沼头,我們可以點(diǎn)擊相對(duì)應(yīng)的控件刷新我們的布局爷绘。

  • public boolean isContent(){···}該方法用于判斷我們此時(shí)頁(yè)面的狀態(tài)书劝,判斷我們的頁(yè)面是不是我們的內(nèi)容狀態(tài),如果不是我們顯示錯(cuò)誤頁(yè)土至。

  • showLoadingView(){···}這個(gè)方法就是加載方法的具體實(shí)現(xiàn)购对,用于添加我們的加載頁(yè)面,并在這個(gè)加載頁(yè)面中陶因,我們給我們的控件設(shè)置動(dòng)畫(huà)骡苞。

  • showErrorView(){···}顯示錯(cuò)誤頁(yè)面的具體實(shí)現(xiàn),在這個(gè)方法中我們把我們的錯(cuò)誤頁(yè)面布局添加進(jìn)來(lái)楷扬,同時(shí)解幽,我們也應(yīng)該把我們的錯(cuò)誤頁(yè)用戶點(diǎn)擊刷新的控件實(shí)例化出來(lái),用于提取它的點(diǎn)擊事件毅否。

  • hideLoadingView(){···}用于隱藏我們的錯(cuò)誤頁(yè)面

  • hideLoadingView(){···}用于隱藏我們的加載頁(yè)面

  • hideContentView(){···}用于隱藏我們的內(nèi)容頁(yè)

  • setContentVisibility (boolean visible){···}這個(gè)方法用于我們手動(dòng)設(shè)置我們的內(nèi)容頁(yè)不能顯示亚铁。

3.用于判斷我們的狀態(tài)我們可以使用我們的枚舉方法來(lái)寫(xiě)入我么的三種狀態(tài),具體的代碼我們來(lái)如下:

public enum State {
    LOADING,CONTENT,ERROR
}

4.具體的代碼如下:

public class ProgressLayout extends LinearLayout{

private static final String LOADING_TAG = "loading_tag";
private static final String ERROR_TAG = "error_tag";

private LayoutParams layoutParams ;
private LayoutInflater layoutInflater;
private LinearLayout loadingView , errorView;

private TextView btn_error;

private List<View> contentViews = new ArrayList<>();
private RotateAnimation rotateAnimation;

private State currentState = State.LOADING;

public enum State {
    LOADING,CONTENT,ERROR
}

public ProgressLayout(Context context) {
    super(context);
}

public ProgressLayout(Context context, @Nullable AttributeSet attrs) {
    super(context, attrs);
    init(attrs);
}

public ProgressLayout(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
    super(context, attrs, defStyleAttr);
    init(attrs);
}

private void init(AttributeSet attrs) {
    layoutInflater = (LayoutInflater) getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}

@Override
public void addView(View child, int index, ViewGroup.LayoutParams params) {
    super.addView(child, index, params);
    if(child.getTag() == null ||(!child.getTag().equals(LOADING_TAG))&&!(child.getTag().equals(ERROR_TAG))){
        contentViews.add(child);
    }
}

@Override
protected void onDetachedFromWindow() {
    super.onDetachedFromWindow();
    if(btn_error != null){
        btn_error.setOnClickListener(null);
    }
}

public void showLoading(){
    currentState = State.LOADING;
    this.showLoadingView();
    this.hideErrorView();
    this.setContentVisibility(false);
}

public void showContent(){
    currentState = State.CONTENT;
    ProgressLayout.this.setContentVisibility(true);
    ProgressLayout.this.hideErrorView();
}

public void showError (OnClickListener click){
    currentState = State.ERROR;
    this.hideLoadingView();
    this.showErrorView();
    this.btn_error.setOnClickListener(click);
    hideContentView();
}

public boolean isContent(){
    return currentState == State.CONTENT;
}

private void showLoadingView(){
    if(loadingView == null){
        loadingView = (LinearLayout) layoutInflater.inflate(R.layout.layout_loading_view,null);
        loadingView.setTag(LOADING_TAG);
        layoutParams = new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT);
        ImageView iv_loading = (ImageView) loadingView.findViewById(R.id.iv_loading);
        rotateAnimation = new RotateAnimation(0,360, Animation.RELATIVE_TO_SELF,0.5f,Animation.RELATIVE_TO_SELF,0.5f);
        rotateAnimation.setDuration(800);
        rotateAnimation.setRepeatMode(Animation.RESTART);
        rotateAnimation.setRepeatCount(Animation.INFINITE);
        rotateAnimation.start();
        LinearInterpolator lir = new LinearInterpolator();
        rotateAnimation.setInterpolator(lir);
        iv_loading.startAnimation(rotateAnimation);
        this.addView(loadingView,layoutParams);
    }else {
        rotateAnimation.start();
        loadingView.setVisibility(VISIBLE);
    }
}

private void showErrorView(){
    if(errorView == null){
        errorView = (LinearLayout) layoutInflater.inflate(R.layout.layout_error_view,null);
        errorView.setTag(ERROR_TAG);
        btn_error = (TextView) errorView.findViewById(R.id.btn_try);
        layoutParams = new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT);
        this.addView(errorView,layoutParams);
    }else {
        errorView.setVisibility(VISIBLE);
    }
}

private void hideLoadingView(){
    if(loadingView != null && loadingView.getVisibility() != GONE){
        loadingView.setVisibility(GONE);
        rotateAnimation.cancel();
    }
}

private void hideErrorView(){
    if(errorView != null && errorView.getVisibility() != GONE){
        errorView.setVisibility(GONE);
    }
}

private void hideContentView(){
    if(contentViews != null){
        for(View contentView : contentViews){
            contentView.setVisibility(GONE);
        }
    }
}

public void setContentVisibility (boolean visible){
    for(View contentView :contentViews){
        contentView.setVisibility(visible ? View.VISIBLE:View.GONE);
    }
 }

}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末螟加,一起剝皮案震驚了整個(gè)濱河市徘溢,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌捆探,老刑警劉巖然爆,帶你破解...
    沈念sama閱讀 216,544評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異黍图,居然都是意外死亡曾雕,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,430評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門(mén)助被,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)剖张,“玉大人,你說(shuō)我怎么就攤上這事揩环∩ε” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 162,764評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵丰滑,是天一觀的道長(zhǎng)顾犹。 經(jīng)常有香客問(wèn)我,道長(zhǎng)褒墨,這世上最難降的妖魔是什么炫刷? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,193評(píng)論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮郁妈,結(jié)果婚禮上浑玛,老公的妹妹穿的比我還像新娘。我一直安慰自己噩咪,他們只是感情好顾彰,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,216評(píng)論 6 388
  • 文/花漫 我一把揭開(kāi)白布失晴。 她就那樣靜靜地躺著,像睡著了一般拘央。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上书在,一...
    開(kāi)封第一講書(shū)人閱讀 51,182評(píng)論 1 299
  • 那天灰伟,我揣著相機(jī)與錄音,去河邊找鬼儒旬。 笑死栏账,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的栈源。 我是一名探鬼主播挡爵,決...
    沈念sama閱讀 40,063評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼甚垦!你這毒婦竟也來(lái)了茶鹃?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 38,917評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤艰亮,失蹤者是張志新(化名)和其女友劉穎闭翩,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體迄埃,經(jīng)...
    沈念sama閱讀 45,329評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡疗韵,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,543評(píng)論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了侄非。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片蕉汪。...
    茶點(diǎn)故事閱讀 39,722評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖逞怨,靈堂內(nèi)的尸體忽然破棺而出者疤,到底是詐尸還是另有隱情,我是刑警寧澤骇钦,帶...
    沈念sama閱讀 35,425評(píng)論 5 343
  • 正文 年R本政府宣布宛渐,位于F島的核電站,受9級(jí)特大地震影響眯搭,放射性物質(zhì)發(fā)生泄漏窥翩。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,019評(píng)論 3 326
  • 文/蒙蒙 一鳞仙、第九天 我趴在偏房一處隱蔽的房頂上張望寇蚊。 院中可真熱鬧,春花似錦棍好、人聲如沸仗岸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,671評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)扒怖。三九已至较锡,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間盗痒,已是汗流浹背蚂蕴。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,825評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留俯邓,地道東北人骡楼。 一個(gè)月前我還...
    沈念sama閱讀 47,729評(píng)論 2 368
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像稽鞭,于是被迫代替她去往敵國(guó)和親鸟整。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,614評(píng)論 2 353

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理朦蕴,服務(wù)發(fā)現(xiàn)篮条,斷路器,智...
    卡卡羅2017閱讀 134,652評(píng)論 18 139
  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,077評(píng)論 25 707
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語(yǔ)法吩抓,類相關(guān)的語(yǔ)法兑燥,內(nèi)部類的語(yǔ)法,繼承相關(guān)的語(yǔ)法琴拧,異常的語(yǔ)法降瞳,線程的語(yǔ)...
    子非魚(yú)_t_閱讀 31,623評(píng)論 18 399
  • 做選擇時(shí)候的很多糾結(jié),其實(shí)是各種復(fù)雜情緒在影響你的判斷蚓胸。旁觀者清挣饥,其實(shí)就是因?yàn)榕杂^者沒(méi)有你那么多復(fù)雜情緒,往往能做...
    給小老板讀商業(yè)書(shū)閱讀 154評(píng)論 0 1
  • (圖片來(lái)自網(wǎng)絡(luò)) 文|東水長(zhǎng)盈 丁小可對(duì)著俞秋說(shuō)道:“你手機(jī)號(hào)多少沛膳,我存下來(lái)扔枫。還有你微信,加一下我锹安《碳觯” 俞秋報(bào)了一...
    東水長(zhǎng)盈閱讀 497評(píng)論 0 2