为了使ActionBar表现更加丰富,可以对其进行扩展。
这里举了个相关的例子.
例子效果如下
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>