17ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik/* 27ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik * Copyright 2011 The Android Open Source Project 37ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik * 47ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik * Licensed under the Apache License, Version 2.0 (the "License"); 57ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik * you may not use this file except in compliance with the License. 67ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik * You may obtain a copy of the License at 77ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik * 87ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik * http://www.apache.org/licenses/LICENSE-2.0 97ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik * 107ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik * Unless required by applicable law or agreed to in writing, software 117ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik * distributed under the License is distributed on an "AS IS" BASIS, 127ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 137ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik * See the License for the specific language governing permissions and 147ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik * limitations under the License. 157ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik */ 167ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik 177ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurikpackage com.example.android.actionbarcompat; 187ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik 197ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurikimport org.xmlpull.v1.XmlPullParser; 207ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurikimport org.xmlpull.v1.XmlPullParserException; 217ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik 227ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurikimport android.app.Activity; 237ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurikimport android.content.Context; 247ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurikimport android.content.res.XmlResourceParser; 257ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurikimport android.os.Bundle; 267ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurikimport android.view.InflateException; 277ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurikimport android.view.Menu; 287ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurikimport android.view.MenuInflater; 297ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurikimport android.view.MenuItem; 307ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurikimport android.view.View; 317ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurikimport android.view.ViewGroup; 327ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurikimport android.view.Window; 337ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurikimport android.widget.ImageButton; 347ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurikimport android.widget.ImageView; 357ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurikimport android.widget.LinearLayout; 367ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurikimport android.widget.ProgressBar; 377ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurikimport android.widget.TextView; 387ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik 397ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurikimport java.io.IOException; 407ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurikimport java.util.HashSet; 417ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurikimport java.util.Set; 427ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik 437ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik/** 447ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik * A class that implements the action bar pattern for pre-Honeycomb devices. 457ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik */ 467ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurikpublic class ActionBarHelperBase extends ActionBarHelper { 477ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik private static final String MENU_RES_NAMESPACE = "http://schemas.android.com/apk/res/android"; 487ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik private static final String MENU_ATTR_ID = "id"; 497ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik private static final String MENU_ATTR_SHOW_AS_ACTION = "showAsAction"; 507ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik 517ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik protected Set<Integer> mActionItemIds = new HashSet<Integer>(); 527ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik 537ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik protected ActionBarHelperBase(Activity activity) { 547ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik super(activity); 557ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik } 567ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik 577ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik /**{@inheritDoc}*/ 587ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik @Override 597ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik public void onCreate(Bundle savedInstanceState) { 607ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik mActivity.requestWindowFeature(Window.FEATURE_CUSTOM_TITLE); 617ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik } 627ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik 637ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik /**{@inheritDoc}*/ 647ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik @Override 657ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik public void onPostCreate(Bundle savedInstanceState) { 667ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik mActivity.getWindow().setFeatureInt(Window.FEATURE_CUSTOM_TITLE, 677ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik R.layout.actionbar_compat); 687ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik setupActionBar(); 697ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik 707ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik SimpleMenu menu = new SimpleMenu(mActivity); 717ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik mActivity.onCreatePanelMenu(Window.FEATURE_OPTIONS_PANEL, menu); 727ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik mActivity.onPrepareOptionsMenu(menu); 737ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik for (int i = 0; i < menu.size(); i++) { 747ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik MenuItem item = menu.getItem(i); 757ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik if (mActionItemIds.contains(item.getItemId())) { 767ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik addActionItemCompatFromMenuItem(item); 777ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik } 787ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik } 797ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik } 807ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik 817ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik /** 827ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik * Sets up the compatibility action bar with the given title. 837ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik */ 847ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik private void setupActionBar() { 857ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik final ViewGroup actionBarCompat = getActionBarCompat(); 867ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik if (actionBarCompat == null) { 877ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik return; 887ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik } 897ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik 907ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik LinearLayout.LayoutParams springLayoutParams = new LinearLayout.LayoutParams( 917ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik 0, ViewGroup.LayoutParams.FILL_PARENT); 927ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik springLayoutParams.weight = 1; 937ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik 947ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik // Add Home button 957ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik SimpleMenu tempMenu = new SimpleMenu(mActivity); 967ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik SimpleMenuItem homeItem = new SimpleMenuItem( 977ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik tempMenu, android.R.id.home, 0, mActivity.getString(R.string.app_name)); 987ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik homeItem.setIcon(R.drawable.ic_home); 997ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik addActionItemCompatFromMenuItem(homeItem); 1007ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik 1017ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik // Add title text 1027ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik TextView titleText = new TextView(mActivity, null, R.attr.actionbarCompatTitleStyle); 1037ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik titleText.setLayoutParams(springLayoutParams); 1047ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik titleText.setText(mActivity.getTitle()); 1057ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik actionBarCompat.addView(titleText); 1067ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik } 1077ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik 1087ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik /**{@inheritDoc}*/ 1097ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik @Override 1107ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik public void setRefreshActionItemState(boolean refreshing) { 1117ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik View refreshButton = mActivity.findViewById(R.id.actionbar_compat_item_refresh); 1127ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik View refreshIndicator = mActivity.findViewById( 1137ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik R.id.actionbar_compat_item_refresh_progress); 1147ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik 1157ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik if (refreshButton != null) { 1167ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik refreshButton.setVisibility(refreshing ? View.GONE : View.VISIBLE); 1177ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik } 1187ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik if (refreshIndicator != null) { 1197ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik refreshIndicator.setVisibility(refreshing ? View.VISIBLE : View.GONE); 1207ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik } 1217ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik } 1227ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik 1237ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik /** 1247ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik * Action bar helper code to be run in {@link Activity#onCreateOptionsMenu(android.view.Menu)}. 1257ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik * 1267ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik * NOTE: This code will mark on-screen menu items as invisible. 1277ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik */ 1287ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik @Override 1297ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik public boolean onCreateOptionsMenu(Menu menu) { 1307ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik // Hides on-screen action items from the options menu. 1317ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik for (Integer id : mActionItemIds) { 1327ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik menu.findItem(id).setVisible(false); 1337ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik } 1347ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik return true; 1357ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik } 1367ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik 1377ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik /**{@inheritDoc}*/ 1387ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik @Override 1397ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik protected void onTitleChanged(CharSequence title, int color) { 1407ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik TextView titleView = (TextView) mActivity.findViewById(R.id.actionbar_compat_title); 1417ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik if (titleView != null) { 1427ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik titleView.setText(title); 1437ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik } 1447ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik } 1457ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik 1467ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik /** 1477ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik * Returns a {@link android.view.MenuInflater} that can read action bar metadata on 1487ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik * pre-Honeycomb devices. 1497ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik */ 1507ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik public MenuInflater getMenuInflater(MenuInflater superMenuInflater) { 1517ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik return new WrappedMenuInflater(mActivity, superMenuInflater); 1527ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik } 1537ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik 1547ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik /** 1557ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik * Returns the {@link android.view.ViewGroup} for the action bar on phones (compatibility action 1567ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik * bar). Can return null, and will return null on Honeycomb. 1577ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik */ 1587ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik private ViewGroup getActionBarCompat() { 1597ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik return (ViewGroup) mActivity.findViewById(R.id.actionbar_compat); 1607ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik } 1617ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik 1627ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik /** 1637ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik * Adds an action button to the compatibility action bar, using menu information from a {@link 1647ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik * android.view.MenuItem}. If the menu item ID is <code>menu_refresh</code>, the menu item's 1657ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik * state can be changed to show a loading spinner using 1667ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik * {@link com.example.android.actionbarcompat.ActionBarHelperBase#setRefreshActionItemState(boolean)}. 1677ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik */ 1687ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik private View addActionItemCompatFromMenuItem(final MenuItem item) { 1697ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik final int itemId = item.getItemId(); 1707ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik 1717ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik final ViewGroup actionBar = getActionBarCompat(); 1727ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik if (actionBar == null) { 1737ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik return null; 1747ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik } 1757ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik 1767ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik // Create the button 1777ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik ImageButton actionButton = new ImageButton(mActivity, null, 1787ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik itemId == android.R.id.home 1797ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik ? R.attr.actionbarCompatItemHomeStyle 1807ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik : R.attr.actionbarCompatItemStyle); 1817ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik actionButton.setLayoutParams(new ViewGroup.LayoutParams( 1827ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik (int) mActivity.getResources().getDimension( 1837ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik itemId == android.R.id.home 1847ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik ? R.dimen.actionbar_compat_button_home_width 1857ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik : R.dimen.actionbar_compat_button_width), 1867ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik ViewGroup.LayoutParams.FILL_PARENT)); 1877ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik if (itemId == R.id.menu_refresh) { 1887ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik actionButton.setId(R.id.actionbar_compat_item_refresh); 1897ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik } 1907ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik actionButton.setImageDrawable(item.getIcon()); 1917ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik actionButton.setScaleType(ImageView.ScaleType.CENTER); 1927ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik actionButton.setContentDescription(item.getTitle()); 1937ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik actionButton.setOnClickListener(new View.OnClickListener() { 1947ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik public void onClick(View view) { 1957ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik mActivity.onMenuItemSelected(Window.FEATURE_OPTIONS_PANEL, item); 1967ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik } 1977ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik }); 1987ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik 1997ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik actionBar.addView(actionButton); 2007ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik 2017ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik if (item.getItemId() == R.id.menu_refresh) { 2027ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik // Refresh buttons should be stateful, and allow for indeterminate progress indicators, 2037ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik // so add those. 2047ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik ProgressBar indicator = new ProgressBar(mActivity, null, 2057ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik R.attr.actionbarCompatProgressIndicatorStyle); 2067ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik 2077ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik final int buttonWidth = mActivity.getResources().getDimensionPixelSize( 2087ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik R.dimen.actionbar_compat_button_width); 2097ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik final int buttonHeight = mActivity.getResources().getDimensionPixelSize( 2107ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik R.dimen.actionbar_compat_height); 2117ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik final int progressIndicatorWidth = buttonWidth / 2; 2127ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik 2137ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik LinearLayout.LayoutParams indicatorLayoutParams = new LinearLayout.LayoutParams( 2147ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik progressIndicatorWidth, progressIndicatorWidth); 2157ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik indicatorLayoutParams.setMargins( 2167ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik (buttonWidth - progressIndicatorWidth) / 2, 2177ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik (buttonHeight - progressIndicatorWidth) / 2, 2187ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik (buttonWidth - progressIndicatorWidth) / 2, 2197ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik 0); 2207ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik indicator.setLayoutParams(indicatorLayoutParams); 2217ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik indicator.setVisibility(View.GONE); 2227ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik indicator.setId(R.id.actionbar_compat_item_refresh_progress); 2237ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik actionBar.addView(indicator); 2247ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik } 2257ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik 2267ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik return actionButton; 2277ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik } 2287ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik 2297ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik /** 2307ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik * A {@link android.view.MenuInflater} that reads action bar metadata. 2317ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik */ 2327ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik private class WrappedMenuInflater extends MenuInflater { 2337ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik MenuInflater mInflater; 2347ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik 2357ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik public WrappedMenuInflater(Context context, MenuInflater inflater) { 2367ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik super(context); 2377ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik mInflater = inflater; 2387ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik } 2397ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik 2407ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik @Override 2417ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik public void inflate(int menuRes, Menu menu) { 2427ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik loadActionBarMetadata(menuRes); 2437ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik mInflater.inflate(menuRes, menu); 2447ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik } 2457ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik 2467ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik /** 2477ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik * Loads action bar metadata from a menu resource, storing a list of menu item IDs that 2487ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik * should be shown on-screen (i.e. those with showAsAction set to always or ifRoom). 2497ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik * @param menuResId 2507ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik */ 2517ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik private void loadActionBarMetadata(int menuResId) { 2527ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik XmlResourceParser parser = null; 2537ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik try { 2547ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik parser = mActivity.getResources().getXml(menuResId); 2557ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik 2567ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik int eventType = parser.getEventType(); 2577ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik int itemId; 2587ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik int showAsAction; 2597ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik 2607ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik boolean eof = false; 2617ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik while (!eof) { 2627ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik switch (eventType) { 2637ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik case XmlPullParser.START_TAG: 2647ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik if (!parser.getName().equals("item")) { 2657ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik break; 2667ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik } 2677ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik 2687ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik itemId = parser.getAttributeResourceValue(MENU_RES_NAMESPACE, 2697ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik MENU_ATTR_ID, 0); 2707ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik if (itemId == 0) { 2717ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik break; 2727ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik } 2737ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik 2747ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik showAsAction = parser.getAttributeIntValue(MENU_RES_NAMESPACE, 2757ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik MENU_ATTR_SHOW_AS_ACTION, -1); 2767ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik if (showAsAction == MenuItem.SHOW_AS_ACTION_ALWAYS || 2777ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik showAsAction == MenuItem.SHOW_AS_ACTION_IF_ROOM) { 2787ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik mActionItemIds.add(itemId); 2797ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik } 2807ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik break; 2817ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik 2827ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik case XmlPullParser.END_DOCUMENT: 2837ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik eof = true; 2847ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik break; 2857ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik } 2867ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik 2877ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik eventType = parser.next(); 2887ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik } 2897ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik } catch (XmlPullParserException e) { 2907ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik throw new InflateException("Error inflating menu XML", e); 2917ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik } catch (IOException e) { 2927ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik throw new InflateException("Error inflating menu XML", e); 2937ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik } finally { 2947ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik if (parser != null) { 2957ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik parser.close(); 2967ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik } 2977ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik } 2987ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik } 2997ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik 3007ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik } 3017ee7d6d5d6efee92f7d13212fa5883ecf58b79a3Roman Nurik} 302