Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android 標題欄(二)

Android 標題欄(二)

編輯:關於Android編程

ActionBar & Toolbar

設置ActionView

我們可以在菜單中設置ActionView,比如搜索,他是一個帶圖標和輸入框的控件,他分別有兩種不同的形態,展開和折疊。接下來我們就講講怎麼設置ActionView。
1.在menu菜單的item中設置actionViewClass屬性:




// 注意 根據是否引用的support包,actionViewClass設置的類不同,如果是support包則設置為android.support.v7.widget.SearchView且用app來標識, 否則設置為android.widget.SearchView且用android來標識

2:在代碼中可以獲取到ActionView,也可以設置ActionView:

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.action_menu, menu);
    MenuItem search = menu.findItem(R.id.search_icon);
    // 這種方式也可以獲取到ActionView
    // SearchView view = (SearchView) search.getActionView();
    // 一定要注意導入的類是否正確,要區分support和非support包中的類
    SearchView view = (SearchView) MenuItemCompat.getActionView(search);
    view.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
        @Override
        public boolean onQueryTextSubmit(String query) {
            return false;
        }

        @Override
        public boolean onQueryTextChange(String newText) {
            return false;
        }
    });
    return true;
}

如果menu菜單中沒有設置actionViewClass,也可以在代碼中手動設置,search.setActionView(new SearchView(this));,上面就是獲取到的SearchView,一定要注意引入的類是否正確,否則會崩潰,拿到後就可以設置查詢等監聽了,這裡就不在演示了。

ActionView展開折疊

我們可以對菜單添加展開折疊監聽,比如搜索框

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.action_menu, menu);
    MenuItem search = menu.findItem(R.id.search_icon);
    // support 包調用如下方法
    MenuItemCompat.setOnActionExpandListener(search, new MenuItemCompat.OnActionExpandListener() {
        @Override
        public boolean onMenuItemActionExpand(MenuItem item) {
            return false;
        }

        @Override
        public boolean onMenuItemActionCollapse(MenuItem item) {
            return false;
        }
    });
//        
//        search.setOnActionExpandListener(new MenuItem.OnActionExpandListener() {
//            @Override
//            public boolean onMenuItemActionExpand(MenuItem item) {
//                // TODO
//                return true;
//            }
//
//            @Override
//            public boolean onMenuItemActionCollapse(MenuItem item) {
//                // TODO
//                return true;
//            }
//        });
    return true;
}

返回true表示應該被展開或者折疊,返回false表示不應該被展開或者折疊,處理邏輯都在兩個回調中。

添加ActionProvider

1.在menu菜單中添加app:actionProviderClass屬性:




// 注意 根據是否引用的support包,actionProviderClass設置的類不同,如果是support包則設置為android.support.v7.widget.ShareActionProvider且用app來標識, 否則設置為android.widget.ShareActionProvider且用android來標識

2. 在代碼中設置

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.action_menu, menu);
    MenuItem plus = menu.findItem(R.id.plus);
    //support包中采用如下方法
    //MenuItemCompat.setActionProvider(plus, new ShareActionProvider(this));
    //非support中直接設置
    //plus.setActionProvider(new ShareActionProvider(this));

    //support包中采用如下方法
    ShareActionProvider provider = (ShareActionProvider) MenuItemCompat.getActionProvider(plus);
    provider.setShareIntent(getShareIntent());
    //ShareActionProvider provider = plus.getActionProvider();
    return true;
}

private Intent getShareIntent() {
    Intent intent = new Intent(Intent.ACTION_SEND);
    intent.setType("image/*");
    return intent;
}

上述就實現了分享的效果,只是需要注意的是要區分所引用的類是否是support包中的類。類型一定要正確。

自定義provider

如果系統提供的provider不符合要求怎麼辦?我們還可以自定義provider。

public class PlusProvider extends ActionProvider {
    /**
     * Creates a new instance. ActionProvider classes should always implement a
     * constructor that takes a single Context parameter for inflating from menu XML.
     *
     * @param context Context for accessing resources.
     */
    public PlusProvider(Context context) {
        super(context);
    }

    @Override
    public void onPrepareSubMenu(SubMenu subMenu) {
        subMenu.clear();
        subMenu.add("tab1").setIcon(R.drawable.logo).setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() {
            @Override
            public boolean onMenuItemClick(MenuItem item) {
                return false;
            }
        });
        subMenu.add("tab2").setIcon(R.drawable.logo).setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() {
            @Override
            public boolean onMenuItemClick(MenuItem item) {
                return false;
            }
        });
    }

    @Override
    public View onCreateActionView() {
        return null;
    }

    @Override
    public boolean hasSubMenu() {
        return true;
    }
}

上面我們自定義了一個加號的provider,hasSubMenu表示十分有子菜單,true表示有,在onPrepareSubMenu中初始化子菜單。子菜單可以設置顯示文字,圖標與響應點擊事件。

