1. 程式人生 > >Android 4 學習(20):ActionBar

Android 4 學習(20):ActionBar

參考《Pro Android 4.0

ActionBar

11.0之後,ActionBarActivity中預設存在,可以在程式碼中設定其顯示與否:

ActionBar actionBar = getActionBar(); 
// Hide the Action Bar actionBar.hide(); 
// Show the Action Bar actionBar.show(); 

也可以在Manifest中設定是否顯示ActionBar

<activity  android:name=”.MyNonActionBarActivity” android:theme
=”@android:style/Theme.Holo.NoActionBar”>

建立一個不顯示ActionBarTheme

<?xml version=”1.0” encoding=”utf-8”?> 
<resources>   <style name=”NoActionBar” parent=”@style/ActivityTheme”>
    <item name=”android:windowActionBar”>false</item>   </style>
</resources
>

ActionBar的其他設定:

ActionBar actionBar = getActionBar(); 
actionBar.setDisplayShowTitleEnabled(false); 
actionBar.setDisplayUseLogoEnabled(displayLogo);
actionBar.setDisplayShowHomeEnabled(false); 
actionBar.setSubtitle(“Inbox”); 
actionBar.setTitle(“Label:important”);
Resources r 
= getResources();Drawable myDrawable = r.getDrawable(R.drawable.gradient_header); actionBar.setBackgroundDrawable(myDrawable); //ActionBar float above content @Override
public void onCreate(Bundle savedInstanceState) {   super.onCreate(savedInstanceState);   getWindow().requestFeature(Window.FEATURE_ACTION_BAR_OVERLAY);   setContentView(R.layout.main); }

使用ActionBar做導航

新建一個Tab:

Tab tabOne = actionBar.newTab(); 
tabOne.setText(“First Tab”).setIcon(R.drawable.ic_launcher).setContentDescription(“Tab the First”).setTabListener( 
  new TabListener<MyFragment>(this, R.id.fragmentContainer, MyFragment.class)); 
actionBar.addTab(tabOne); 

實現TabListener介面:

