【Android基础笔记20】ActionBar动作栏及Dialog


一、ActionBar:(动作栏)
(一)、简介:(扩展TitleBar
        Action bar(动作栏)是一个导航控件,用以代替传统屏幕顶端的标题栏。ActionBar显示在屏幕顶部的控件,它包括了在左边显示的应用的logo图标和右边操作菜单的可见项。类似于windows桌面程序的工具栏。
效果如下图:



1、ActionBar主要功能:
        Action Bar被认为是新版Android系统中最重要的交互元素,在程序运行中一直置于顶部,主要起到的作用在于:
1)突出显示一些重要操作(如“注册”、“登录”、“搜索”等)。将平时隐藏的选项菜单显示成活动项ActionItem。
2)在程序中保持统一的页面导航和切换方式。这种基于Tab的导航方式,可以切换多个Fragment。
3)提供基于下拉的导航菜单
4)使用程序logo,作为返回APP的HOME主页面或向上的导航操作。

2、ActionBar分成四个区域:
  • App Icon:可显示APP的icon,也可用其他图标代替。当软件不在最高级页面时,图标左侧会显示一个左箭头,用户可以通过这个箭头向上导航。
  • 视图切换:(效果如下图)
  • Action Buttons:这个放最重要的软件功能,放不下的按钮就自动进入Action overflow了。
  • Action overflow:不常用的操作项目自动进入Action overflow

【备注:】什么是Action overflow
        对于没有MENU按键的手机,ActionBar会在最后显示一个折叠的图标,点击该图标会显示剩余的选项菜单项。这个折叠的图标功能就是Action overflow。
        Action overflow中存放并不会频繁用到的操作。按照官方网页上的说法,“Overflow图标仅显示在没有MENU硬按键的手机上,而对于有MENU键的手机,
overflow图标是不显示的,当用户点击MENU按键时弹出。”  事实上Google已经敦促手机厂商及软件开发商取消MENU菜单。也就是以前的Menu将不再使用。


(二)、创建ActionBar:

1、XML资源文件中定义menu。同样可以有普通菜单、二级普通菜单、二级可选项菜单。

<item
        android:id="@+id/menu_about"
        android:orderInCategory="2"
        android:showAsAction="never"    【注意:android:showAsAction的属性值有:never、always、ifRoom、withText、collapseActionView
        android:title="关于"/>
 android:showAsAction属性值的解释:
  • never : 不将该MenuItem显示在ActionBar上(是默认值)
  • always  : 总是将该MenuItem显示在ActionBar上
  • ifRoom  : 当AcitonBar位置充裕时将该MenuItem显示在ActionBar上
  • withText  : 将该MenuItem显示在ActionBar上,并显示该菜单项的文本
  • collapseActionView  : 将该ActionView折叠成普通菜单项。最低API=14

多个属性可以同时使用,使用“|”分隔


(三)、启动程序图标导航:(就是让APP的LOGO也变成可以点击的导航图标。)

核心代码如下:
                ActionBar actionBar = this.getActionBar();
                actionBar.setDisplayHomeAsUpEnabled(true);
                actionBar.setHomeButtonEnabled(true);
                actionBar.setDisplayShowHomeEnabled(true);

        @Override
        public boolean onOptionsItemSelected(MenuItem item) {
                switch (item.getItemId()) {
                case android.R.id.home:
                        Intent intent = new Intent(this, MainActivity.class);
                        //将Activity栈中处于MainActivity主页面之上的Activity都弹出。
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); startActivity(intent); break; case R.id.action_search: break; default: return super.onOptionsItemSelected(item); } return true; }

代码解释:

  1. actionBar = getActionBar();    获取ActionBar对象。
  2. actionBar.setDisplayHomeAsUpEnabled(true);      设置是否将LOGO图标转成可点击的按钮,并在图标前添加一个向左的箭头。
  3. actionBar.setHomeButtonEnabled(true);      设置是否将LOGO图标转变成可点击的按钮。
  4. actionBar.setDisplayShowHomeEnabled(true);     设置是否显示LOGO图标。
或者在xml文件中注册activity时指定向上导航的activity

13.png

(四)、ActionBar中添加Action View:
    1、Action的学习要掌握如何将选项菜单显示成Action Item;
    2、要掌握如何启动程序Logo导航;
    3、ActionBar还可以添加Action View。
        调用方式1为:在xml文件中写上android:actionLayout="@layout/布局名"。
        调用方式2为: 在xml文件中写上android:actionViewClass="android.widget.SearchView"。
     4、示例代码:
核心代码如下:
 <item
        android:id="@+id/action_search"
        android:orderInCategory="1"
        android:showAsAction="always"
        android:title="搜索"
        android:icon="@drawable/ic_launcher"
android:actionViewClass="android.widget.SearchView"  //两种写法任选其一android:actionLayout="@layout/search” 
        />

    <item
        android:id="@+id/action_clock"
        android:orderInCategory="2"
        android:showAsAction="always"
        android:title="时钟"
        android:icon="@drawable/ic_launcher"
        android:actionLayout="@layout/clock"
        />

【备注:】以上两个布局文件代码如下:
一、显示搜索的布局文件:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <SearchView
        android:id="@+id/search_main"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" >
    </SearchView>

</LinearLayout>

二、显示时钟的布局文件:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <AnalogClock
        android:id="@+id/analogClock_main"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

</LinearLayout>

searcheview的使用示例代码如下

@Override

publicboolean onCreateOptionsMenu(Menu menu) {

getMenuInflater().inflate(R.menu.main, menu);

//根据item的id通过finditem方法得到menuitem对象

MenuItem menuItem=menu.findItem(R.id.action_search);

//根据menuitem对象得到SearchView对象

//SearchView searchView=(SearchView) MenuItemCompat.getActionView(menuItem);   v4

SearchView searchView=(SearchView) menuItem.getActionView();//api11 

searchView.setInputType(EditorInfo.TYPE_CLASS_TEXT);//指定SearchView获取焦点时弹出的软键盘的类型

searchView.setImeOptions(EditorInfo.IME_ACTION_SEARCH);//指定弹出软键盘enter键的功能

/*

* 当SearchView查询具体的内容时调用的监听

* 查询文本内容改变时回调

*/

searchView.setOnQueryTextListener(new OnQueryTextListener() {

/*

* 当查询的条件提交时回调的方法

*/

@Override

publicboolean onQueryTextSubmit(String query) {

System.out.println("-------提交的查询条件--------"+query);

returntrue;

}

/*当SearchView中的查询的文本改变时回调的方法

* 参数表示 变化的文本字符串

*/

@Override

publicboolean onQueryTextChange(String newText) {

System.out.println("-------查询条件改变的字符串--------"+newText);

returntrue;

}

});

returntrue;

}


actionview使用自定义view的关键代码如下:

@Override

publicboolean onCreateOptionsMenu(Menu menu) {

mMenu=menu;

getMenuInflater().inflate(R.menu.other, menu);

//根据id得到当前自定义布局的menuitem对象

MenuItem menuItem=menu.findItem(R.id.action_cus);

View view=menuItem.getActionView();//得到当前item中的自定义布局view对象

Button button=(Button) view.findViewById(R.id.button1);//根据id得到自定义view中的控件

final EditText editText=(EditText) view.findViewById(R.id.editText1);

button.setOnClickListener(new OnClickListener() {

@Override

publicvoid onClick(View v) {

String edString=editText.getText().toString().trim();

Toast.makeText(OtherActivity.this, edString,Toast.LENGTH_SHORT).show();

}

});

//表示当acticview展开以及收缩时触发的监听事件

menu.findItem(R.id.action_cus).setOnActionExpandListener(new OnActionExpandListener() {

@Override

publicboolean onMenuItemActionExpand(MenuItem item) {

System.out.println("-------------onMenuItemActionExpand");

returntrue;

}

@Override

publicboolean onMenuItemActionCollapse(MenuItem item) {

System.out.println("-------------onMenuItemActionCollapse");

returntrue;

}

});

returnsuper.onCreateOptionsMenu(menu);

}






(五)、ActionBar在窗体底部显示:
在清单配置文件中设置 android:uiOptions属性为: splitActionBarWhenNarrow
可以在application或者activity节点中。
1、核心代码:

<activity
android:name="com.steven.android23.tab5_fragmentactionbartwo.MainActivity"
android:label="@string/app_name"
android:uiOptions="splitActionBarWhenNarrow">



(七)、Action Provider

使用 ShareActionProvider关键代码如下:

  <item

        android:id="@+id/action_shared"

        android:orderInCategory="100"

        android:showAsAction="ifRoom"

        android:actionProviderClass="android.widget.ShareActionProvider"

        android:title="@string/action_settings"/>

<!--

  android:actionProviderClass="android.widget.ShareActionProvider"  表示指定actionbar中的提供操作为分享

—>




@Override

publicboolean onCreateOptionsMenu(Menu menu) {

getMenuInflater().inflate(R.menu.main, menu);

//根据menuitem的指定的id获取menuitem的对象

MenuItem menuItem=menu.findItem(R.id.action_shared);

//获得当前ShareActionProvider的对象

ShareActionProvider shareActionProvider=(ShareActionProvider) menuItem.getActionProvider();

Intent shareIntent=new Intent();

shareIntent.setAction(Intent.ACTION_SEND);//指定动作

shareIntent.setType("image/*");// mimetype  text/*  image/*

shareIntent.putExtra(Intent.EXTRA_TEXT, "分享的数据");

shareActionProvider.setShareIntent(shareIntent);//表示以指定的intent对象启动当前点击的provider中的item

returntrue;

}





自定义Provide关键代码如下:

<item

        android:id="@+id/action_click"

        android:orderInCategory="100"

        android:showAsAction="always"

        android:actionProviderClass="com.qianfeng.actionprovider.MyProvider"

        android:title="@string/action_settings"/>

    <!--

     如果actioprovider中使用的时自定义的内容 

       android:actionProviderClass="自定义actionprovider的包名.类名" 

     —>



publicclass MyProvider extends ActionProvider {

private Context context;

private LayoutInflater layoutInflater;

private View view;

public MyProvider(Context context) {

super(context);

this.context=context;

layoutInflater=LayoutInflater.from(context);

view=layoutInflater.inflate(R.layout.activity_provider, null);

}

/**

* 表示当actionprovider中的view被创建时回调的方法

*/

@Override

public View onCreateActionView() {po

//根据id获取自定义布局中的imageview对象

Button imageView=(Button) view.findViewById(R.id.button);

//当用户点击actionprovider中自定义布局的iamgeview时弹出菜单

imageView.setOnClickListener(new OnClickListener() {

@Override

publicvoid onClick(View v) {

PopupMenu popupMenu=new PopupMenu(context, v);

popupMenu.inflate(R.menu.provider);

popupMenu.show();

}

});

returnview;

}


}




(八)、ActionBar导航

 ActionBar   tabs导航代码如下:
核心代码:

/**

 * tab导航得步骤:

 * 1.获得actionbar对象  通过setNavigationMode方法将导航模式设置为为tabs导航

 * 2.调用actionbaraddtab(Tab tab)方法添加需要导航使用得tab

 * 3.为每个tab通过setTabListener 添加tab状态改变得监听

 *

 */

publicclass MainActivity extends Activity implements TabListener{

private ActionBar actionBar;

@Override

protectedvoid onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

actionBar=getActionBar();//获得actionbar对象

//指定actionbar得导航模式  tab页导航

actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);

Tab tab1=actionBar.newTab();//获取当前选项卡对象