設置完成後,就與系統提供的provider使用方式一樣。

設置ActionLayout

設置ActionLayout可以用自定義的布局來展示菜單圖標。
1.創建一個布局




    

布局中包含了一個設置圖標,之後在menu中引用


這樣就把默認的加號圖標給改變成設置圖標,在代碼中也可以調用setActionView來更改圖標。但是不建議這樣做,每一個菜單都做明確的事情。

頁面導航

怎麼開啟頁面導航?在代碼中調用getActionBar(). setDisplayHomeAsUpEnabled(true)就可以開啟頁面導航,如果是support包中需要調用getSupportActionBar(),開啟後,默認頁面左上角會出現返回箭頭。指示頁面點擊可以返回。僅僅是開啟頁面導航是不夠的,還需要對他進行處理。

因為返回箭頭也屬於ActionBar中的ActionView因此處理方式是一樣的,不同是的它的id已經默認指定為android.R.id.home。因此需要在onOptionsItemSelected函數中處理id為android.R.id.home:

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
        case android.R.id.home:
            finish();
            break;
    }
    return super.onOptionsItemSelected(item);
}

左上的箭頭圖標,我們可以在style中設置為自己的圖標,也可以在代碼中調用getActionBar().setHomeAsUpIndicator()來更改圖標。

一般情況下只需要關閉掉當前界面,因此直接調用finish關閉掉當前頁面。但是這不是返回箭頭設置的初衷,否則他與軟件的返回沒有任何的區別,那在什麼情況下需要特殊處理吶?

我們先來看看一個官方的圖片:

這裡寫圖片描述vcHQse3Ss6OstvjI7bz8xcy3tbvY1PK3tbvYyc/Su7j20rPD5qGj1eLW1sfpv/bU9cO0tKbA7aO/PC9jb2RlPjwvcD4NCjxwPjEuytfPyNDo0qrU2kFuZHJvaWRNYW5pZmVzdNKzw+bW0LbUQWN0aXZpdHnJ6NbDcGFyZW50yvTQ1KO6PC9jb2RlPjwvcD4NCjxwcmUgY2xhc3M9"brush:java;"> // 4.1版本之前 // 4.1版本之後

2:在代碼中處理對應的邏輯:

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
        case android.R.id.home:
            Intent intent = NavUtils.getParentActivityIntent(this);
            if(intent!=null){
                intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
                NavUtils.navigateUpTo(this, intent);
            }else{
                finish();
            }
            break;
    }
    return super.onOptionsItemSelected(item);
}

這樣就可以直接放回到列表頁,不在返回上一個界面,與返回鍵處理是不同的。

設置ActionMode

ActionMode是一種菜單,但是與其他菜單不一樣的是,他占據的位置默認為ActionBar的位置,使用方式如下:

private void findViews() {
    View actionMode = findViewById(R.id.show_menu);
    assert actionMode != null;
    actionMode.setOnLongClickListener(new View.OnLongClickListener() {
        @Override
        public boolean onLongClick(View v) {
            ActionBarActivity.this.startActionMode(callback);
            return true;
        }
    });
}
private ActionMode.Callback callback = new ActionMode.Callback() {
    @Override
    public boolean onCreateActionMode(ActionMode mode, Menu menu) {
        mode.getMenuInflater().inflate(R.menu.action_menu1, menu);
        return true;
    }

    @Override
    public boolean onPrepareActionMode(ActionMode mode, Menu menu) {
        return false;
    }

    @Override
    public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
        return false;
    }

    @Override
    public void onDestroyActionMode(ActionMode mode) {

    }
};

我在對一個view進行長按的時候,出現ActionMode菜單。

長按前:
這裡寫圖片描述

長按後:
這裡寫圖片描述

Toolbar

如果Toolbar不當做ActionBar處理,Toolbar怎麼進行設置與菜單顯示?


private void setToolbar(Toolbar toolbar) {
    //setSupportActionBar(toolbar);
    toolbar.setTitle("主標題");
    toolbar.setSubtitle("副標題");
    toolbar.setLogo(R.drawable.logo);
    toolbar.inflateMenu(R.menu.action_menu);
    toolbar.setOnMenuItemClickListener(new toolbar.OnMenuItemClickListener() {
        @Override
        public boolean onMenuItemClick(MenuItem item) {
            return false;
        }
    });
}

上面演示了當不做為ActionBar時,Toolbar怎麼進行設置,主要是菜單的加載方式變化。Toolbar還可以與CollapsingToolbarLayout,AppBarLayout實現不一樣的標題效果。

總結

這裡主要是對ActionBar和Toolbar的使用進行了梳理,其實還有怎麼對他們進行主題配置,這裡就不在展開了。

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