Android活動條(actionbar)使用詳解(二)

來源:互聯網
上載者:User

標籤:android   應用   

  1.使用ActionBar實現Tab導航    使用ActionBar實現Tab導航的思路是:AcitonBar通常與Fragment結合使用實現Tab導航。ActionBar在頂端產生多個Tab標籤,當使用者點擊某個Tab標籤時,系統根據使用者點擊事件導航指定Tab頁面。實現步驟如下:(1)調用ActionBar的setNavigationMode(ActionBar.NAVIGATION_MODE_TABS)方法設定使用Tab導航方式;(2)調用ActionBar的addTab()方法添加多個Tab標籤,並為每個Tab標籤添加事件監聽器. 源碼實戰: (1)src/mFragment.java功能:實現一個Fragment子類。可以通過getArguments()方法來擷取建立該Fragment時傳入的參數Bundle,然後,使用Bundle對象的getXXX(鍵)獲得Activity傳入該Fragment的資料,並顯示到Fragment的自訂布局的相應組件即可。 
package com.example.actionbar;import android.app.Fragment;import android.os.Bundle;import android.view.Gravity;import android.view.LayoutInflater;import android.view.View;import android.view.ViewGroup;import android.widget.TextView;/** *項目名稱/版本號碼:Actionbar/v1.0 *包   名:com.example.actionbar *類描述:實現一個簡單的Fragment,即只顯示一個TextView組件 *建立人:jiangdongguo *建立時間:2015-6-12 下午9:42:35 * 部落格地址:http://blog.csdn.net/u012637501 */public class mFragment extends Fragment {public static final String ARG_TEXT_DATA="text_data"; //Bundle所需的索引值/** * 該方法的傳回值就是該Fragment顯示的View組件 * */public View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) {TextView textView = new TextView(getActivity());textView.setGravity(Gravity.START);textView.setScrollContainer(true);//a.擷取建立該Fragment時傳入的參數BundleBundle bundle = getArguments();//b.將傳入的資料顯示到textView.setText(bundle.getString(ARG_TEXT_DATA));//c.返回該viewreturn textView;}}
(2)src/MainActivity.java功能:由於本應用只是用於使用ActionBar與Fragment實現Tab導航,所以該Activity的關鍵代碼主要在於a)設定ActionBar的導航方式---Tab導航,然後依次添加多個Tab頁並為每個Tab標籤添加事件監聽器;b)實現Tab標籤事件監聽器onTabSelected()方法,並在該方法中根據使用者選中的Tab標籤替換新的Fragment,替換方法如下:    >建立一個繼承於Fragment的自訂子類對象;    >建立一個Bundle對象,並將需要傳入到Fragment子類的資料打包到Bundle對象中;    >調用Fragment對象的setArguments(bundle)方法向fragment傳送資料;    >擷取FragmentTransaction對象,並調用其replace(int containerViewId, Fragment fragment) 方法使fragment代替該Activity的容器(這裡使用的是LinearLayout)組件,最後,提交事物。            fragment.setArguments(bundle);
            FragmentTransaction fragmentTransaction = getFragmentManager().beginTransaction();
            fragmentTransaction.replace(R.id.mContainer, fragment);
            fragmentTransaction.commit();
