Android 學習筆記之AndBase框架學習(一) 實現多功能標題欄


PS:Volley框架終於通過看源碼的方式完成了所有的學習..開始學習AndBase...AndBase的源碼實在是多的離譜...因此就不對所有的源碼進行分析了...

 

學習內容:

1.使用AndBase實現多功能標題欄...

 

  AndBase框架內部提供了許多的方式能夠使我們去設置一個更好的標題欄,進行動態的改變,而並非靜態的將標題欄界面寫死...能夠使得標題欄更加的美觀...總體就是動態的獲取布局然后通過對布局的操作來自定義一個良好的標題欄...

  使用AndBase框架的時候我們的主函數就不是繼承於Acticity了,而是繼承於AbActivity,萬變不離其宗還是Activity...

public class MainActivity extends AbActivity

  繼承了AbActivity這樣就使得自己的Activity擁有一個框架...我們就可以使用內部包含的一些變量...就拿我們的標題欄變量來說吧...mAbTitleBar就是內在的一個標題欄變量...凡是繼承了AbActivity的Activity就可以使用這個變量,這個變量會作為當前Activity中的標題欄變量..我們就直接可以對其進行一些相關屬性的設定..從而書寫我們自己的標題欄...

1.1 設置標題欄的有無...

  標題欄的有無設置其實就是設置當前的mAbTitleBar是否進行顯示...通過調用SetVisiable函數來進行相關的設置...

public void setVisiable(boolean b){
        if(b){
            titleBar.setVisibility(View.VISIBLE); //設置標題欄顯示在視圖上..
        }else{
            titleBar.setVisibility(View.GONE);//設置標題欄不顯示在視圖上..
        }
}

1.2 為標題欄添加新的控件...

  無論是在標題欄還是Activity中如果想要動態的添加控件,那么必然是添加View的過程...添加View之前,我們需要把控件添加到View當中,然后再把View添加在Activity上,這樣就完成了動態添加視圖的效果...View其實只是一個空的架子,更形象的來說是一個沒有打起的氣球一樣..光有外殼,沒有東西,那么如果想要有東西,那么我們需要為其進行充氣,只有充了氣之后的View才是我們想要去進行加載的...否則是沒什么用的..

  充氣的過程就是使用LayoutInflater.inflater(R.layout.XXX,root);函數來完成的...對ListView使用熟悉的那么想必也就非常清楚這個過程了...使用ListView時,我們只是對ListView中的Item進行布局的書寫,但是絕對不會在布局中寫死Item布局中的東西..因為Item中的東西一般都是進行動態添加的...所以我們一般是獲取ListView的ID,然后對每一個Item進行動態的加載...這一般是對ListView進行操作...其實都一樣...添加視圖都是進行動態添加...添加了View之后,我們仍然可以通過獲取控件然后綁定監聽,從而做更多的操作...

  這個函數是我自定義的一個函數...arg0和arg1是通過Inflater.inflate獲取到的視圖...

public void setRightview(int resid0,int resid1){
        ClearRightView();  
        titleBar.addRightView(arg0);  //為標題欄添加視圖...
        titleBar.addRightView(arg1);  
        moreview=(Button) arg0.findViewById(resid0);//通過當前視圖獲取控件...
        moreapp=(Button) arg1.findViewById(resid1);
        
        //通過獲取控件之后,設置相關監聽,從而完成更多的操作...
        moreview.setOnClickListener(new View.OnClickListener() {
            
            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                Toast.makeText(context, "點擊", Toast.LENGTH_LONG).show();
            }
        });
        
        moreapp.setOnClickListener(new View.OnClickListener() {
            
            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                Toast.makeText(context, "繼續點擊", Toast.LENGTH_LONG).show();
            }
        });

    }

  這樣就完成了視圖的添加...其實標題欄的操作基本都是這個過程...最重要的還是需要清楚其中的函數到底怎么用,如何為標題欄設置相關的屬性,比如說背景顏色,標題欄的文本,標題欄的Logo以及一些相關屬性的設置,其實說白了就是把xml那種布局方式通過Java代碼來更加靈活的進行運用...可以使得布局上的控件更加的靈活...

1.3 操作欄變換...

  我們通過一個函數來看一看mAbTitleBar到底有哪些函數可以動態設置View視圖...這里是為了介紹一些相關的函數的應用...並沒有完整的代碼過程...源代碼過程我會最后進行給出..

btn5.setOnClickListener(new View.OnClickListener() {
                        
            @Override
            public void onClick(View v) {//以下函數的調用時不存在函數順序的問題的...不同的調用順序顯示的結果是一樣的,,,
            mAbTitleBar.setLogo(R.drawable.button_selector_delete); //為標題欄設置logo..
                mAbTitleBar.setLogo2(R.drawable.button_selector_app); //為標題欄設置第二個Logo..這個setLogo只有這兩個函數..沒有Logo3...如果想設置更多的Logo..只能去寫xml布局...
                mAbTitleBar.clearRightView(); //清除標題欄右邊的視圖..
                View rightViewOk = mInflater.inflate(R.layout.ok_btn, null); //為一個View視圖充氣...
                mAbTitleBar.addRightView(rightViewOk); //在標題欄右邊添加當前充氣后的視圖..
                mAbTitleBar.setTitleText("正在修改"); //設置標題欄的文字屬性..
                mAbTitleBar.setTitleBarBackground(R.drawable.top_bg2);//設置文字的背景..
                mAbTitleBar.setTitleBarGravity(Gravity.LEFT,Gravity.CENTER);//設置標題欄的對其方式...
                mAbTitleBar.setLogoOnClickListener(new OnClickListener() {
                    //為Logo圖片設置監聽...
                    @Override
                    public void onClick(View v) {
                    //改變相關的屬性...    mAbTitleBar.setTitleBarBackground(R.drawable.top_bg);
                        mAbTitleBar.setTitleText("多功能標題欄");
                        mAbTitleBar.clearRightView();
                        mAbTitleBar.setLogo(R.drawable.button_selector_back);
                        mAbTitleBar.setTitleBarGravity(Gravity.LEFT,Gravity.RIGHT);
                        mAbTitleBar.setTitleTextMargin(20, 0, 0, 0);
                        mAbTitleBar.getLogoView2().setVisibility(View.GONE); //設置可見性...
                        mAbTitleBar.setLogoOnClickListener(new OnClickListener() {
                            
                            @Override
                            public void onClick(View v) {
                                finish();
                            }
                        });
                    }
                });
            }
        });    

