Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> 動作視圖和動作提供器(Action Views and Action Providers)

動作視圖和動作提供器(Action Views and Action Providers)

編輯:關於Android編程

首先承認:這篇文章翻譯的有點不准確,因為這個action,我拿不准怎麼翻譯,不知道是翻譯成動詞還是名詞。所以我把有道詞典上的翻譯結果列在下面。

action n. 行動;活動;功能;戰斗;情節

開始翻譯

v7 appcompat 支持庫為你的應用提供了幾種和用戶的交互方式。前面的幾節課講解了如何定義一個action(講的並不怎麼明白)可以是一個按鈕或者一個菜單項。這節課講解如何添加另外兩種通用的組件。

應用欄上的動作視圖有很多功能。例如,一個搜索動作視圖可以讓用戶在應用欄上輸入搜索文字,而不用改變活動或者fragment界面(意思是不用在一個新的界面上進行搜索動作)。

一個動作提供器擁有自定義的布局。這個動作在初始的時候是作為一個按鈕或者菜單項出現的,當用戶點擊這個action的時候,這個動作提供器控制任何你想定義的動作行為。例如當你點擊的時候,動作提供器會彈出一個菜單。

安卓支持庫提供了幾種特定的動作視圖和動作提供者組件。例如,SearchView 實現了輸入內容來查詢的動作視圖,ShareActionProvider 實現了與其他應用共享信息的動作提供器。你也可以定義你自己的動作視圖和動作提供器。

添加一個動作視圖 (Add an Action View)

在toolbar的菜單資源文件中新建一個元素,來添加一個動作視圖。

actionViewClass: 實現了這個動作的組件的類

actionLayout: 描述這個動作的內容的布局文件
showAsAction 屬性可以取值為”ifRoom|collapseActionView” 或者 “never|collapseActionView”.(collapse意思是可折疊的)collapseActionView 表示當用戶沒有和當前action交互的時候action組件如何展示。如果組件是在應用欄上,這個組件會展示為一個圖標。如果這個組件是在overflow按鈕中,這個組件會展示為一個菜單項。當用戶和這個組建交互的時候,這個組件會填滿到整個應用欄。

例如,下面的代碼給應用欄添加了一個SearchView

  

如果用戶沒有和這個組件交互的時候,應用會把這個組件展示為一個圖標。(通過android:icon 定義的圖標)(如果應用欄上沒有足夠的空間,就把這個組件附加到overflow菜單中。)當用戶點擊了這個圖標或者菜單項,這個組件會充滿整個toolbar,允許用戶和它交互。

這裡寫圖片描述

圖表1:當用戶點擊了一個動作視圖的圖標,這個視圖會充滿整個toolbar。<喎?/kf/ware/vc/" target="_blank" class="keylink">vc3Ryb25nPjwvcD4NCjxwPjxzdHJvbmc+yOe5+8Tj0OjSqsno1sPV4rj2tq/X98rTzbyjrNTaxOO1xGFjdGl2aXR5tcRvbkNyZWF0ZU9wdGlvbnNNZW51KCm72LX3t723qNbQyejWw6GjxOO/ydLUtffTw2dldEFjdGlvblZpZXcoKdXiuPa+ssyst723qLXDtb3V4rj2tq/X98rTzby1xNL908Oho8D9yOejrM/Cw+a1xLT6wuu1w7W9wcvJz8Pmyr7A/bT6wuvW0Lao0uW1xFNlYXJjaFZpZXe1xNL908Ohozwvc3Ryb25nPjwvcD4NCjxwcmUgY2xhc3M9"brush:java;"> @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.main_activity_actions, menu); MenuItem searchItem = menu.findItem(R.id.action_search); SearchView searchView = (SearchView) MenuItemCompat.getActionView(searchItem); // 設置搜索內容並添加事件監聽等等。。。 return super.onCreateOptionsMenu(menu); }

動作視圖展開的時候進行交互(Responding to action view expansion)

如果一個動作元素有一個collapseActionView的標志。那麼當用戶不和這個動作視圖交互的時候,應用會把這個動作視圖展示為一個圖標。當用戶點擊了這個圖標,onOptionsItemSelected()的內置處理程序會把這個動作視圖展開。如果你集成了Activity並且重寫了onOptionsItemSelected()方法,你復寫的方法必須(must)調用super.onOptionsItemSelected(),不然這個動作視圖不能展開。

如果當這個動作視圖展開或者折疊起來的時候你想做一些事情,你可以定義一個類實現MenuItem.OnActionExpandListener並作為一個參數傳遞給 setOnActionExpandListener()。例如,當這個動作視圖展開或者折疊的時候你想更新這個activity。下面的片段展示了如何定義並傳遞一個listener。

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.options, menu);
    // ...

    //定義一個監聽器
    OnActionExpandListener expandListener = new OnActionExpandListener() {
        @Override
        public boolean onMenuItemActionCollapse(MenuItem item) {
            // 當item折疊起來的時候的處理動作
            return true;  // 返回true來折疊起這個動作視圖
        }

        @Override
        public boolean onMenuItemActionExpand(MenuItem item) {
            // 當item展開來的時候的處理動作
            return true;  // 返回true來展開這個動作視圖
        }
    };

    // Get the MenuItem for the action item
    MenuItem actionMenuItem = menu.findItem(R.id.myActionItem);

    // 給這個動作視圖添加監聽
    MenuItemCompat.setOnActionExpandListener(actionMenuItem, expandListener);

    //選項菜單創建的時候,你想做的其他事情
    return true;

