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形式显示。 根据这个例子,我把静态显示部分改成了动态显示。