首先介绍一下该应用的主要操作界面
1. ProvinceLayout.java: 主操作界面
2. ProvinceListFragment.java: 列表界面
界面元素的操作:
在“主操作界面”中,包含一个动态加载的ActionBar,以Spinner形式显示。 点击Spinner中的任何一个元素,在“列表界面”中动态显示该元素的子元素列表。
xml文件配置
layout/province_onepane.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<!-- ProvinceListFragment的配置-->
<fragment android:id="@+id/headlines"
android:layout_height="fill_parent"
android:name="cn.com.demo.android.activity.ProvinceListFragment"
android:layout_width="match_parent" />
</LinearLayout>
java源码中对ActionBar的操作
1. 创建一个ActionBar的listener
CompatActionBarNavListener.java,接口文件,设置点击ActionBar中的某项时应该自定义的操作。
package cn.com.demo.example;
public interface CompatActionBarNavListener {
public void onCategorySelected(int catIndex);
}
2. 创建一个ActionBar监听的起始类
package cn.com.demo.example;
import android.app.ActionBar.OnNavigationListener;
import android.app.ActionBar.Tab;
import android.app.ActionBar.TabListener;
import android.app.FragmentTransaction;
public class CompatActionBarNavHandler implements TabListener, OnNavigationListener {
// The listener that we notify of navigation events
CompatActionBarNavListener mNavListener;
/**
* Constructs an instance with the given listener.
*
* @param listener the listener to notify when a navigation event occurs.
*/
public CompatActionBarNavHandler(CompatActionBarNavListener listener) {
mNavListener = listener;
}
/**
* Called by framework when a tab is selected.
*
* This will cause a navigation event to be delivered to the configured listener.
*/
@Override
public void onTabSelected(Tab tab, FragmentTransaction ft) {
// TODO Auto-generated method stub
mNavListener.onCategorySelected(tab.getPosition());
}
/**
* Called by framework when a item on the navigation menu is selected.
*
* This will cause a navigation event to be delivered to the configured listener.
*/
@Override
public boolean onNavigationItemSelected(int itemPosition, long itemId) {
mNavListener.onCategorySelected(itemPosition);
return true;
}
/**
* Called by framework when a tab is re-selected. That is, it was already selected and is
* tapped on again. This is not used in our app.
*/
@Override
public void onTabReselected(Tab tab, FragmentTransaction ft) {
// we don't care
}
/**
* Called by framework when a tab is unselected. Not used in our app.
*/
@Override
public void onTabUnselected(Tab tab, FragmentTransaction ft) {
// we don't care
}
}
3. 在ProvinceLayout.java中设置ActionBar,并调用监听的方法
public class ProvinceLayout extends Activity
implements CompatActionBarNavListener{
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.province_layout);
。。。。。。
// 设置动态的ActionBar
setUpActionBar(mIsDualPane);
}
void setUpActionBar(boolean showTabs) {
if (Build.VERSION.SDK_INT < 11) {
return;
}
categories = s.getListCursorByLevel(getContentResolver(), 0);
android.app.ActionBar actionBar = getActionBar();
actionBar.setDisplayShowTitleEnabled(false);
CompatActionBarNavHandler handler = new CompatActionBarNavHandler(this);
actionBar.setNavigationMode(android.app.ActionBar.NAVIGATION_MODE_LIST);
SpinnerAdapter adapter = new SimpleCursorAdapter(
this, android.R.layout.simple_spinner_item,
categories,
new String[] {AreaSQLiteHelper.COLUMN_NAMES},
new int[] {android.R.id.text1}
);
actionBar.setListNavigationCallbacks(adapter, handler);
actionBar.setDisplayUseLogoEnabled(true);
}
......
// 实现监听中的方法
@Override
public void onCategorySelected(int catIndex) {
setCategory(catIndex, 0);
}
void setCategory(int index, long id) {
// 找到ProvinceListFragment, 调用该list的方法刷新列表
mHeadlinesFragment = (ProvinceListFragment) getFragmentManager().findFragmentById(R.id.headlines);
mHeadlinesFragment.list(index);
}
}
附件中的例子是一个很详细的介绍如何使用ActionBar的实例,可以Tab形式显示,也可以List形式显示。 根据这个例子,我把静态显示部分改成了动态显示。