package com.example.actionbar;import java.io.File;import java.io.FileInputStream;import java.io.IOException;import java.io.InputStream;import org.textmining.text.extraction.WordExtractor;import android.app.ActionBar;import android.app.ActionBar.Tab;import android.app.Activity;import android.app.Fragment;import android.app.FragmentTransaction;import android.content.res.AssetManager;import android.os.Bundle;import android.os.Environment;/** *項目名稱/版本號碼:Actionbar/v1.0 *包   名:com.example.actionbar *類描述: *建立人:jiangdongguo *建立時間:2015-6-12 下午9:29:17 * 部落格地址:http://blog.csdn.net/u012637501 */public class MainActivity extends Activity implements ActionBar.TabListener {private static final String SELECTION_ITEM = "select_item";//private AssetManager assetManager = null;@Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);      //a.如果程式正確啟用了活動條,將會返回一個ActionBar對象,否則返回null        ActionBar actionBar = getActionBar();       //b.設定ActionBar的導航方式,即Tab導航        actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);        //c.依次添加三個Tab頁,並為三個Tab標籤添加事件監聽器        actionBar.addTab(actionBar.newTab().setText("林俊傑").setTabListener(this));        actionBar.addTab(actionBar.newTab().setText("中國").setTabListener(this));        actionBar.addTab(actionBar.newTab().setText("趙文卓").setTabListener( this));    }@Overrideprotected void onRestoreInstanceState(Bundle savedInstanceState) {if(savedInstanceState.containsKey(SELECTION_ITEM)){//選中前面儲存的索引對應的Fragment頁getActionBar().setSelectedNavigationItem(savedInstanceState.getInt(SELECTION_ITEM));}}@Overrideprotected void onSaveInstanceState(Bundle outState) {//將當前選中的Fragment也的索引儲存到Bundle中outState.putInt(SELECTION_ITEM, getActionBar().getSelectedNavigationIndex());}/**  *方法名(重載):onTabSelected *功能描述:當指定Tab被選中時激發該方法.在該方法中根據使用者選中的Tab標籤替換新的Fragment *  Date       :2015-6-12[J] */@Overridepublic void onTabSelected(ActionBar.Tab tab, FragmentTransaction ft) {AssetManager assetManager = getResources().getAssets(); //擷取assets資來源物件InputStream inputStream = null;WordExtractor extractor = null;//a.建立一個新的Fragment對象Fragment fragment = new mFragment();//b.建立一個Bundle對象,用於向Fragment傳入參數(資料)Bundle bundle = new Bundle();try {if(tab.getPosition()==0){inputStream = assetManager.open("linjunjie.txt");//獲得資產檔案對應的輸入資料流}else if(tab.getPosition()==1){inputStream = assetManager.open("china.txt");//獲得資產檔案對應的輸入資料流}int length = inputStream.available();//得到輸入資料流所包含的位元組總數byte[] buffer = new byte[length]; //建立一個緩衝位元組數組inputStream.read(buffer);  //將輸入資料流資料讀入到位元組數組中bundle.putString(mFragment.ARG_TEXT_DATA, new String(buffer, "GB2312"));//將位元組數組資料轉換為字串,儲存到Bundle對象中inputStream.close();} catch (IOException e) {e.printStackTrace();} catch (Exception e) {e.printStackTrace();}//c.向fragment傳入資料fragment.setArguments(bundle);//d.擷取FragmentTransaction對象FragmentTransaction fragmentTransaction = getFragmentManager().beginTransaction();//c.使用fragment代替該Activity中的containner組件fragmentTransaction.replace(R.id.mContainer, fragment);//d.提交事物fragmentTransaction.commit();}@Overridepublic void onTabUnselected(Tab tab, FragmentTransaction ft) {}@Overridepublic void onTabReselected(Tab tab, FragmentTransaction ft) {}}
(3)res/layout/main,xml功能:Activity的介面布局只定義一個簡單的容器(如LinearLayout),方便Activity使用該容器盛裝Fragment.
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:id="@+id/mContainer"    android:layout_width="match_parent"    android:layout_height="match_parent"     android:orientation="vertical"/>
(4)效果示範
(5)Fragment技術    Fragment相當於Activity的片段,可以使用單獨的Activity組合多個Fragment(即一個Activity包含多個介面),也可讓多個Activity複用一個Fragment。Fragment相當於Activity的模組化地區,主要特性如下:    a)Fragment有自己的生命週期,其可以接收、處理屬於它自身的事件,並允許Activity運行期間動態地添加或刪除Fragment。    b)Fragment允許定義自己的布局,也可以通過生命週期回調方法定義自己的行為,類似於Activity;    c)開發人員自訂的Fragment需要繼承Fragment,並重寫它的生命週期方法,通常會重寫Fragment的onCreateView()返回Freagment視圖。
 2.使用ActionBar實現下拉式導航

    ActionBar除了提供Tab導航支援之外,還提供了下拉式(DropDown)導航方式。下拉式導航的ActionBar特點是:在介面頂端產生一個下拉式清單方塊,當使用者單擊某個清單項目時,系統根據使用者單擊事件導航指定的Fragment。實現步驟如下:◆調用ActionBar的actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_LIST)方法設定使用下拉式清單的導航方式;◆調用ActionBar的setListNavigationCallBacks(SpinnerAdapter adapter,ActionBar.OnNavigationListener callback)()添加多個清單項目,並為每個清單項目設定事件監聽器。其中第一個參數Adapter負責提供多個清單項目,第二個參數為事件監聽器。
