Android开发实践 界面编程(下)

本篇将开始Android开发实践 界面编程(下)的旅程。


1.ActionBar(活动条)


ActionBar是Android3.0的重要更新之一,ActionBar提供了如下功能:

        显示选项菜单的菜单项(将菜单项显示成Action Item);

        使用App图标作为返回Home主屏或向上的导航操作;

        提供交互式View作为Action View;

        提供基于Tab的导航方式,可用于切换多个Fragment;

        提供基于下拉的导航方式。


1)显示隐藏ActionBar

ActionBar actionBar = getActionBar(); // 只有当主题没有关闭ActionBar时,该代码才能返回ActionBar
actionBar.show(); // 显示ActionBar
actionBar.hide(); // 隐藏ActionBar

2)使用ActionBar显示菜单选项

ActionBar可以将选项菜单显示成Action Item,从Android3.0开始MenuItem新增了setShowAsAction(int actionEnum)方法,该方法设置是否将菜单项作为ActionItem显示在ActionBar上,该方法支持如下参数值:

SHOW_AS_ACTION_NEVER		不将该MenuItem显示在ActionBar上
SHOW_AS_ACTION_IF_ROOM		当ActionBar位置足够时才显示MenuItem
SHOW_AS_ACTION_ALWAYS		总是将该MenuItem显示在ActionBar上
SHOW_AS_ACTION_WITH_TEXT	将该MenuItem显示在ActionBar上,并显示该菜单项的文本
SHOW_AS_ACTION_COLLAPSE_ACTION_VIEW		将该Action View折叠成普通菜单项
在实际项目中推荐使用XML资源文件来定义菜单
android:showAsAction=""
下来我们简单使用ActionBar实现仿微信弹出式菜单
ActionItemTest.java

public class ActionItemTest extends Activity {
	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);
	}
	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		MenuInflater inflator = new MenuInflater(this);
		// 状态R.menu.context对应的菜单,并添加到menu中
		inflator.inflate(R.menu.my_menu, menu);
		return super.onCreateOptionsMenu(menu);
	}
	@Override
	/**
	 * 选项菜单的菜单项被单击后的回调方法
	 */
	public boolean onOptionsItemSelected(MenuItem mi) {
		if(mi.isCheckable()) {
			mi.setChecked(true); 
		}
		// 判断单击的是哪个菜单项,并针对性的作出响应
		switch (mi.getItemId()) {
			case R.id.item1:
				Toast.makeText(getApplicationContext(), "您单击了发起群聊", 0).show();
				mi.setChecked(true);break;
			case R.id.item2:
				mi.setChecked(true);break;
			case R.id.item3:
				mi.setChecked(true);break;
			case R.id.item4:
				mi.setChecked(true);break;
			case R.id.plain_item:
				Toast.makeText(getApplicationContext(), "您单击了普通菜单项", 0).show();break;
		}
		return true;
	}
}

其中res/menu/my_menu.xml

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
	<!-- 定义一个普通菜单项 -->
	<item android:id="@+id/plain_item" android:showAsAction="always|withText" android:title="@string/plain_item"></item>
	<item android:title="点击我" android:showAsAction="always" >
		<menu>
			<!-- 定义一组允许复选的菜单项 -->
			<group>
				<!-- 定义3个菜单项 -->
				<item	android:id="@+id/item1" 
					android:title="发起群聊"/>
				<item	android:id="@+id/item2"
					android:title="添加朋友"/>
				<item	android:id="@+id/item3"
					android:title="扫一扫"/>	
				<item	android:id="@+id/item4"
					android:title="收付款"/>						
			</group>
		</menu>
	</item>		
</menu>

styles.xml如下
<resources>  
    <!-- Application theme. -->  
    <style name="AppTheme" parent="android:Theme.Holo.Light.DarkActionBar"></style>  
</resources>  
运行后效果图如下:

Android开发实践 界面编程(下)_第1张图片

3)将应用程序图标设置可以点击并实现返回功能

首先在onCreate方法中为ActionBar设置属性,然后在回调方法onOptionsItemSelected中实现返回功能,代码如下:

public class ActionHomeTest extends Activity {
	ActionBar actionBar;
	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);
		actionBar = getActionBar();
		actionBar.setDisplayShowHomeEnabled(true); // 设置是否显示应用程序图标
		actionBar.setHomeButtonEnabled(true); // 将应用程序图标设置为可点击的按钮
		actionBar.setDisplayHomeAsUpEnabled(true); // 将应用程序图标设置为可点击的按钮,并在图标上添加向左箭头
	}
	@Override
	// 选项菜单的菜单项被单击后的回调方法
	public boolean onOptionsItemSelected(MenuItem mi) {
		if(mi.isCheckable()) {
			mi.setChecked(true);
		}
		// 判断单击的是哪个菜单项,并针对性的作出响应。
		switch (mi.getItemId()) {
			case android.R.id.home:
				// 创建启动FirstActivity的Intent
				Intent intent = new Intent(this, MainActivity.class);
				// 添加额外的Flag,将Activity栈中处于FirstActivity之上的Activity弹出
				intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
				// 启动intent对应的Activity
				startActivity(intent);
				break;
		}
		return true;
	}
}

4)添加Action View

ActionBar上除了可以显示普通的Action Item之外,还可以通过添加Action View显示普通的UI组件,两种添加方式如下:

        定义Action Item时使用android:actionViewClass属性指定Action View的实现类;

        定义Action Item时使用android:actionLayout属性指定Action View对应的视图资源。

ActionViewTest.java

public class ActionViewTest extends Activity {
	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);
	}
	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		getMenuInflater().inflate(R.menu.main, menu);
		return true;
	}
}
res\menu\main.xml
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android" >
    <item
        android:id="@+id/search"
        android:actionViewClass="android.widget.SearchView"
        android:orderInCategory="100"
        android:showAsAction="always"
        android:title="@string/menu_settings"/>
    <item
        android:id="@+id/progress"
        android:actionLayout="@layout/clock"
        android:orderInCategory="100"
        android:showAsAction="always"
        android:title="@string/menu_settings"/>
</menu>
res\layout\clock.xml
<?xml version="1.0" encoding="utf-8"?>
<AnalogClock xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content" />

注意:ActionBar的标题可在AndroidManifest.xml中自定义,如下

<activity android:name=".ActionViewTest"
	android:label="自定义标题">
</activity>
效果图如下:


5)使用ActionBar结合Fragment实现Tab导航

实现思路如下:

先调用ActionBar的setNavigationMode(ActionBar.NAVIGATION_MODE_TABS)方法设置使用Tab导航方式;然后调用ActionBar的addTab()方法添加多个Tab标签,并为每个Tab标签添加事件监听器。实际开发ActionBar通常会结合Fragment来实现Tab导航。

具体实现请点击下面链接下载该项目源码查看。

效果图:

Android开发实践 界面编程(下)_第2张图片


项目源码,点击下载


2.其他UI组件


Toast(吐司)、CalendarView(日历视图)、DataPicker(日期选择器)、TimePicker(时间选择器)、NumberPicker(数值选择器)、SearchView(搜索框)、TabHost(选项卡)、ScrollView(滚动视图)、Notification(显示在手机状态栏的通知)


你可能感兴趣的:(android,界面编程)