为自己记----android中关于actionbar的一些简单理解

Android ActionBar理解


Action Bar是一种新増的导航栏功能,在Android 3.0之后加入到系统的API当中,它标识了用户


当前操作界面的位置,并提供了额外的用户动作、界面导航等功能。使用ActionBar的好处是,它


可以给提供一种全局统一的UI界面,使得用户在使用任何一款软件时都懂得该如何操作,并且


ActionBar还可以自动适应各种不同大小的屏幕。


actionbar包涵如下区域:


1.App icon 应用的图标,左侧带应用相当于back返回键


2.ViewControl


3.Action button 相当于普通的Button可以监听点击事件


4.Action overflow 三个点,相当于手机上的menu键,可以显示隐藏的action button


一 添加和移除Action Bar


1 添加ActionBar:


在AndroidManifest.xml中指定Application或Activity的theme是Theme.Holo或其子类,


ActionBar默认都是显示出来的。
2 移除ActionBar:
移除的方式有两种 
a:将theme指定成Theme.Holo.NoActionBar,表示使用一个不包含ActionBar的主题
b:在Activity中调用以下方法
ActionBar actionBar = getActionBar();  
actionBar.hide(); 


二 修改Action Bar的图标和标题


修改方式有两种 :


a 在AndroidManifest.xml中修改,如下:


<activity  
    android:name="com.example.actionbartest.MainActivity"
    android:label="今天"    
    android:logo="@drawable/weather" >  
</activity>  


*默认情况下,系统使用的是label和icon


b: 在代码中修改
ActionBar actionBar = getActionBar();
ActionBar .setIcon(getResources().getDrawable(R.drawable.ic_launcher));
或ActionBar.setLogo(getResources().getDrawable(R.drawable.ic_launcher));
ActionBar .setTitle("jiantian");


三 添加Action Button并添加点击事件


当Activity启动的时候,系统会调用Activity的onCreateOptionsMenu()方法来取出所有的


Action按钮,我们只需要在这个方法中去加载一个menu资源,并把所有的Action按钮都定义在资源


文件里面就可以了。


@Override  
public boolean onCreateOptionsMenu(Menu menu) {  
   MenuInflater inflater = getMenuInflater();  
   inflater.inflate(R.menu.main, menu);  
   return super.onCreateOptionsMenu(menu);  
}  




main.xml


<menu xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    tools:context="com.example.testprogram.MainActivity" >


        <item
            android:id="@+id/action_btn_record"
            android:showAsAction="always"
            android:title="@string/action_title_record"/>
        <item 
            android:id="@+id/action_btn_more"
            android:showAsAction="ifRoom"
            android:title="@string/action_title_more">
            <menu>
                <item 
                   android:id="@+id/action_btn_test1"
                   android:showAsAction="never"
            android:title="test1"
                   />
                <item 
                   android:id="@+id/test2"
                   android:showAsAction="never"
            android:title="test2"
                   />
                <item 
                   android:id="@+id/test3"
                   android:showAsAction="never"
            android:title="test3"
                   />
            </menu>
        </item>
</menu>


<item>标签中有一些属性,其中id是该Action按钮的唯一标识符,icon用于指定该按钮的图标,


title用于指定该按钮可能显示的文字(在图标能显示的情况下,通常不会显示文字),


showAsAction则指定了该按钮显示的位置,主要有以下几种值可选:always表示永远显示在


ActionBar中,如果屏幕空间不够则无法显示,ifRoom表示屏幕空间够的情况下显示在ActionBar


中,不够的话就显示在overflow中,never则表示永远显示在overflow中。
但出即使title中的内容无法显示出来,我们也应该给每个item中都指定一个title属性,原因是:
当ActionBar中的剩余空间不足的时候,如果Action按钮指定的showAsAction属性是ifRoom的话,


该Action按钮就会出现在overflow当中,此时就只有title能够显示了。
如果Action按钮在ActionBar中显示,用户可能通过长按该Action按钮的方式来查看到title的内


容。


当用户点击Action按钮的时候,系统会调用Activity的onOptionsItemSelected()方法,通过方法


传入的MenuItem参数,我们可以调用它的getItemId()方法和menu资源中的id进行比较,从而辨别


出用户点击的是哪一个Action按钮,如
public boolean onOptionsItemSelected(MenuItem item) {  
   switch (item.getItemId()) {  
   case R.id.action_btn_record:  
       Toast.makeText(this, "record", Toast.LENGTH_SHORT).show();  
       return true;  
   case R.id.action_btn_more:  
       Toast.makeText(this, "more", Toast.LENGTH_SHORT).show();  
       return true;  
   case R.id.action_btn_test1:  
       Toast.makeText(this, "test1", Toast.LENGTH_SHORT).show();  
       return true;  
   default:  
       return super.onOptionsItemSelected(item);  
   }  
}  


四 添加Action View


ActionView是可以在ActionBar中替换Action Button的控件,最常见的就是SeachView

下面给ActionBar中添加一个SeachView


<item
       android:id="@+id/action_btn_search"
       android:actionViewClass="android.widget.SearchView"
       android:showAsAction="always"
       android:title="@string/action_title_search"/>
如果你还希望在代码中对SearchView的属性进行配置(比如添加监听事件等),完全没有问题,只


需要在onCreateOptionsMenu()方法中获取该ActionView的实例就可以了


  
public boolean onCreateOptionsMenu(Menu menu) {  
   MenuInflater inflater = getMenuInflater();  
   inflater.inflate(R.menu.main, menu);  
   MenuItem searchItem = menu.findItem(R.id.action_btn_search);  
   SearchView searchView = (SearchView) searchItem.getActionView();
   //关于SearchView的用发这里不研究
   return super.onCreateOptionsMenu(menu);  
}  
如果程序希望在ActionView展开和合并的时候显示不同的界面,我们只需要去注册一个ActionView


的监听器就能实现这样的功能,代码如下所示:


@Override  
public boolean onCreateOptionsMenu(Menu menu) {  
    MenuInflater inflater = getMenuInflater();  
    inflater.inflate(R.menu.main, menu);  
    MenuItem searchItem = menu.findItem(R.id.action_search);  
    searchItem.setOnActionExpandListener(new OnActionExpandListener() {  
        @Override  
        public boolean onMenuItemActionExpand(MenuItem item) {  
             
            return true;  
        }  
          
        @Override  
        public boolean onMenuItemActionCollapse(MenuItem item) {  
            
            return true;  
        }  
    });  
    return super.onCreateOptionsMenu(menu);  
}


五 开启ActionBar的导航功能


  1 通过Action Bar图标进行导航


   a :当从一个activity跳转到另一个activity时,我们可以在目的activity调用


setDisplayHomeAsUpEnabled()方法来启用ActionBar图标导航功能
在ActionBar的icon位置会出现一个向左的箭头,通常情况下这都表示返回的意思,因此


最简单的实现就是在它的点击事件里面加入finish()方法就可以了,如下所示:
@Override  
public boolean onOptionsItemSelected(MenuItem item) {  
    switch (item.getItemId()) {  
    case android.R.id.home:  
        finish();  
        return true;  
    
    }  



在这里ActionBar导航和Back键的功能貌似是一样的,但是是有区别的:


标准的ActionBar导航功能是如下实现的
1 在新打开的目的activity中调用setDisplayHomeAsUpEnabled()方法,并传入true。
2 需要在AndroidManifest.xml中配置父具体的Activity,如下所示

3 对android.R.id.home这个事件进行一些特殊处理,如下所示:
@Override  
public boolean onOptionsItemSelected(MenuItem item) {  
    switch (item.getItemId()) {  
    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);  
        }  
        return true;  
        
    }  



那么区别在哪呢?其实 ActionBar导航回退到他的父activity,即配置文件中的,二back键回退到


的activity是同栈中的activity。


2 ActionBar的tab导航,下面是一个tab导航的例子,比较简单


package com.example.testprogram.actionbar;


import android.app.ActionBar;
import android.app.ActionBar.Tab;
import android.app.Activity;
import android.app.Fragment;
import android.app.FragmentTransaction;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Toast;


import com.example.testprogram.R;


/**
 * ActionBar的tab导航模式
 * @author lufeng
 *
 */
public class TestActionBarTableActivity extends Activity{


@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_testactionbar);
        ActionBar bar=getActionBar();
        //设置模式
        bar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
        //添加tab
        addTab(bar);
    }

private ActionBar addTab(ActionBar bar){
bar.addTab(bar.newTab()
                .setText("table1")
                .setTabListener(new TabListener(new TabContentFragment


("table1"))));
bar.addTab(bar.newTab()
                .setText("table2")
                .setTabListener(new TabListener(new TabContentFragment


("table2"))));
bar.addTab(bar.newTab()
                .setText("table3")
                .setTabListener(new TabListener(new TabContentFragment


("table3"))));
bar.addTab(bar.newTab()
                .setText("table4")
                .setTabListener(new TabListener(new TabContentFragment


("table4"))));
return bar;
}

//ActionBar.TabListener的实现类
private class TabListener implements ActionBar.TabListener {

//fragment
        private TabContentFragment mFragment;


        public TabListener(TabContentFragment fragment) {
            mFragment = fragment;
        }


        public void onTabSelected(Tab tab, FragmentTransaction ft) {
            ft.add(R.id.fragment_content, mFragment, mFragment.getText());
        }


        public void onTabUnselected(Tab tab, FragmentTransaction ft) {
            ft.remove(mFragment);
        }


        public void onTabReselected(Tab tab, FragmentTransaction ft) {
            Toast.makeText(TestActionBarTableActivity.this, "Reselected!", 


Toast.LENGTH_SHORT).show();
        }


    }

private class TabContentFragment extends Fragment {
        private String mText;


        public TabContentFragment(String text) {
            mText = text;
        }


        public String getText() {
            return mText;
        }


        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container,
                Bundle savedInstanceState) {
            View fragView = inflater.inflate(R.layout.action_bar_tab_content, 


container, false);

            return fragView;
        }


    }

}



还有一些没有记录到的,向list模式的导航,自定义actionbar等,后续有时间在进行更新

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值