//设置tab得标题 tag标签 以及setTabListener 监听事件   必须设置

tab1.setText("头条").setTag("头条").setTabListener(this);

actionBar.addTab(tab1);

actionBar.addTab(actionBar.newTab().setText("娱乐").setTag("娱乐").setTabListener(this));

actionBar.addTab(actionBar.newTab().setText("军事").setTag("军事").setTabListener(this));

}

//------当选项卡得中tab状态改变时回调得方法  

/*表示当tab被被选中时候回调得方法

* 第一个参数表示 当前被选中得tab对象

* 第二个参数表示 FragmentTransaction对象

*/

@Override

publicvoid onTabSelected(Tab tab, FragmentTransaction ft) {

Fragment fragment=null;

switch (tab.getPosition()) {//获取当前选择得tab得下标

case 0://头条

fragment=new Fragment1();//创建头条得fragment界面

break;

case 1:

fragment=new Fragment2();

break;

case 2:

fragment=new Fragment3();

break;

}

getFragmentManager().beginTransaction().replace(R.id.layoutContent, fragment).commit();

}

/*表示当tab离开选中状态时候回调得方法

* 第一个参数表示 当前离开得tab对象

* 第二个参数表示 FragmentTransaction对象

*/

@Override

publicvoid onTabUnselected(Tab tab, FragmentTransaction ft) {

}

/*表示当tab再次被选中时候回调得方法

* 第一个参数表示 再次选中得tab对象

* 第二个参数表示 FragmentTransaction对象

*/

@Override

publicvoid onTabReselected(Tab tab, FragmentTransaction ft) {

}

}


ActionBar 下拉导航核心代码:

/**

 * actionbar得下拉导航得步骤:

 * 1.获取actionbar对象  通过setNavigationMode设置导航得模式

 * 2.调用actionba得setListNavigationCallbacks方法  传入需要得adapter适配器对象提供下拉数据

 *  重写NavigationListener下拉item被选中时得回调接口方法

 */

publicclass MainActivity extends Activity {

private ActionBar actionBar;

@Override

protectedvoid onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

actionBar=getActionBar();

//设置导航得模式为下拉模式

actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_LIST);

//根据指定得数据源创建adapter适配器对象

SpinnerAdapter spinnerAdapter=ArrayAdapter.createFromResource(MainActivity.this, R.array.news

android.R.layout.simple_list_item_1);

/*

* 设置下拉导航得回调方法

* 第一个参数表示 当前填充下拉导航列表得适配器

* 第二个参数表示  当点击下拉导航中得item时触发得回调接口监听

*/

actionBar.setListNavigationCallbacks(spinnerAdapter, new OnNavigationListener() {

/* 当下拉导航中得某个item被点击时回调得方法

* 第一个参数表示 当前选中某一个item得下标

* 第二个参数表示 当前选中某一个item得id

*/

@Override

publicboolean onNavigationItemSelected(int itemPosition, long itemId) {

Fragment fragment=null;

switch (itemPosition) {

case 0:

fragment=new Fragment1();

break;

case 1:

fragment=new Fragment2();

break;

case 2:

fragment=new Fragment3();

break;

}

getFragmentManager().beginTransaction().replace(R.id.layoutContent, fragment).commit();

returnfalse;

}

});

}

}




(九)、ActionBar保护 现场

1、目的:当横竖屏切换时,会让页面重新加载。在tab模式下,如何记住之前的tab索引呢?需要保护现场。

2、核心代码:

@Override
protectedvoid onSaveInstanceState(Bundle outState) {
Log.i(TAG, "==index:" + getActionBar().getSelectedNavigationIndex());
outState.putInt("tabindex", getActionBar().getSelectedNavigationIndex());
}


@Override
protectedvoid onRestoreInstanceState(Bundle savedInstanceState) {
getActionBar().setSelectedNavigationItem(
savedInstanceState.getInt("tabindex"));
}


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值