时间:2012/11/29
教材:同一本
环境:同一个
一.使用Action Bar
android3和androd4的另一个新特性(除了fragment之外)就是Action bar了。通常在应用的上方,图标和信息一起出现(如下图)。接下来说说怎么使用Action Bar。
![](https://img-my.csdn.net/uploads/201211/29/1354169982_2794.jpg)
(1)显示和隐藏Actcion Bar。
只需要在项目的Manifest中,对想要隐藏Actionbar的活动加上属性:
android:theme=”@android:style/Theme.Holo.NoActionBar”就可以,代码如下:
<activity
android:label=”@string/app_name”
android:name=”.MyActionBarActivity”
android:theme=”@android:style/Theme.Holo.NoActionBar” >
<intent-filter >
<action android:name=”android.intent.action.MAIN” />
<category android:name=”android.intent.category.LAUNCHER” />
</intent-filter>
</activity>
同样,也可以通过代码动态的使Action bar隐藏起来通过用Actionbar类。在活动相应的地方加上代码:
ActionBar actionBar = getActionBar();
actionBar.hide();
//actionBar.show(); //---show it again---
这样就可以动态的隐藏了(注视里面的actionbar.show()是再次显示)。getActionBar是获得当前活动的actionbar对象。随后可以用show或者hide来控制。
(2)往actionbar 里增加item
除了程序的图标和活动的title之外,还可以往actionbar里增加其他item。这些item通常被称为action items 。通常为活动的常用操作。
1.在活动的java文件中重写onCreateOptionsMenu()方法。如果写成下面的样子:
@Override
public boolean onCreateOptionsMenu(Menu menu) {
super.onCreateOptionsMenu(menu);
CreateMenu(menu);
return true;
}
2.然后实现以上的createMenu(menu)方法。(具体实现可以由用户定义)我们定义createMenu如下:
private void CreateMenu(Menu menu)
{
MenuItem mnu1 = menu.add(0, 0, 0, "Item 1");
{
mnu1.setIcon(R.drawable.ic_launcher);
mnu1.setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM);
}
MenuItem mnu2 = menu.add(0, 1, 1, "Item 2");
{
mnu2.setIcon(R.drawable.ic_launcher);
mnu2.setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM);
}
MenuItem mnu3 = menu.add(0, 2, 2, "Item 3");
{
mnu3.setIcon(R.drawable.ic_launcher);
mnu3.setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM);
}
MenuItem mnu4 = menu.add(0, 3, 3, "Item 4");
{
mnu4.setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM);
}
MenuItem mnu5 = menu.add(0, 4, 4, "Item 5");
{
mnu5.setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM);
}
}
在createMenu里面,我们可以通过menu参数(Menu类型)的add方法将MenuItem加入进去。MenuItem对象可以用setIcon参数来设定显示的图标,用setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM)指定只在有空位的时候显示。
3.相应点击MenuItem的动作。
当用户点击了MenuItem的时候,onOptionsItemSelected()就会被调用。用户可以自己实现对应的方法。这里实现如下:
@Override
public boolean onOptionsItemSelected(MenuItem item)
{
return MenuChoice(item);
}
这里的menuitem表示被点击的menuitem对象。可以用这个参数来作对应操作。
4.通过传入的参数来做对应动作。
上面我们的onOptionsItemSelected通过MenuChoice方法(用户自定义)来处理动作,如下:
private boolean MenuChoice(MenuItem item)
{
switch (item.getItemId()) {
case 0:
Toast.makeText(this, "You clicked on Item 1",
Toast.LENGTH_LONG).show();
return true;
case 1:
Toast.makeText(this, "You clicked on Item 2",
Toast.LENGTH_LONG).show();
return true;
case 2:
Toast.makeText(this, "You clicked on Item 3",
Toast.LENGTH_LONG).show();
return true;
case 3:
Toast.makeText(this, "You clicked on Item 4",
Toast.LENGTH_LONG).show();
return true;
case 4:
Toast.makeText(this, "You clicked on Item 5",
Toast.LENGTH_LONG).show();
return true;
}
return false;
}
这里用item的getItemId方法来获得它的id号(在第三步中创建Menuitem时候指定),然后作对应的动作。
这里是用toast来展示一个简短的信息。
(4)自定义MenuItem
用户可以自己定义MenuItem的样式。
1.如果想要同时显示action item 的文本和它的图标,可以在MenuItem.SHOW_AS_ACTION_WITH_TEXT用 “|”来设置。如下:
MenuItem mnu1 = menu.add(0, 0, 0, “Item 1”);
{
mnu1.setIcon(R.drawable.ic_launcher);
mnu1.setShowAsAction(
MenuItem.SHOW_AS_ACTION_IF_ROOM |
MenuItem.SHOW_AS_ACTION_WITH_TEXT);
}
这里的“|MenuItem.SHOW_AS_ACTION_WITH_TEXT”表示文本和图标一起展示出来。
2.应用程序的icon也可以点击(就是Acion Bar 最左边一个图标,不用加上去也存在的那个)。为了使这个icon也是可以点击的,要在活动的onCreate方法中加上:
ActionBar actionBar = getActionBar();
actionBar.setDisplayHomeAsUpEnabled(true);
让这个icon可以点击。
这个AcionBar item 的ID为:android.R.id.home。可以用这个id来获取点击动作:
case android.R.id.home:
Toast.makeText(this,
“You clicked on the Application icon”,
Toast.LENGTH_LONG).show();
return true;
![](https://img-my.csdn.net/uploads/201211/29/1354172745_4353.jpg)
这个动作通常用来返回活动的主活动或者上一级的活动,为了实现这个功能,可以这么做:
case android.R.id.home:
Toast.makeText(this,
“You clicked on the Application icon”,
Toast.LENGTH_LONG).show();
Intent i = new Intent(this, MyActionBarActivity.class);
i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(i);
return true;
这里用Intent来返回上一级的活动,但返回前要先设置i.addFlags(Intent.FlAG_ACTIVITY_CLEAR_TOP)用来清除这个以上的活动。譬如:mainActivity -> nextActivity ->mainAcitivity,如果不清除的话,活动栈里的活动会越来越多,如果清除的话,在这个活动之前的活动都会被清除掉。
二.侦听UI组件的动作
用户和ui组件之间的活动有两个级别--view level和Activity level。在Activitylevel上,组件公开了一些方法可以由程序员去重写。
--onKeyDown--当用户按下按键并且没有一个组件响应的时候触发。
--onKeyUp--当用户松开按键并且没有一个组件响应的时候触发。
--onMenuItemSelected--当某个panel的menu被选中时候触发。
--onMenuOpened--当panel的menu被打开的时候触发。
例如:当你在textview编辑输入文本,当你在这个时候按下方向键下的时候,因为textview没有处理按键下的事件,所以onKeyDown会被调用而且传入KeyEvent为KeyEvent.KEYCODE_DPAD_DOWN。这就是按下按键并且组件没有响应情况。按方向键上的时候同理。如果在一个空的textview中按方向键左键,onKeyDown也会触发。但当在一个已经有text的textview的非最左边,按左键不会触发onKeyDown方法,因为textview已经处理了该事件--光标左移。
public boolean onKeyDown(int keyCode,KeyEvent event)--其中KeyEvent用来辨别是那个按键被按下了。
三,向组件注册动作。
--组件(view)可以触发时间当用户跟他们交互的时候。
(1)可以用组件的setXXXListener来设置组件事件出发时候的侦听类。而该侦听类可以为无名的。
Button btn1 = (Button)findViewById(R.id.btn1);
btn1.setOnClickListener(btnListener);
而匿名类btnListener可以如下定义:
private OnClickListener btnListener = new OnClickListener()
{
public void onClick(View v)
{
Toast.makeText(getBaseContext(),
((Button) v).getText() + “ was clicked”,
Toast.LENGTH_LONG).show();
}
};
注意上面的onClickListener的定义和创建在同一个语句中,并没有另外在别的地方创建多一个类来继承onclicklistener。然后往button处添加这种做法。
(2)除了用匿名类的方法,还可以用匿名内部类的方法来定义侦听类,如下,为textview设置一个OnFocusChangeListener:
EditText txt1 = (EditText)findViewById(R.id.txt1);
txt1.setOnFocusChangeListener(new View.OnFocusChangeListener()
{
@Override
public void onFocusChange(View v, boolean hasFocus) {
Toast.makeText(getBaseContext(),((EditText) v).getId() + “ has focus - “ + hasFocus,
Toast.LENGTH_LONG).show();
}
});
在EditText对象txt1中直接实现再添加一个匿名内部类。如果用这个方法,上面的button的侦听类可以写成:
//---the two buttons are wired to the same event handler---
Button btn1 = (Button)findViewById(R.id.btn1);
//btn1.setOnClickListener(btnListener);
btn1.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
//---do something---
}
});
并不需要再另外创建一个类,而是在内部声明一个。
总结:匿名类在很多个组件共享一个事件处理方法的时候很有用,而匿名内部类在当只是在为一个组件创建事件处理方法的时候比较方便。