標籤: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)使用詳解(二)