編輯:關於Android編程
Action Bar是一種新増的導航欄功能,在Android 3.0之後加入到系統的API當中,它標識了用戶當前操作界面的位置,並提供了額外的用戶動作、界面導航等功能。使用ActionBar的好處是,它可以給提供一種全局統一的UI界面,使得用戶在使用任何一款軟件時都懂得該如何操作,並且ActionBar還可以自動適應各種不同大小的屏幕。下面是一張使用ActionBar的界面截圖:
其中,[1]是ActionBar的圖標,[2]是兩個action按鈕,[3]是overflow按鈕。
–布局文件–
AndroidStudio自動創建的MainActivity繼承自AppCompatActivity本身攜帶有ActionBar,這裡想要使用ToolBar來實現ActionBar的功能,需要先修改下theme
使用Theme.AppCompat.Light.NoActionBar作為activity的風格,這裡插述一下相關屬性代表的界面位置
創建ToolBar對應的xml文件
toolbar.xml
這裡把這個文件單獨作為一個xml方便多個layout中包含
activity_main.xml
主界面對應的layout中include剛才創建的toolbar.xml文件
main_menu.xml
menu 對應的屬性解釋一下
showAsAction的幾個屬性,解釋一下
–代碼使用–
package mraz.com.actionbardemo;
import android.os.Bundle;
import android.support.design.widget.Snackbar;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.LinearLayout;
public class MainActivity extends AppCompatActivity {
LinearLayout rootlayout;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
rootlayout = (LinearLayout) findViewById(R.id.rootlayout);
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
toolbar.setNavigationIcon(R.drawable.ic_menu_black_24dp);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.main_menu, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.action_info:
Snackbar.make(rootlayout, " Info ", Snackbar.LENGTH_SHORT).show();
break;
case R.id.action_search:
Snackbar.make(rootlayout, " Search ", Snackbar.LENGTH_SHORT).show();
break;
case R.id.action_settings:
Snackbar.make(rootlayout, " Settings ", Snackbar.LENGTH_SHORT).show();
break;
}
return super.onOptionsItemSelected(item);
}
}
比較關鍵的只有3行代碼
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); //獲取toolbar
setSupportActionBar(toolbar); //設置成ActionBar
getMenuInflater().inflate(R.menu.main_menu, menu); //創建actionbar的菜單項
有了這些代碼基本上就可以顯示ActionBar,當然要實現與用戶的交互,就需要對每一個item做對應的響應處理,這裡根據菜單的id,做了簡單的Snackbar的展示,開發者可以根據自己的需要實現更復雜的邏輯
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.action_info:
Snackbar.make(rootlayout, " Info ", Snackbar.LENGTH_SHORT).show();
break;
……
}
–效果圖–
上面的例子中有個比較特殊的Menu Item
這裡使用了actionViewClass,這個要設置shwoAsAction為 ifRoom|collapseActionView使用才行,其實刪除collapseActionView,也是可以正常使用,只是體現的方式不一樣。獲取SearchView的方式
MenuItem item = menu.findItem(R.id.action_search);
SearchView searchView = (SearchView) item.getActionView();
SerachView 對象拿到之後可以對其屬性進行操作。給Action View添加展開和收起的事件監聽,實現方式
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.main_menu, menu);
MenuItem searchitem = menu.findItem(R.id.action_search);
SearchView searchView = (SearchView) searchitem.getActionView();
MenuItemCompat.setOnActionExpandListener(searchitem, new MenuItemCompat.OnActionExpandListener() {
@Override
public boolean onMenuItemActionExpand(MenuItem item) {
Snackbar.make(rootlayout, " onMenuItemActionExpand ", Snackbar.LENGTH_SHORT).show();
return true;
}
@Override
public boolean onMenuItemActionCollapse(MenuItem item) {
Snackbar.make(rootlayout, " onMenuItemActionCollapse ", Snackbar.LENGTH_SHORT).show();
return true;
}
});
return true;
}
拿到searchItem之後,執行
MenuItemCompat.setOnActionExpandListener(searchitem, new MenuItemCompat.OnActionExpandListener() );
–效果圖–
menu文件中使用
類似的方式獲取ActionProvider
MenuItem shareItem = menu.findItem(R.id.action_share);
ShareActionProvider mShareActionProvider = (ShareActionProvider)
MenuItemCompat.getActionProvider(shareItem);
mShareActionProvider.setShareIntent(……);
針對ActionProvider可以實現自定義的ActionProvider,繼承基礎類ActionProvider
啟用ActionBar圖標導航的功能,可以允許用戶根據當前應用的位置來在不同界面之間切換。比如,A界面展示了一個列表,點擊某一項之後進入了B界面,這時B界面就應該啟用ActionBar圖標導航功能,這樣就可以回到A界面。
我們可以通過調用setDisplayHomeAsUpEnabled()方法來啟用ActionBar圖標導航功能
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
此時ActionBar左側會出現一個返回的按鈕
針對這返回按鈕的事件響應還是在public boolean onOptionsItemSelected(MenuItem item) 方法中實現,它有一個固定的資源Id—- android.R.id.home<喎?/kf/ware/vc/" target="_blank" class="keylink">vcD4NCjxwcmUgY2xhc3M9"brush:java;">
case android.R.id.home:
finish();
break;
簡單的執行下和返回鍵相同的操作。結束當前activity
實現Activity之間的快速切換
新建一個ParentActivity.java
package mraz.com.actionbardemo;
import android.content.Context;
import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.TextView;
public class ParentActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_parent);
final Context mContext = this;
TextView textView = (TextView) findViewById(R.id.tv_parent);
textView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent();
intent.setClass(mContext , MainActivity.class);
startActivity(intent);
}
});
}
}
AndroidManifest.xml文件中做如下修改
這一句很關鍵
android:parentActivityName=”mraz.com.actionbardemo.ParentActivity”>
設置父Activity的名稱,ParentActivity為啟動Activity同時是MainActivity的父Activity
然後在MainActivity中針對這個返回按鈕做一下處理,不再是簡單的結束掉當前的這個Activity了,需要做出對應的導航的處理邏輯
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);
}
break;
其中,調用NavUtils.getParentActivityIntent()方法可以獲取到跳轉至父Activity的Intent,然後如果父Activity和當前Activity是在同一個Task中的,則直接調用navigateUpTo()方法進行跳轉,如果不是在同一個Task中的,則需要借助TaskStackBuilder來創建一個新的Task。
這樣,就按照標准的規范成功實現ActionBar導航的功能了。
–效果圖–
第5節 Activity的Manifest配置5.1 Activity的聲明Activity作為四大組件,代碼中每定義一個Activity就需要在AndroidManif
Android應用三種線程 UI Thread Binder Thread Background Thread之間的區別與聯系UI Thread我們先來看一下App與Li
Android中Button控件應該算作是比較簡單的控件,然而,它的使用頻率卻是非常的高,今天,我在這裡總結了三種常用的點擊Button實現其功能的方法。1.很多時候,我
上一篇簡單介紹了廣播的發送,這篇主要介紹下,有序廣播的發送。 設置完相關屬性的時候,廣播就會按照有序的方式進行發送: 發送順序: 第一條廣播; 再發送第二條廣播; 最後發