Android Action Bar 示例代码
openkk
13年前
<p>今天一起来看下Android Action Bar的示例代码,我们通过活动栏做一个简单选项菜单。下面这个例子将演示ActionBar.NAVIGATION_MODE_STANDARD、 ActionBar.NAVIGATION_MODE_TABS和 : ActionBar.NAVIGATION_MODE_STANDARD等模式的效果。最后仍然要提示大家Action Bar是Android 3.0 honeycomb才开始有的特性,老版本的SDK和固件无法使用。</p> <pre class="brush:java; toolbar: true; auto-links: false;">public class ActionBarDisplayOptions extends Activity implements View.OnClickListener, ActionBar.TabListener { private View mCustomView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.action_bar_display_options); findViewById(R.id.toggle_home_as_up).setOnClickListener(this); findViewById(R.id.toggle_show_home).setOnClickListener(this); findViewById(R.id.toggle_use_logo).setOnClickListener(this); findViewById(R.id.toggle_show_title).setOnClickListener(this); findViewById(R.id.toggle_show_custom).setOnClickListener(this); findViewById(R.id.toggle_navigation).setOnClickListener(this); findViewById(R.id.cycle_custom_gravity).setOnClickListener(this); mCustomView = getLayoutInflater().inflate(R.layout.action_bar_display_options_custom, null); final ActionBar bar = getActionBar(); bar.setCustomView(mCustomView, new ActionBar.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT)); bar.addTab(bar.newTab().setText("Tab 1").setTabListener(this)); bar.addTab(bar.newTab().setText("Tab 2").setTabListener(this)); bar.addTab(bar.newTab().setText("Tab 3").setTabListener(this)); } @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.display_options_actions, menu); return true; } public void onClick(View v) { final ActionBar bar = getActionBar(); int flags = 0; switch (v.getId()) { case R.id.toggle_home_as_up: flags = ActionBar.DISPLAY_HOME_AS_UP; break; case R.id.toggle_show_home: flags = ActionBar.DISPLAY_SHOW_HOME; break; case R.id.toggle_use_logo: flags = ActionBar.DISPLAY_USE_LOGO; break; case R.id.toggle_show_title: flags = ActionBar.DISPLAY_SHOW_TITLE; break; case R.id.toggle_show_custom: flags = ActionBar.DISPLAY_SHOW_CUSTOM; break; case R.id.toggle_navigation: bar.setNavigationMode( bar.getNavigationMode() == ActionBar.NAVIGATION_MODE_STANDARD ? ActionBar.NAVIGATION_MODE_TABS : ActionBar.NAVIGATION_MODE_STANDARD); return; case R.id.cycle_custom_gravity: ActionBar.LayoutParams lp = (ActionBar.LayoutParams) mCustomView.getLayoutParams(); int newGravity = 0; switch (lp.gravity & Gravity.HORIZONTAL_GRAVITY_MASK) { case Gravity.LEFT: newGravity = Gravity.CENTER_HORIZONTAL; break; case Gravity.CENTER_HORIZONTAL: newGravity = Gravity.RIGHT; break; case Gravity.RIGHT: newGravity = Gravity.LEFT; break; } lp.gravity = lp.gravity & ~Gravity.HORIZONTAL_GRAVITY_MASK | newGravity; bar.setCustomView(mCustomView, lp); return; } int change = bar.getDisplayOptions() ^ flags; bar.setDisplayOptions(change, flags); } public void onTabSelected(Tab tab, FragmentTransaction ft) { } public void onTabUnselected(Tab tab, FragmentTransaction ft) { } public void onTabReselected(Tab tab, FragmentTransaction ft) { } }</pre> <p></p> <p>接下来是文中涉及的3个xml布局文件:</p> <p>相关的XML布局action_bar_display_options.xml代码为</p> <pre class="brush:xml; toolbar: true; auto-links: false;"><?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:orientation="vertical"> <Button android:id="@+id/toggle_home_as_up" ; android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/toggle_home_as_up" ;/> <Button android:id="@+id/toggle_show_home" ; android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/toggle_show_home" ;/> <Button android:id="@+id/toggle_use_logo" ; android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/toggle_use_logo" ;/> <Button android:id="@+id/toggle_show_title" ; android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/toggle_show_title" ;/> <Button android:id="@+id/toggle_show_custom" ; android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/toggle_show_custom" ;/> <Button android:id="@+id/toggle_navigation" ; android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/toggle_navigation" ;/> <Button android:id="@+id/cycle_custom_gravity" ; android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/cycle_custom_gravity" ;/> </LinearLayout></pre> <p></p> <p>相关的自定义布局文件action_bar_display_options_custom.xml代码为</p> <pre class="brush:xml; toolbar: true; auto-links: false;"><?xml version="1.0" encoding="utf-8"?> <Button xmlns:android="http://schemas.android.com/apk/res/android" android:text="@string/display_options_custom_button" ;/></pre> <p></p> <p>相关的menu布局xml文件display_options_actions.xml代码为</p> <pre class="brush:xml; toolbar: true; auto-links: false;"><?xml version="1.0" encoding="utf-8"?> <menu xmlns:android="http://schemas.android.com/apk/res/android"> <item android:id="@+id/simple_item" ; android:title="@string/display_options_menu_item" ;/> </menu></pre> <p></p> <p>上面的string后的元素大家可以根据自己的情况进行替换。</p> <p>ActionBar相关的示例代码第二部分分为两种,作为Android 3.0的重要特性我们直接看代码:</p> <p>一、使用菜单资源构造</p> <pre class="brush:java; toolbar: true; auto-links: false;">public class ActionBarMechanics extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); getWindow().requestFeature(Window.FEATURE_ACTION_BAR); } @Override public boolean onCreateOptionsMenu(Menu menu) { menu.add("Normal item"); MenuItem actionItem = menu.add("Action Button"); actionItem.setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM); actionItem.setIcon(android.R.drawable.ic_menu_share); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { Toast.makeText(this, "Selected Item: " + item.getTitle(), Toast.LENGTH_SHORT).show(); return true; } }</pre> <p></p> <p>二、作为Tab切换Fragment</p> <pre class="brush:java; toolbar: true; auto-links: false;">public class ActionBarTabs extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.action_bar_tabs); } public void onAddTab(View v) { final ActionBar bar = getActionBar(); final int tabCount = bar.getTabCount(); final String text = "Tab " + tabCount; bar.addTab(bar.newTab() .setText(text) .setTabListener(new TabListener(new TabContentFragment(text)))); } public void onRemoveTab(View v) { final ActionBar bar = getActionBar(); bar.removeTabAt(bar.getTabCount() - 1); } public void onToggleTabs(View v) { final ActionBar bar = getActionBar(); if (bar.getNavigationMode() == ActionBar.NAVIGATION_MODE_TABS) { bar.setNavigationMode(ActionBar.NAVIGATION_MODE_STANDARD); bar.setDisplayOptions(ActionBar.DISPLAY_SHOW_TITLE, ActionBar.DISPLAY_SHOW_TITLE); } else { bar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS); bar.setDisplayOptions(0, ActionBar.DISPLAY_SHOW_TITLE); } } public void onRemoveAllTabs(View v) { getActionBar().removeAllTabs(); } private class TabListener implements ActionBar.TabListener { private TabContentFragment mFragment; public TabListener(TabContentFragment fragment) { mFragment = fragment; } public void onTabSelected(Tab tab, FragmentTransaction ft) { ft.add(R.id.fragment_content, mFragment, mFragment.getText()); } public void onTabUnselected(Tab tab, FragmentTransaction ft) { ft.remove(mFragment); } public void onTabReselected(Tab tab, FragmentTransaction ft) { Toast.makeText(ActionBarTabs.this, "Reselected!", Toast.LENGTH_SHORT).show(); } } private class TabContentFragment extends Fragment { private String mText; public TabContentFragment(String text) { mText = text; } public String getText() { return mText; } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View fragView = inflater.inflate(R.layout.action_bar_tab_content, container, false); TextView text = (TextView) fragView.findViewById(R.id.text); text.setText(mText); return fragView; } } }</pre> <p></p> <p>涉及的布局文件action_bar_tabs.xml代码为</p> <pre class="brush:xml; toolbar: true; auto-links: false;"><?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:orientation="vertical"> <FrameLayout android:id="@+id/fragment_content" ; android:layout_width="match_parent" android:layout_height="0dip" android:layout_weight="1" /> <LinearLayout android:layout_width="match_parent" android:layout_height="0dip" android:layout_weight="1" android:orientation="vertical"> <Button android:id="@+id/btn_add_tab" ; android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/btn_add_tab" ; android:onClick="onAddTab" /> <Button android:id="@+id/btn_remove_tab" ; android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/btn_remove_tab" ; android:onClick="onRemoveTab" /> <Button android:id="@+id/btn_toggle_tabs" ; android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/btn_toggle_tabs" ; android:onClick="onToggleTabs" /> <Button android:id="@+id/btn_remove_all_tabs" ; android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/btn_remove_all_tabs" ; android:onClick="onRemoveAllTabs" /> </LinearLayout> </LinearLayout></pre> <p></p> <p>涉及布局文件action_bar_tab_content.xml的代码为</p> <pre class="brush:xml; toolbar: true; auto-links: false;"><?xml version="1.0" encoding="utf-8"?> <TextView xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/text" ; android:layout_width="wrap_content" android:layout_height="wrap_content" /></pre>