package com.example.actionbar;import java.io.File;import java.io.FileInputStream;import java.io.IOException;import java.io.InputStream;import org.textmining.text.extraction.WordExtractor;import android.app.ActionBar;import android.app.ActionBar.OnNavigationListener;import android.app.ActionBar.Tab;import android.app.Activity;import android.app.Fragment;import android.app.FragmentTransaction;import android.content.res.AssetManager;import android.os.Bundle;import android.os.Environment;import android.widget.ArrayAdapter;/** *項目名稱/版本號碼:Actionbar/v1.0 *包   名:com.example.actionbar *類描述: *建立人:jiangdongguo *建立時間:2015-6-12 下午9:29:17 * 部落格地址:http://blog.csdn.net/u012637501 */public class MainActivity extends Activity implements ActionBar.TabListener, OnNavigationListener { private static final String SELECTION_ITEM = "select_item";//private AssetManager assetManager = null;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);      //a.如果程式正確啟用了活動條,將會返回一個ActionBar對象,否則返回null        ActionBar actionBar = getActionBar();           //設定ActionBar是否顯示標題        actionBar.setDisplayShowTitleEnabled(true);        //設定導航模式,使用List導航        actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_LIST);        //為actionBar添加ArrayAdapter  actionBar.setListNavigationCallbacks(new ArrayAdapter<String>(    MainActivity.this, android.R.layout.simple_list_item_1,    android.R.id.text1, new String[] { "林俊傑", "中國", "趙文卓" }), this);    } @Override protected void onRestoreInstanceState(Bundle savedInstanceState) {  if(savedInstanceState.containsKey(SELECTION_ITEM)){   //選中前面儲存的索引對應的Fragment頁   getActionBar().setSelectedNavigationItem(savedInstanceState.getInt(SELECTION_ITEM));  } } @Override protected void onSaveInstanceState(Bundle outState) {  //將當前選中的Fragment也的索引儲存到Bundle中  outState.putInt(SELECTION_ITEM, getActionBar().getSelectedNavigationIndex()); } /**   *方法名(重載):onNavigationItemSelected  *功能描述:當指定Item被選中時激發該方法.在該方法中根據使用者選中的Tab標籤替換新的Fragment  *  Date       :2015-6-13[J]  */ @Override public boolean onNavigationItemSelected(int itemPosition, long itemId) {  AssetManager assetManager = getResources().getAssets(); //擷取assets資來源物件  InputStream inputStream = null;  WordExtractor extractor = null;  //a.建立一個新的Fragment對象  Fragment fragment = new mFragment();  //b.建立一個Bundle對象,用於向Fragment傳入參數(資料)  Bundle bundle = new Bundle();  try {    if(itemPosition==0){        inputStream = assetManager.open("linjunjie.txt");//獲得資產檔案對應的輸入資料流     }else if(itemPosition==1){      inputStream = assetManager.open("china.txt");//獲得資產檔案對應的輸入資料流    }    int length = inputStream.available();//得到輸入資料流所包含的位元組總數    byte[] buffer = new byte[length]; //建立一個緩衝位元組數組    inputStream.read(buffer); //將輸入資料流資料讀入到位元組數組中     bundle.putString(mFragment.ARG_TEXT_DATA, new String(buffer, "GB2312"));//將位元組數組資料轉換為字串,儲存到Bundle對象中    inputStream.close();  } catch (IOException e) {   e.printStackTrace();  } catch (Exception e) {   e.printStackTrace();  }     //c.向fragment傳入資料  fragment.setArguments(bundle);  //d.擷取FragmentTransaction對象  FragmentTransaction fragmentTransaction = getFragmentManager().beginTransaction();  //c.使用fragment代替該Activity中的containner組件  fragmentTransaction.replace(R.id.mContainer, fragment);  //d.提交事物  fragmentTransaction.commit();    return true; }}
效果示範:
注意:這裡我們只需要設定ActionBar為下拉式清單導航模式,在在列表向的事件監聽器onNavigationItemSelected(int itemPosition, long itemId)根據itemPostion(指定的清單項目ID)替換為相應的Fragment即可。

Android活動條(actionbar)使用詳解(二)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.