Android Action Bar 示例代码

openkk 12年前
     <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>