android:id="@+id/red"android:alphabeticShortcut="r"android:title="@string" />
第四章菜单和动作条
1.菜单分类:选项菜单(OptionsMenu)、上下文菜单(ContextMenu)、弹出菜单(PopupMenu)
2.菜单资源:使用XML格式定义菜单资源
P90
3.实现选项菜单
1)修改选项菜单资源文件menu/main.xml
添加菜单子元素
2)在Activity中加载定义好的菜单资源main.xml,实例化
publicboolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
returnsuper.onCreateOptionsMenu(menu);
}
3)响应菜单选项选择事件
@Override
publicboolean onOptionsItemSelected(MenuItem item) {
// TODO Auto-generated method stub
item.setChecked(true);
switch (item.getItemId()) {
case R.id.item1:
item.setChecked(true);
tv.setTextColor(Color.RED);
break;
case R.id.item2:
item.setChecked(true);
tv.setTextColor(Color.GREEN);
break;
case R.id.item3:
item.setChecked(true);
tv.setTextColor(Color.BLUE);
break;
default:
break;
}
returnsuper.onOptionsItemSelected(item);
}
4)最终实现
/////////////////////////////////////////////////////////////////////
4.实现上下文菜单
1)创建上下文菜单XML文件contextmenu.xml
2)为控件对象注册上下文菜单
publicclass MainActivity extends Activity {
private TextView tv;
@Override
protectedvoid onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(https://www.doczj.com/doc/495336527.html,yout.activity_main);
tv = (TextView) findViewById(R.id.text_title);
registerForContextMenu(tv);
注意:因为不是所有的控件都需要上下文菜单,所以只有通过registerForContextMenu(view);方法注册,才可以为该对象view创建对应的上下文菜单。
3)加载获取菜单资源
publicvoid onCreateContextMenu(ContextMenu menu, View v,
ContextMenuInfo menuInfo) {
// TODO Auto-generated method stub
super.onCreateContextMenu(menu, v, menuInfo);
getMenuInflater().inflate(R.menu.context, menu);
menu.setHeaderTitle("请选择背景颜色");
}
4)响应Item选择事件
@Override
publicboolean onContextItemSelected(MenuItem item) {
// TODO Auto-generated method stub
item.setChecked(true);
switch (item.getItemId()) {
case R.id.red:
item.setChecked(true);
tv.setBackgroundColor(Color.RED);
break;
case R.id.green:
item.setChecked(true);
tv.setBackgroundColor(Color.GREEN);
break;
case R.id.blue:
item.setChecked(true);
tv.setBackgroundColor(Color.BLUE);
break;
default:
break;
}
returntrue;
}
5)最终实现
///////////////////////////////////////////////////////////////////// 实现ContextMenu,一般要用到以下三个方法:
(1)registerForContextMenu(getExpandableListView());
(2)onCreateContextMenu(ContextMenu menu, View v,ContextMenuInfomenuInfo);
(3)onContextItemSelected(MenuItem item);
>>ContextMenu和OptionsMenu相比主要有以下区别:
1,ContextMenu必须通过Activity的registerForContextMenu(View)来进行注册,而OptionsMenu不用。
2,ContextMenu不支持icon,而OptionsMenu支持。
3,ContextMenu可以有头,可以通过setHeaderIcon,setHeaderTitle,setHeaderView 来设置头,否则就没有头。
4,弹出的方式不一样。
5,Options Menu的拥有者是Activity,而上下文菜单的拥有者是Activity中的View。每个Activity有且只有一个Options Menu,它为整个Activity服务。而一个Activity往往有多个View,并不是每个View都有上下文菜单,这就需要我们调用
registerForContextMenu(View view)来指定。
////////////////////////////////////////////////////////////////
5.实现弹出菜单(类似上下文菜单)
1)创建弹出菜单XML文件popupmenu.xml
2)创建PopupMenu对象和显示弹出菜单
final Button btn=(Button)findViewById(R.id.new_button);
final PopupMenu popupMenu=new PopupMenu(this, btn);
popupMenu.inflate(R.menu.popupmenu);
btn.setOnClickListener(new View.OnClickListener() {
@Override
publicvoid onClick(View arg0) {
// TODO Auto-generated method stub
popupMenu.show();
}
});
3)菜单选项事件处理(只能通过popupMenu对象监听器实现)
popupMenu.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {
@Override
publicboolean onMenuItemClick(MenuItem arg0) {
// TODO Auto-generated method stub
switch (arg0.getItemId()) {
case R.id.menu_red:
btn.setTextColor(Color.RED);
break;
case R.id.menu_green:
btn.setTextColor(Color.GREEN);
break;
case R.id.menu_blue:
btn.setTextColor(Color.BLUE);
break;
default:
break;
}
returnfalse;
}
});
4)最终实现
/////////////////////////分隔线/2015.10.19///////////////////////////
6.动作条(ActionBar)
Android 3.0之后引入的新的对象,ActionBar可以说是一个方便快捷的导航神器。它可以作为活动的标题,突出活动的一些关键操作(如“搜索”、“创建”、“共享”等)、作为菜单的灵活使用,还可以实现类似TabWidget的标签功能以及下拉导航的功能,系统能够很好根据不同的屏幕配置来适应ActionBar的外观,配合起Fragemtn可谓是十分强大。
那么,对于今天的主角ActionBar怎么去添加?在Android3.0默认主题HloleFraphic(全息)主题中,已经创造了ActionBar,所以只要targetSdkVersion的值不低于11,创建的Activity 中默认都会带有ActionBar。例如:
本周包括以下内容:
1)显示与隐藏ActionBar
2)使用ActionBar显示OptionMenu的菜单项MenuItem
3〉使用程序图标导航
4)添加Action View
/////////////////////////////////////////////////////////////////////////////////////////
1)显示与隐藏ActionBar
方法一:修改AndroidManifest.xml
或者
android:theme="@android:style/Theme.NoTitleBar"/> 方法二:程序运行中修改 在运行时通过调用hide()隐藏Action Bar。自然也有show()。 ActionBar actionBar = getActionBar(); actionBar.hide(); //actionBar.show(); 2)使用ActionBar显示OptionMenu的菜单项MenuItem 问题:有些手机没有Menu按钮,如何弹出OptionMenu? 解决步骤: 1.修改选项菜单文件main.xml 2.将选项菜单资源文件中的每个 3.在Activity类中添加和重写以下方法 publicboolean onCreateOptionsMenu(Menu menu) { // TODO Auto-generated method stub MenuInflaterinflater = new MenuInflater(this); inflater.inflate(R.menu.main, menu); returnsuper.onCreateOptionsMenu(menu); } @Override publicboolean onOptionsItemSelected(MenuItem item) { // TODO Auto-generated method stub switch (item.getItemId()) { case android.R.id.home: //创建启动MainActivity的Intent Intent intent=new Intent(this,MainActivity.class); //添加额外的Flag,将Activity栈中处于MainActivity之上的Activity弹出 intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); startActivity(intent); break; case R.id.item1: Intent intent1=new Intent(this class); startActivity(intent1); break; default: break; } returnsuper.onOptionsItemSelected(item); } 4.运行程序,看效果。 //////////////////////////////////////////////////////// 3)使用程序图标导航 初始化前: 初始化后: 1.在protected void onCreate(Bundle savedInstanceState)方法中添加以下代码,对ActionBar初始化设置: ActionBaractionBar = getActionBar();//获取ActionBar对象 actionBar.setDisplayShowHomeEnabled(true);//显示应用程序图标 actionBar.setDisplayHomeAsUpEnabled(true);//将应用程序图标转变为可点击图标,并添加一个返回箭头。 2.实现点击程序图标后返回到上一个页面(程序图标的ID默认为Android.R.id.home) @Override Publicboolean onOptionsItemSelected(MenuItem item) { // TODO Auto-generated method stub switch (item.getItemId()) { case android.R.id.home: //创建启动MainActivity的Intent Intent intent=new Intent(this,MainActivity.class); //添加额外的Flag,将Activity栈中处于MainActivity之上的Activity弹出 intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); startActivity(intent); break; default: break; } returnsuper.onOptionsItemSelected(item); } 3.实现效果 /////////////////////////////////////////////////////////////////////////////// 4)添加Action View ActionBar除了可以显示普通的ActionItem之外,还可以显示普通的UI控件,如在ActionBar上显示一个时钟。 方法:定义Action Item时使用android:actionLayout="@layout/clock"属性指定ActionView对应的视图布局资源。 步骤: 1.在layout文件夹中新建一个显示时钟的布局文件clock.xml android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> android:id="@+id/analogClock1" android:layout_width="wrap_content" android:layout_height="wrap_content"/> 2.在菜单资源文件main.xml中添加Action Item android:id="@+id/item3" android:actionLayout="@layout/clock" android:showAsAction="always" android:title="时钟"> 3.查看效果 //////////////////////////////分割线2015.10.25////////////////////////////// 第5章发送和接收信息 主要内容: 一、Intent的基本作用 二、Activity之间的跳转 三、使用Intent在Activity之间传递数据的基本方法 回顾: 二、Activity之间跳转 Intent intent=new Intent(); intent.setClass(MainActivity.this, CheckActivity.class); startActivity(intent); MainActivity.this.finish(); 或者: Intent intent1=new Intent(this,help.class); startActivity(intent1); 还可以: startActivity(new Intent(this,help.class)); 1.Intent的基本作用 Intent的介绍 Intent的中文意思是“意图,意向”,在Android中提供了Intent机制来协助应用间的交互与通讯,Intent负责对应用中一次操作的动作、动作涉及数据、附加数据进行描述,Android则根据此Intent的描述,负责找到对应的组件,将 Intent传递给调用的组件,并完成组件的调用。Intent不仅可用于应用 程序之间,也可用于应用程序内部的Activity/Service之间的交互。因此,可以将Intent理解为不同组 件之间通信的“媒介”专门提供组件互相调用的相关信息。 Intent的属性 Intent有以下几个属性: 1.组件(Component) 2.动作(Action) 3.数据(Data) 4.分类(Category) 5.额外信息(Extras) 6.标记(Flags) 其中最常用的是Action属性和Data属性。 2.动作(ACTION) 1)Intent的Action属性 2)测试ACTION_GET_CONTENT获得内容 获取通讯录的内容 步骤:1.布局文件添加按钮控件 2.Activity类中为按钮添加监听 btn.setOnClickListener(new OnClickListener() { @Override publicvoid onClick(View arg0) { // TODO Auto-generated method stub Intent intent=new Intent(); intent.setAction(intent.ACTION_GET_CONTENT); intent.setType("vnd.android.cursor.item/phone");// 设置Intent Type 属性 //主要是获取通讯录的内容 startActivity(intent); } }); } 3)Intent的Data属性 Intent的Data属性是执行动作的URI和MIME类型,不同的Action有不同的Data数据指定。比如:ACTION_EDIT Action应该和要编辑的文档URI Data匹配,ACTION_VIEW应用应该和要显示的URI匹配。 4)Intent的Category属性 intent.setAction(Intent.ACTION_MAIN);// 添加Action属性 intent.addCategory(Intent.CATEGORY_HOME);// 添加Category属性 startActivity(intent);// 启动Activity 5)Intent的Extra属性 Intent的Extra属性是添加一些组件的附加信息。比如,如果我们要通过一个Activity来发送一个Email, 就可以通过Extra属性来添加subject和body。 下面的例子在第一个Activity的EditText输入用户名,该年龄保存在Intent的Extras属性中。当单击 Button时,会在第二个Activity中显示用户名。 步骤: (1)添加一个类SecondActivity.java和相应的布局文件second_layout.xml (2)对MainActivity中的按钮Button3添加监听 btn2.setOnClickListener(new OnClickListener() { @Override publicvoid onClick(View arg0) { // TODO Auto-generated method stub Intent intent = new Intent(); //设置Intent的class属性,跳转到SecondActivity intent.setClass(MainActivity.this, SecondActivity.class); //为intent添加额外的信息 intent.putExtra("useName", et1.getText().toString()); //启动Activity startActivity(intent); } }); (3)在SecondActivity.java中完善代码 //设置当前的Activity的界面布局 setContentView(https://www.doczj.com/doc/495336527.html,yout.second_layout); //获得Intent Intent intent = this.getIntent(); tv1 = (TextView)findViewById(R.id.textView1); //从Intent获得额外信息,设置为TextView的文本 tv1.setText("你的名字是:"+intent.getStringExtra("useName")); (4)在AndroidManifest中注册SecondActivity.java (5)运行看效果 二、通过Intent启动系统应用(P142) ////////////////////////////////2015.11.1分隔线 ////////////////////////////// 回顾: 例子:在第一个Activity 的EditText 输入用户名,该年龄保存在Intent 的Extras 属性中。当单击Button 时,会在第二个Activity 中显示用户名。 图表1第2个Activity 图表2第一个Activity 实现过程: