日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > Android >内容正文

Android

Android之ActionBar

發布時間:2024/7/23 Android 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Android之ActionBar 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

本文主要包括以下內容

  • ActionBar的顯示及隱藏,添加圖標,返回主頁
  • ActionBar添加ActionView,添加ActionProvider
  • ActionBar實現Tab
  • ActionBar添加下拉列表
  • ActionBar介紹

    在Android 3.0中除了我們重點講解的Fragment外,Action Bar也是一個非常重要的交互元素,Action Bar取代了傳統的tittle bar和menu,在程序運行中一直置于頂部,對于Android平板設備來說屏幕更大它的標題使用Action Bar來設計可以展示更多豐富的內容,方便操控

    ActioinBar功能

    <1> ActionBar的圖標,可顯示軟件圖標,也可用其他圖標代替。當軟件不在最高級頁面時,圖標左側會顯示一個左箭頭,用戶可以通過這個箭頭向上導航;

      <2> 如果你的應用要在不同的View中顯示數據,這部分允許用戶來切換視圖。一般的作法是用一個下拉菜單或者是Tab選項卡。如果只有一個界面,那這里可以顯示應用程序的標題或者是更長一點的商標信息;

      <3> 兩個action按鈕,這里放重要的按鈕功能,為用戶進行某項操作提供直接的訪問;

      <4> overflow按鈕,放不下的按鈕會被置于“更多…”菜單項中,“更多…”菜單項是以下拉形式實現的

    ActionBar修改文字與圖標

    第一種方法

    <applicationandroid:allowBackup="true"android:icon="@mipmap/ic_launcher"android:label="@string/app_name"android:logo="@drawable/cnblog_icon"android:supportsRtl="true"android:theme="@style/AppTheme">

    在mainfest文件中設置label與logo,但圖片卻顯示不出來,所心采用第二種方式,在代碼中改變

    ActionBar actionBar = getSupportActionBar();actionBar.setDisplayShowHomeEnabled(true);actionBar.setLogo(R.mipmap.ic_launcher);actionBar.setDisplayUseLogoEnabled(true);setTitle("abc");

    添加按鈕

    ActionBar還可以根據應用程序當前的功能來提供與其相關的Action按鈕,這些按鈕都會以圖標或文字的形式直接顯示在ActionBar上。當然,如果按鈕過多,ActionBar上顯示不完,多出的一些按鈕可以隱藏在overflow里面(最右邊的三個點就是overflow按鈕),點擊一下overflow按鈕就可以看到全部的Action按鈕了。

    當Activity啟動的時候,系統會調用Activity的onCreateOptionsMenu()方法來取出所有的Action按鈕,我們只需要在這個方法中去加載一個menu資源,并把所有的Action按鈕都定義在資源文件里面就可以了。

    那么我們先來看下menu資源文件該如何定義,代碼如下所示:

    <?xml version="1.0" encoding="utf-8"?> <menu xmlns:android="http://schemas.android.com/apk/res/android" ><item android:id="@+id/user_p"android:icon="@drawable/icon_user_p"android:showAsAction="always"android:title="用戶"/><item android:id="@+id/write_p"android:icon="@drawable/icon_write_p"android:showAsAction="always"android:title="發布"/><item android:id="@+id/favo_p"android:icon="@drawable/icon_favo_p"android:showAsAction="never"android:title="收藏"/></menu>

    接著,重寫Activity的onCreateOptionsMenu()方法,代碼如下所示:

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

    響應Action按鈕的點擊事件

    當用戶點擊Action按鈕的時候,系統會調用Activity的onOptionsItemSelected()方法,通過方法傳入的MenuItem參數,我們可以調用它的getItemId()方法和menu資源中的id進行比較,從而辨別出用戶點擊的是哪一個Action按鈕,比如:

    @Overridepublic boolean onOptionsItemSelected(MenuItem item) {switch (item.getItemId()) { case R.id.user_p: Toast.makeText(this, "你點擊了“用戶”按鍵!", Toast.LENGTH_SHORT).show(); return true; case R.id.write_p: Toast.makeText(this, "你點擊了“發布”按鍵!", Toast.LENGTH_SHORT).show(); return true; case R.id.favo_p: Toast.makeText(this, "你點擊了“收藏”按鍵!", Toast.LENGTH_SHORT).show(); return true; default: return super.onOptionsItemSelected(item); } }

    效果如下

    返回主頁實現

    首先設置setDisplayHomeAsUpEnable

    ActionBar actionBar = getActionBar(); actionBar.setDisplayHomeAsUpEnabled(true);

    第二步需要在AndroidManifest.xml中配置父Activity,如下所示:

    <activity android:name="com.yanis.actionbar.TabActivity"android:parentActivityName="com.yanis.actionbar.MainActivity" > </activity>

    第三步則需要對android.R.id.home這個事件進行一些特殊處理,如下所示,重寫方法:

    @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case android.R.id.home: Intent upIntent = NavUtils.getParentActivityIntent(this); if (NavUtils.shouldUpRecreateTask(this, upIntent)) { TaskStackBuilder.create(this) .addNextIntentWithParentStack(upIntent) .startActivities(); } else { upIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); NavUtils.navigateUpTo(this, upIntent); } return true; ...... } }

    添加ActionView

    ActionView是一種可以在ActionBar中替換Action按鈕的控件,它可以允許用戶在不切換界面的情況下通過ActionBar完成一些較為豐富的操作。比如說,你需要完成一個搜索功能,就可以將SeachView這個控件添加到ActionBar中。

    為了聲明一個ActionView,我們可以在menu資源中通過actionViewClass屬性來指定一個控件

    <itemandroid:id="@+id/action_search"android:actionViewClass="android.widget.SearchView"android:showAsAction="always"android:title="搜索"/>

    但這種寫法似乎有兼容性問題,無法達到效果,在item中將actionViewClass去除,在代碼中實現

    MenuItem item=menu.findItem(R.id.action_search);item.setActionView(R.layout.searchview);

    其中searchView如下

    <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:orientation="vertical" android:layout_width="match_parent"android:layout_height="match_parent"><SearchView android:layout_width="match_parent"android:layout_height="wrap_content"></SearchView></LinearLayout>

    添加Action Provider

    和Action View有點類似,Action Provider也可以將一個Action按鈕替換成一個自定義的布局。但不同的是,Action Provider能夠完全控制事件的所有行為,并且還可以在點擊的時候顯示子菜單。

    為了添加一個Action Provider,我們需要在標簽中指定一個actionViewClass屬性,在里面填入Action Provider的完整類名。我們可以通過繼承ActionProvider類的方式來創建一個自己的Action Provider,同時,Android也提供好了幾個內置的Action Provider,比如說ShareActionProvider。

    由于每個Action Provider都可以自由地控制事件響應,所以它們不需要在onOptionsItemSelected()方法中再去監聽點擊事件,而是應該在onPerformDefaultAction()方法中去執行相應的邏輯。

    那么我們就先來看一下ShareActionProvider的簡單用法吧,編輯menu資源文件,在里面加入ShareActionProvider的聲明,如下所示:

    <?xml version="1.0" encoding="utf-8"?> <menu xmlns:android="http://schemas.android.com/apk/res/android" ><item android:id="@+id/action_share" android:actionProviderClass="android.widget.ShareActionProvider" android:showAsAction="ifRoom" android:title="分享" /> ... </menu>

    接著剩下的事情就是通過Intent來定義出你想分享哪些東西了,我們只需要在onCreateOptionsMenu()中調用MenuItem的getActionProvider()方法來得到該ShareActionProvider對象,再通過setShareIntent()方法去選擇構建出什么樣的一個Intent就可以了。代碼如下所示:

    @Overridepublic boolean onCreateOptionsMenu(Menu menu) {MenuInflater inflater = getMenuInflater();inflater.inflate(R.menu.menu_main, menu);MenuItem shareItem = menu.findItem(R.id.action_share);ShareActionProvider provider = (ShareActionProvider) shareItem.getActionProvider();provider.setShareIntent(getDefaultIntent());return super.onCreateOptionsMenu(menu);}private Intent getDefaultIntent() {Intent intent = new Intent(Intent.ACTION_SEND);intent.setType("image/*");return intent;}

    但shareItem.getActionProvider()會得到空指針異常,所以修改為

    @Overridepublic boolean onCreateOptionsMenu(Menu menu) {MenuInflater inflater = getMenuInflater();inflater.inflate(R.menu.menu_main, menu);MenuItem shareItem = menu.findItem(R.id.action_share);ShareActionProvider provider = (ShareActionProvider) MenuItemCompat.getActionProvider(shareItem);provider.setShareIntent(getDefaultIntent());return super.onCreateOptionsMenu(menu);}private Intent getDefaultIntent() {Intent intent = new Intent(Intent.ACTION_SEND);intent.setType("image/*");return intent;}

    效果如下

    添加導航Tab

    Tabs的應用可以算是非常廣泛了,它可以使得用戶非常輕松地在你的應用程序中切換不同的視圖。而Android官方更加推薦使用ActionBar中提供的Tabs功能,因為它更加的智能,可以自動適配各種屏幕的大小。比如說,在平板上屏幕的空間非常充足,Tabs會和Action按鈕在同一行顯示

    主要有三步

    下面我們就來看一下如何使用ActionBar提供的Tab功能,大致可以分為以下幾步:

  • 實現ActionBar.TabListener接口,這個接口提供了Tab事件的各種回調,比如當用戶點擊了一個Tab時,你就可以進行切換Tab的操作。
  • 2.為每一個你想添加的Tab創建一個ActionBar.Tab的實例,并且調用setTabListener()方法來設置ActionBar.TabListener。除此之外,還需要調用setText()方法來給當前Tab設置標題。

    3.最后調用ActionBar的addTab()方法將創建好的Tab添加到ActionBar中。

    詳情見【Android UI設計與開發】8.頂部標題欄(一)ActionBar 奧義·詳解 - 葉超Luka - 博客園

    主要需要注意到在用Android Studio開發時,使用ActionBar actionBar = getActionBar();會得到空指針異常,所以要全部改成ActionBar actionBar = getSupportActionBar();其中ActionBar來自于import android.support.v7.app.ActionBar;

    效果如下

    添加下拉列表導航

    .1 簡單介紹

    作為Activity內部的另一種導航(或過濾)模式,操作欄提供了內置的下拉列表。下拉列表能夠提供Activity中內容

    的不同排序模式。

    啟用下拉式導航的基本過程如下:

    <1> 創建一個給下拉提供可選項目的列表,以及描畫列表項目時所使用的布局;

    <2> 實現ActionBar.OnNavigationListener回調,在這個回調中定義當用戶選擇列表中一個項目時所發生的行為;

    <3> 用setNavigationMode()方法該操作欄啟用導航模式;

    <4> 用setListNavigationCallbacks()方法給下拉列表設置回調方法。

    實現

    準備列表數據( strings.xml)

    <string-array name="action_list"><item>Fragment1</item><item>Fragment2</item><item>Fragment3</item></string-array>``` 主界面代碼

    package com.yanis.actionbar;

    import android.app.ActionBar;
    import android.app.ActionBar.OnNavigationListener;
    import android.app.Activity;
    import android.app.Fragment;
    import android.app.TaskStackBuilder;
    import android.content.Intent;
    import android.os.Bundle;
    import android.support.v4.app.NavUtils;
    import android.view.MenuItem;
    import android.widget.ArrayAdapter;
    import android.widget.SpinnerAdapter;

    public class ListActivity extends Activity {
    private OnNavigationListener mOnNavigationListener;
    private String[] arry_list;

    @Override protected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_list);initView(); }/*** 初始化組件*/ private void initView() {ActionBar actionBar = getActionBar();actionBar.setDisplayHomeAsUpEnabled(true);// //導航模式必須設為NAVIGATION_MODE_LISTactionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_LIST);// 定義一個下拉列表數據適配器SpinnerAdapter mSpinnerAdapter = ArrayAdapter.createFromResource(this,R.array.action_list,android.R.layout.simple_spinner_dropdown_item);arry_list = getResources().getStringArray(R.array.action_list);mOnNavigationListener = new OnNavigationListener() {@Overridepublic boolean onNavigationItemSelected(int position, long itemId) {Fragment newFragment = null;switch (position) {case 0:newFragment = new Fragment1();break;case 1:newFragment = new Fragment2();break;case 2:newFragment = new Fragment3();break;default:break;}getFragmentManager().beginTransaction().replace(R.id.container, newFragment,arry_list[position]).commit();return true;}};actionBar.setListNavigationCallbacks(mSpinnerAdapter,mOnNavigationListener); }@Override public boolean onOptionsItemSelected(MenuItem item) {switch (item.getItemId()) {case android.R.id.home:Intent upIntent = NavUtils.getParentActivityIntent(this);if (NavUtils.shouldUpRecreateTask(this, upIntent)) {TaskStackBuilder.create(this).addNextIntentWithParentStack(upIntent).startActivities();} else {upIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);NavUtils.navigateUpTo(this, upIntent);}return true;default:return super.onOptionsItemSelected(item);} }

    }
    “`

    主要是要將getFragmentManager改成getSupportFragmentManager應對版本問題

    效果如下:

    參考鏈接:

    【Android UI設計與開發】8.頂部標題欄(一)ActionBar 奧義·詳解 - 葉超Luka - 博客園

    github代碼地址

    總結

    以上是生活随笔為你收集整理的Android之ActionBar的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。