1.4 標題欄的下拉效果...

  標題欄的下拉其實就是點擊標題形成下拉菜單..每個下拉菜單都是一個子選項...通過這些子選項我們可以做更多的事情...效果如上...其實每一個這樣類似的菜單都是一個ListView..通過對ListView的每一個Item進行初始化,那么也就自然而然的形成這樣的效果了...其實總體還是進行動態布局...

 

btn7.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                 mAbTitleBar.setTitleTextBackgroundResource(R.drawable.drop_down_title_btn);
                 View popView = mInflater.inflate(R.layout.list_pop, null); //先獲取一個視圖..
                 ListView popListView = (ListView) popView.findViewById(R.id.pop_list);  //獲取ListView的ID..
                 List<AbMenuItem> list = new ArrayList<AbMenuItem>();  //定義一個列表項...這個類只保存ID和Text屬性..
                 list.add(new AbMenuItem("蔡文姬"));   
                 list.add(new AbMenuItem("貂蟬"));
                 list.add(new AbMenuItem("紫罌粟"));
                 list.add(new AbMenuItem("孫尚香"));
                 ListPopAdapter mListPopAdapter = new ListPopAdapter(TitleBarActivity.this, list,R.layout.list_pop_item); //定義一個適配器...
                 popListView.setAdapter(mListPopAdapter); //為ListView設置一個適配器...
                 
                 mAbTitleBar.setTitleTextDropDown(popView); //設置TitleBar上的TextView被點擊的監聽..
            }
        });

  通過這樣的設置,很容易形成這樣的效果..這里使用了AbMenuItem類...通過源碼我們可以知道這個類有兩個構造函數,一個是對int ID 和String Text兩個屬性進行保存,一個則是僅僅保存一個String Text屬性...這樣也就使得ListView顯示的東西比較的簡單...並且一般這種小型的ListView一般也就一個Text值..因此使用AbMenuItem還是比較方便的...這樣也就完成了一個下拉菜單...

1.5 適配器...

  再簡單的說一下適配器這個東西吧...適配器主要還是用於為ListView中的每一個Item進行動態的設置,使得ListView的布局能夠更加的靈活...說白了就是定義了一種樣式,ListView中的每一個Item都需要按照這個樣式來進行顯示...非常的簡單...

/*
 * 
 *  CopyRight@ By Darker 2015-10-30
 *  多功能菜單...
 * 
 * */

package com.example.andbasetitlebar;


import java.util.List;

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.TextView;

import com.ab.global.AbMenuItem;


public class Adapter extends BaseAdapter {  //繼承BaseAdapter

    private Context context; 

    private List<AbMenuItem> list; 

    private int itemResource;
    
    public Adapter(Context context, List<AbMenuItem> list,int itemResource) {
        this.context = context;
        this.list = list;
        this.itemResource = itemResource;
    }

    @Override
    public int getCount() {
        return list.size();
    }

    @Override
    public Object getItem(int position) {

        return list.get(position);
    }

    @Override
    public long getItemId(int position) {
        return position;
    }
        //由於我們的ListView中的Item顯示的方式都非常的簡單,因此ViewHolder類中也就僅僅定義了一個TextView屬性...
    @Override
    public View getView(int position, View convertView, ViewGroup viewGroup) {

        ViewHolder holder;
                /*這個判斷其實是為了復用而定義的...因為ListView都是動態進行加載的..             *如果ListView中的Item超過了屏幕的大小,那么勢必就需要進行下拉...            *下拉就代表原來的那些ListView就需要被銷毀...
                  * 那么總不能每一次滑動我們都新建立一個ViewHolder對象..我們可以把這些被銷毀的ViewHolder進行復用...
                  * 有了復用之后,再次滑動的時候ViewHolder會自動調用那些被銷毀掉的進行復用...從而使得資源得到重新加載...
                  * 說白了就是提高了復用性...
                  */ 
        if (convertView == null) {
            convertView = LayoutInflater.from(context).inflate(itemResource, null); //定義一個視圖對象View...
            holder = new ViewHolder();
            holder.itemText = (TextView) convertView.findViewById(R.id.pop_item); //在當前的View中獲取ListView的ID..
            convertView.setTag(holder);//設置標志..
        } else {
            holder = (ViewHolder) convertView.getTag();//這里可以直接獲取標志,對holder進行復用,減少了內存的分配和開銷...
        }
        AbMenuItem item = list.get(position);
        holder.itemText.setText(item.getText()); //為每一個Item中的TextView設置值...
        
        return convertView;
    }

    static class ViewHolder {
        TextView itemText;
    }

}
    

 

  實現多功能菜單其實非常的簡單,大部分的函數都是寫好的函數,我們只需要調用就可以設置標題欄的相關樣式...實現多功能的菜單...最后附加上我自己書寫的代碼..還是完整的代碼能夠使我們進步的更加迅速...從而可以理解其中的調用過程和原理...

  源代碼下載地址:http://files.cnblogs.com/files/RGogoing/AndbaseTitleBar.zip

 

 

 

 

 

 

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM