編輯:關於Android編程
我們可以在菜單中設置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,一定要注意引入的類是否正確,否則會崩潰,拿到後就可以設置查詢等監聽了,這裡就不在演示了。
我們可以對菜單添加展開折疊監聽,比如搜索框
:
@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表示不應該被展開或者折疊,處理邏輯都在兩個回調中。
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。
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可以用自定義的布局來展示菜單圖標。
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版本之前
2:在代碼中處理對應的邏輯: 這樣就可以直接放回到列表頁,不在返回上一個界面,與返回鍵處理是不同的。 ActionMode是一種菜單,但是與其他菜單不一樣的是,他占據的位置默認為ActionBar的位置,使用方式如下: 我在對一個view進行長按的時候,出現ActionMode菜單。 長按前: 長按後: 如果Toolbar不當做ActionBar處理,Toolbar怎麼進行設置與菜單顯示? 上面演示了當不做為ActionBar時,Toolbar怎麼進行設置,主要是菜單的加載方式變化。Toolbar還可以與CollapsingToolbarLayout,AppBarLayout實現不一樣的標題效果。 這裡主要是對ActionBar和Toolbar的使用進行了梳理,其實還有怎麼對他們進行主題配置,這裡就不在展開了。
@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
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) {
}
};
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;
}
});
}
總結
1、如何對APK簽名(1)、創建數字證書,android123.keystore keytool -genkey -alias android123.keyst
郁悶了半天,今天發現一點擊手機 menu 鍵應用就崩潰了,記得之前都是好好的,調試了半天代碼還是搞不定,於是網上google了一番,發現僅國外有一兩篇文章有提到類
Android 開發的程序員開發程序的時候,一定為log而苦惱過吧。Eclipse老是Log找不到,是不是很讓人不爽,雖然Android Studio的Logcat功能很
之前自認為對於Android的事件分發機制還算比較了解,直到前一陣偶然跟人探討該問題,才發現自己以前的理解有誤,慚愧之余遂決定研習源碼,徹底弄明白Android的事件分發
在研究源碼之前,我們對Handler的了解一般是這樣的概念:在主線程中,