public static class TabListener<T extends Fragment>  implements ActionBar.TabListener { 
  private MyFragment fragment; 
  private Activity activity; 
  private Class<T> fragmentClass;
  private int fragmentContainer;
  public TabListener(Activity activity, int fragmentContainer, Class<T> fragmentClass) {     this.activity = activity;
    this.fragmentContainer = fragmentContainer;
    this.fragmentClass = fragmentClass;   }   // Called when a new tab has been selected
public void onTabSelected(Tab tab, FragmentTransaction ft) {
  if (fragment == null) {
    String fragmentName = fragmentClass.getName();
    fragment = (MyFragment)Fragment.instantiate(activity, fragmentName);
    ft.add(fragmentContainer, fragment,
null);
    fragment.setFragmentText(tab.getText());   }
else {
    ft.attach(fragment);   }
}   
// Called on the currently selected tab when a different tag is selected.
public void onTabUnselected(Tab tab, FragmentTransaction ft) {
  if (fragment != null) {
    ft.detach(fragment);   }
}
// Called when the selected tab is selected.public void onTabReselected(Tab tab, FragmentTransaction ft) { // TODO React to a selected tab being selected again. } }

TabListenerTab繫結在一起:

Tab tabOne = actionBar.newTab(); 
TabListener<EarthquakeListFragment>  listTabListener = new TabListener<EarthquakeListFragment>(this, R.id.EarthquakeFragmentContainer, EarthquakeListFragment.class); 
tabOne.setTabListener(listTabListener);

使用下拉框導航:

actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_LIST); 
ArrayList<CharSequence> al = new ArrayList<CharSequence>(); 
al.add(“Item 1”);al.add(“Item 2”); 
ArrayAdapter<CharSequence> dropDownAdapter = new ArrayAdapter<CharSequence>(this, android.R.layout.simple_list_item_1, al); 
// Select the drop-down navigation mode. 
actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_LIST); 
// Create a new Spinner Adapter that contains the values to  be displayed in the drop down.
ArrayAdapter dropDownAdapter =
ArrayAdapter.createFromResource(this, R.array.my_dropdown_values, android.R.layout.simple_list_item_1); // Assign the callbacks to handle drop-down selections.
actionBar.setListNavigationCallbacks(dropDownAdapter,
new OnNavigationListener() {
    public boolean onNavigationItemSelected(int itemPosition, long itemId) {
    // TODO Modify your UI based on the position of the drop down item selected.       return true; } });

使用選單和ActionBar Item

Android Actionbar中常用的Menu型別:

1. Icon Menu:在ActionBar中以圖示形式顯示的Menu

2. Expanded and overflow Menu: 點選more出現的選單,顯示文字而不是圖示。

3. Submenu

建立選單

重寫Activity中的onCreateOptionMenus方法可以建立選單:

static final private int MENU_ITEM = Menu.FIRST; 
@Override
public
boolean onCreateOptionsMenu(Menu menu) {   super.onCreateOptionsMenu(menu);   // Group ID
  int groupId = 0;
  // Unique Menu Item identifier. Used for event handling   int menuItemId = MENU_ITEM;
  // The order position of the item
  int menuItemOrder = Menu.NONE;
  // Text to be displayed for this Menu Item
  int menuItemText = R.string.menu_item;   
// Create the Menu Item and keep a reference to it
  MenuItem menuItem = menu.add(groupId, menuItemId,
menuItemOrder, menuItemText);   return true;
}

建立MenuItem的幾個引數:

1. MenuItem所在GroupID

2. MenuItemID,後面可以用findItem方法獲取對應的MenuItem

3. MenuItem在組內的順序

4. MenuItem顯示的文字

獲取已建立的MenuItem

MenuItem menuItem = menu.findItem(MENU_ITEM); 

設定MenuItem的顯示方式

使用setShowAsActionFlags 方法,可以設定MenuItemActionBar中的顯示:

SHOW_AS_ACTION :永遠在ActionBar中顯示

SHOW_AS_IF_SPACE :當ActionBar有空白位置的時候顯示

MenuItem型別

1. CheckBox

// Create a new check box item.
menu.add(0, CHECKBOX_ITEM, Menu.NONE, “CheckBox”).setCheckable(true);

2. Radio Buttons:

// Create a radio button group.
menu.add(RB_GROUP, RADIOBUTTON_1, Menu.NONE, “Radiobutton 1”);
menu.add(RB_GROUP, RADIOBUTTON_2, Menu.NONE, “Radiobutton 2”);
menu.add(RB_GROUP, RADIOBUTTON_3, Menu.NONE, “Radiobutton
3”).setChecked(true);

3. 快捷鍵

// Add a shortcut to this Menu Item, ‘0’ if using the numeric keypad or ‘b’ if using the full keyboard.
menuItem.setShortcut(‘0’, ‘b’);

4. Condensed Title (Condensed Title是指在icon menu的狀態下顯示的標題,在擴充套件(more)那裡會顯示全標題。)

menuItem.setTitleCondensed(“Short Title”); 

5. icon

menuItem.setIcon(R.drawable.menu_item_icon); 

6. MenuItem Click Listener

menuItem.setOnMenuItemClickListener(new OnMenuItemClickListener() { 
  public boolean onMenuItemClick(MenuItem _menuItem) {     [ ... execute click handling, return true if handled ... ]     return true;
  } });

7. Intent

menuItem.setIntent(new Intent(this, MyOtherActivity.class)); 

Action View

menuItem.setActionView(R.layout.my_action_view).setShowAsActionFlags(MenuItem.SHOW_AS_ACTION_IF_ROOM|MenuItem.SHOW_AS_ACTION_COLLAPSE_ACTION_VIEW); 

可以在ActionView中加Button等控制元件:

View myView = menuItem.getActionView();
Button button = (Button)myView.findViewById(R.id.goButton); button.setOnClickListener(new OnClickListener() {
  public void onClick(View v) {   // TODO React to the button press. } });

Fragment中獲取Menu Item

Fragment中呼叫setHasOptionsMenu方法,可以告訴Activity這個Fragment中含有MenuItem,從而使Activity獲得並顯示這些MenuItem。

@Override
public void onCreate(Bundle savedInstanceState) {   super.onCreate(savedInstanceState);   setHasOptionsMenu(true);
}

使用XML定義MenuItem

這是目前比較推薦的新增MenuItem的方法,在res/menu中建立XML檔案並將MenuItem定義寫入此XML

<menu xmlns:android=”http://schemas.android.com/apk/res/android”> 
  <item android:id=”@+id/action_item”
      android:icon=”@drawable/action_item_icon”
      android:title=”@string/action_item_title”
      android:showAsAction=”ifRoom”>   </item>
  <item android:id=”@+id/action_view_item”
      android:icon=”@drawable/action_view_icon”
      android:title=”@string/action_view_title”
      android:showAsAction=”ifRoom|collapseActionView”
      android:actionLayout=”@layout/my_action_view”>   </item>
  <item android:id=”@+id/action_provider_item”
      android:title=”Share”
      android:showAsAction=”always”       android:actionProviderClass=”android.widget.ShareActionProvider”>
  </item>   <item android:id=”@+id/item02”
      android:checkable=”true”
      android:title=”@string/menu_item_two”>   </item>
  <item android:id=”@+id/item03”
      android:numericShortcut=”3”
      android:alphabeticShortcut=”3”
      android:title=”@string/menu_item_three”>   </item>
  <item android:id=”@+id/item04”
      android:title=”@string/submenu_title”>
    <menu>       <item android:id=”@+id/item05”
          android:title=”@string/submenu_item”>       </item>
    </menu>   </item>
</menu>

然後,在onCreateOptionsMenu中建立Menu

public boolean onCreateOptionsMenu(Menu menu) { 
  super.onCreateOptionsMenu(menu); 
  MenuInflater inflater = getMenuInflater(); 
  inflater.inflate(R.menu.my_menu, menu);   
return true;
}

響應Menu選擇事件

Activity中所有的Menu事件都是放在onOptionsItemSelected 中一起處理的:

public boolean onOptionsItemSelected(MenuItem item) { 
  super.onOptionsItemSelected(item); 
  // Find which Menu Item has been selected 
  switch (item.getItemId()) {     
// Check for each known Menu Item
    case (MENU_ITEM):
    [ ... Perform menu handler actions ... ]
      return true;     // Return false if you have not handled the Menu Item     default:
      return false;
  } }

子選單和環境選單

建立子選單:

SubMenu sub = menu.addSubMenu(0, 0, Menu.NONE, “Submenu”); 
sub.setHeaderIcon(R.drawable.icon); sub.setIcon(R.drawable.icon); MenuItem submenuItem
= sub.add(0, 0, Menu.NONE, “Submenu Item”);

使用環境選單和彈出選單:

一種方法是重寫View中的onCreateContextMenu方法,這樣任何包含這個View的Activity都會包含這個上下文選單。

@Override
public void onCreateContextMenu(ContextMenu menu) {   super.onCreateContextMenu(menu);   menu.add(“ContextMenuItem1”);
}

更常用的方法是重寫ActivityonCreateContextMenu方法,然後在onCreate方法中呼叫.

registerForContextMenu(view):
@Override
public
void onCreate(Bundle savedInstanceState) {   super.onCreate(savedInstanceState);   EditText view = new EditText(this);
  setContentView(view);   registerForContextMenu(view); } @Override
public
void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {
  super.onCreateContextMenu(menu, v, menuInfo);   menu.setHeaderTitle(“Context Menu”);
  menu.add(
0, Menu.FIRST, Menu.NONE, “Item 1”).setIcon(R.drawable.menu_item);
  menu.add(0, Menu.FIRST+1, Menu.NONE, “Item 2”).setCheckable(true);
  menu.add(0, Menu.FIRST+2, Menu.NONE, “Item 3”).setShortcut(‘3’, ‘3’);
  SubMenu sub = menu.addSubMenu(“Submenu”);sub.add(“Submenu Item”); }

這樣,在registerForContextMenu中註冊的View中長按螢幕時,就會出現這個環境選單。

彈出選單

建立彈出選單並繫結到View:

final PopupMenu popupMenu = new PopupMenu(this, myView); 

建立彈出選單並繫結到Button

final PopupMenu popupMenu = new PopupMenu(this, button); 
popupMenu.inflate(R.menu.my_popup_menu); 
popupMenu.setOnMenuItemClickListener(new OnMenuItemClickListener() { 
  public boolean onMenuItemClick(MenuItem item) { 
    switch (item.getItemId()) {       case (POPUP_ITEM_1) :
      // TODO Handle popup menu clicks.
        return true;
      default:
        return false;
    }   }
});

相關推薦

Android 4 學習20ActionBar

參考《Pro Android 4.0》 ActionBar 11.0之後,ActionBar在Activity中預設存在,可以在程式碼中設定其顯示與否: ActionBar actionBar = getActionBar(); // Hide the Action Bar actionBa

Android 4 學習21對話方塊

對話方塊 建立Dialog的兩種方式: 1. 使用Dialog類或其子類,包括DialogFragment 2. 在Activity中使用Dialog主題(theme) 下面是使用Dialog類的一個例子: // Create the new Dialog.Dialog dialog = n

Android 4 學習18搜尋

參考《Professional Android 4 Development》 搜尋 通過下面這幾種方式可以給應用程式新增搜尋功能: Search Bar Search View Quick Search Box 可搜尋的Content Provider 首

Android 4 學習17使用Content Resolver

Content Resolver簡介 每個應用程式都有一個ContentResolver例項,通過getContentResolver()方法可以獲取: ContentResolver cr = getContentResolver(); 與Content Provider對應,Cont

Android 4 學習19Services

參考《Professional Android 4 Development》 Services Service是invisible的,因此其優先順序不高於visible的Activity,之所以說不高於,是因為我們可以設定Service為在前臺執行。 建立Service Android提供了Ser

Android 4學習7使用者介面

參考《Professional Android 4 Development》 Android UI基本元素 下面這些概念是Android UI設計的基礎,深入學習和理解它們是Android UI設計的基礎: View:View是所有UI元素,包括Layout在內,的父

Android 4學習6概述

參考:《Professional Android 4 Application Development》 深入瞭解Android Activity 每一個Android Activity都對應於一個使用者介面(UI)。每個Android Application都有一個m

Android NDK學習編譯腳本語法Android.mk和Application.mk

GC make files 文件的 包括 一次 opengl aries 基本語法 一、Android.mk Android.mk分為一下幾部分: LOCAL_PATH:= $(call my-dir), 返回當前文件在系統中的路徑,Android.mk文件開始時必須定義

Android Camera學習如何實現轉動螢幕介面選單跟著轉動效果

最近公司在做車載專案,需要把照相機原本豎向顯示改為橫向顯示。所以研究了下camera選單朝向的問題。 系統提供了一個監聽sensor狀態變化的類OrientationEventListener。在系統程式碼CameraActivity中就是繼承的這個類。 private

Android BLE學習編寫自己的 BLE藍芽讀寫工具功能仿照nrf master control panel

背景 由於nordic官方的nrf master control panel只提供了apk,很多同學學習起來都得自己摸索藍芽的讀寫,專案中整理了BLE模組的基本讀寫方法以及一些常用的UUID,並且抽取了一些藍芽操作的流程,方便Android app程式碼開發,

Android BLE學習 Android搜尋BLE裝置

背景 總結一下最近ble的學習情況。自從入手ble 51822開發板後就開始不停加班,中途出於好奇,業餘時間寫了一些微控制器上json解析相關的東西,妄圖使用藍芽傳輸json資料,不知道是否實用,既然開始寫了,得寫出點樣子,晃晃蕩蕩,2016年的1月份就過去了

我的OpenCV學習筆記20提取元素的輪廓及形狀描述子

先看提取輪廓的程式碼: Mat image = imread("D:/picture/images/binaryGroup.bmp",0); if(!image.data) return -1; imshow("源影象",image); //獲取輪廓 std

linux命令學習6ps命令

bytes 釋放 ice cti width kthread hellip 名稱 pts Linux中的ps命令是Process Status的縮寫。ps命令用來列出系統中當前運行的那些進程。ps命令列出的是當前那些進程的快照,就是執行ps命令的那個時刻的那些進程,如果想要

ActiveMQ20Consumer高級特性之重新投遞Redelivery Policy

jms activemq 重新投遞 一、簡介ActiveMQ在接收消息的Client有以下幾種操作的時候,需要重新傳遞消息: 1:Client用了transactions,且在session中調用了rollback() 2:Client用了transactions,且在調用commit()之前關閉

JAVA學習方法重載與方法重寫、thiskeyword和superkeyword

格式 hello new 初始 per 而且 方法重寫 學習 方式 方法重載與方法重寫、thiskeyword和superkeyword 1、方法重載 重載可以使具有同樣名稱但不同數目和類型參數的類傳遞給方法。 註: 一是重載方法的參數列表必須與被重載的方法不同

Linux命令學習17ifconfig命令

廣播 參考 vip 統計 協議 cnblogs 還需要 pro 網絡 版權聲明更新:2017-05-22博主:LuckyAlan聯系:[email protected]/* */聲明:吃水不忘挖井人,轉載請註明出處! 1 文章介紹 我們知道,在windows中,

ArcGIS API for JavaScript學習1第一個地圖

樣式表 參數 資源 charset 底層 arcgis 順序 api navi 1.簡介 ArcGIS API for JavaScript跟隨ArcGIS 9.3同時發布,是ESRI根據JavaScript技術實現的調用ArcGIS Server REST API接口的一

Java學習2將鍵盤錄入的內容保存到指定文件中

stream exce 創建 txt 關閉 如果 下午 line 再次 要求:保存鍵盤錄入的內容,當鍵盤輸入end時,錄入結束。 1 /** 2 * 保存鍵盤輸入,並以end結束 3 * 4 * @author xcx 5 * @time 2017年6

RabbitMQ學習遠程結果調用

cells actor ble 隨機 get getenv all 求和 int 場景:我們需要在傳輸消息時得到結果 客服端在發送請求時會發送回調隊列,服務端處理事情完成後會將結果返回到回調隊列中,在增加關聯標誌關聯每個請求和服務返回 客戶端代碼: public

facets學習1什麽是facets

遺失 air 不同的 無縫切換 over 快速 後來 樣式 觀察 ML 數據集可以包含數億個數據點,每個數據點由數百(甚至數千)的特征組成,幾乎不可能以直觀的方式了解整個數據集。為幫助理解、分析和調試 ML 數據集,谷歌開源了 Facets,一款可視化工具。 Facets