添加一個動作提供器(Add an Action Provider)

在toolbar的菜單資源文件中新建一個元素來聲明一個動作提供器。添加一個actionProviderClass屬性,並賦值為內容提供器類的全路徑名。

例如,下面的代碼聲明了了一個ShareActionProvider。這是支持庫中的一個組件用來與其他應用共享數據。

在這種情況下,不必要為這個組件提供一個圖標,因為ShareActionProvider自帶了圖標,但是如果你要用一個自定義的圖標,那就聲明一個圖標。

關於自定義一個動作提供器更多信息,請參考 “ ActionProvider reference ”。更多關於設置ShareActionProvider的信息,請參考“ShareActionProvider類”

接下來進入實踐階段

在我的mymenu.xml文件中添加一個item項

2 .然後在MainActivity中重寫方法 onCreateOptionsMenu(Menu menu)

 @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        //這句話的意思是把mymenu加載到menu中
        getMenuInflater().inflate(R.menu.mymenu, menu);
        return super.onCreateOptionsMenu(menu);
    }

3.看一下運行效果
這裡寫圖片描述

4.給這個search動作視圖添加一個搜索文字變化的監聽事件。

首先在MainActivity的布局文件中添加一個EditText,用來顯示搜索框中輸入的內容。在onCreate()方法中找到這個控件。
 @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        //這句話的意思是把mymenu加載到menu中
        getMenuInflater().inflate(R.menu.mymenu, menu);
        MenuItem searchItem=menu.findItem(R.id.action_search);

        SearchView searchView= (SearchView) MenuItemCompat.getActionView(searchItem);

        /**
         * 添加一個搜索文字的監聽事件制作,只做一個簡單的操作,
         */
        searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
            @Override
            public boolean onQueryTextSubmit(String query) {
                return false;
            }

            @Override
            public boolean onQueryTextChange(String newText) {
                //在這裡搜索框裡輸入什麼editText就顯示什麼
                editText.setText(newText);
                return true;
            }
        });
        return super.onCreateOptionsMenu(menu);
    }

這裡寫圖片描述

4.給這個search動作視圖添加一個展開和折疊的監聽事件。


    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        //這句話的意思是把mymenu加載到menu中
        getMenuInflater().inflate(R.menu.mymenu, menu);
        MenuItem searchItem=menu.findItem(R.id.action_search);

        MenuItemCompat.OnActionExpandListener  expandListener=new MenuItemCompat.OnActionExpandListener() {
            @Override
            public boolean onMenuItemActionExpand(MenuItem item) {
               Toast toast= Toast.makeText(MainActivity.this,"搜索框展開了",Toast.LENGTH_SHORT);
                toast.setGravity(Gravity.CENTER,0,0);
                toast.show();
                return true;
            }

            @Override
            public boolean onMenuItemActionCollapse(MenuItem item) {
                Toast toast=Toast.makeText(MainActivity.this,"搜索框折疊了",Toast.LENGTH_SHORT);
                toast.setGravity(Gravity.CENTER,0,0);
                toast.show();
                return true;
            }
        };
        MenuItemCompat.setOnActionExpandListener(searchItem,expandListener);
        return super.onCreateOptionsMenu(menu);
    }

這裡寫圖片描述

下面進入到添加一個動作提供器的實戰環節

在MainActivity中聲明一個Intent myShareIntent; 在onCreateOptionsMenu(Menu menu)中
 //這句話的意思是把mymenu加載到menu中
        getMenuInflater().inflate(R.menu.mymenu, menu);
        MenuItem shareItem = menu.findItem(R.id.action_share);
        ShareActionProvider myShareActionProvider = (ShareActionProvider) MenuItemCompat.getActionProvider(shareItem);
        myShareIntent = new Intent(Intent.ACTION_SEND);
        myShareIntent.setType("image/*");
        //我手機的內存卡的根目錄的Pictures目錄下有一張叫share的圖片,我要把它分享給qq好友
        File imgFile = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES) + "/share.jpg");
        myShareIntent.putExtra(Intent.EXTRA_STREAM, Uri.fromFile(imgFile));
        myShareActionProvider.setShareIntent(myShareIntent);

3.在onOptionsItemSelected(MenuItem item)中操作

 switch (item.getItemId()) {
            case R.id.action_share:
            //分享圖片
                MainActivity.this.startActivity(Intent.createChooser(myShareIntent, "分享圖片"));
                return true;

        }
        return super.onOptionsItemSelected(item);

效果如下
這裡寫圖片描述

差不多就到這了,關於toolbar的翻譯應該結束了。有疑問和錯誤的地方歡迎指出。

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved