动态ActionBar

首先介绍一下该应用的主要操作界面
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形式显示。 根据这个例子,我把静态显示部分改成了动态显示。

猜你喜欢

转载自jean7155.iteye.com/blog/1848952