为了使ActionBar表现更加丰富,可以对其进行扩展。

 这里举了个相关的例子.


例子效果如下

ActionBar(4) 自定义布局及下拉列表导航_spinner


XML文件如下,定义了一个文本"作业日志",及一个下拉列表.

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center_vertical"
android:orientation="horizontal" >

<TextView
android:id="@+id/action_bar_title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/label_record" />

<!-- 下拉列表 -->
<Spinner
android:id="@+id/action_bar_spinner"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
>
</Spinner>

</LinearLayout>



在代码中将定制的XML,放入ActionBar. 其中特别要注意,下拉列表按件(Spinner)中列表数据填充及事件处理。

在代码中提供了两种填充Spinner的简单方法。在实际中可放入更多的控件和扩展。

public class MainActivity extends ActionBarActivity {

private ActionBar actionBar;
private Spinner mActionbarSpinner;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//得到Bar
actionBar = getSupportActionBar();

//设置标题
actionBar.setTitle("Bar例子");
actionBar.setSubtitle("努力!");

//使自定义的普通View能在title栏显示, actionBar.setCustomView能起作用.
actionBar.setDisplayShowCustomEnabled(true);

//显示虚拟按键
displayVirtualMenuKey();

//下拉列表
initSpinner();
}


@SuppressLint("NewApi") @Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
//添加菜单项
MenuItem findItem = menu.add(0,1,0,"查找");
MenuItem exitItem = menu.add(0,0,0,"退出");

//绑定到ActionBar
findItem.setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM);
exitItem.setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS);

return true;
}

/**
* 初始化下拉列表
*/
private void initSpinner()
{
View actionbarLayout = LayoutInflater.from(this).inflate(R.layout.activity_bar, null);
mActionbarSpinner = (Spinner) actionbarLayout.findViewById(R.id.action_bar_spinner);

//方法一
initSpinnerMethod1();

//方法二
//initSpinnerMethod2();

//事件监听
mActionbarSpinner.setOnItemSelectedListener(new SpinnerItemSelectedListener());

//在Bar上显示定制view
actionBar.setCustomView(actionbarLayout);
}

/**
* 建立数据源 方法一
*/
private void initSpinnerMethod1()
{
String[] mItems = getResources().getStringArray(R.array.spinner_page);
ArrayAdapter<String> spAdapter = new ArrayAdapter<String>
(this,R.layout.support_simple_spinner_dropdown_item,mItems);
mActionbarSpinner.setAdapter(spAdapter);

}

/**
* 建立数据源 方法二
*/
private void initSpinnerMethod2()
{
mActionbarSpinner.setAdapter(
new ArrayAdapter<String>(this,
android.R.layout.simple_expandable_list_item_1,getData()));
}

/**
* 下拉列表数据源
* @return
*/
private List<String> getData(){
List<String> data = new ArrayList<String>();
data.add("A");
data.add("B");
data.add("C");
data.add("D");
return data;
}


/**
* 监听action_bar的spinner item选择事件
*/
private class SpinnerItemSelectedListener implements OnItemSelectedListener {

@Override
public void onItemSelected(AdapterView<?> arg0, View view, int position,long arg3) {
String str= arg0.getItemAtPosition(position).toString();
Toast.makeText(MainActivity.this, "你点击的是:"+str, 2000).show();
}

@Override
public void onNothingSelected(AdapterView<?> arg0) {}
}


/**
* 强制显示虚拟按键
*/
private void displayVirtualMenuKey()
{
//显示虚拟按键即那...点 (4.0后没了菜单键)
try {
getWindow().addFlags(
WindowManager.LayoutParams.class.getField("FLAG_NEEDS_MENU_KEY").getInt(null));
}catch (NoSuchFieldException e) {
// Ignore since this field won't exist in most versions of Android
}catch (IllegalAccessException e) {
Log.w("feelyou.info",
"Could not access FLAG_NEEDS_MENU_KEY in addLegacyOverflowButton()", e);
}
}

}



 下拉菜单文字资源 :res\values\strings.xml


<string name="label_record">作业日志</string>
<string-array name="spinner_page" >
<item>第一页</item>
<item>第二页</item>
<item>第三页</item>
<item>第四页</item>
<item>第五页</item>
</string-array>