android - icono - AppCompat v7: 21 ¿Barra de acciones dividida rota?
custom action bar android (3)
La barra de herramientas debe ser utilizada. En su caso, es una barra de herramientas en la parte superior y una en la parte inferior. Verifique el blog del equipo de Android, tienen una buena guía de integración.
Actualmente estoy desarrollando una aplicación en la que utilizo una barra de acción dividida altamente modificada. Aquí hay un enlace al estado actual de la aplicación:
Verás una barra de acción transparente en la parte superior, con una vista personalizada inflada en ella, con una barra de acción dividida hackeada en la parte inferior. La vista inferior es en realidad un elemento de acción único con una vista personalizada inflada en él y showAlways = verdadero.
Actualmente solo apoyo SDK v15 + y realmente no planeo cambiar eso, pero con la biblioteca Lollipop AppCompat que acabo de lanzar, decidí implementarlo, para poder obtener algo de esa genialidad en mi aplicación.
Cambié mi tema a Theme.AppCompat.Light, y mi MainActivity ahora amplía ActionBarActivity en lugar de Activity.
Todas las referencias a getActionBar ahora se han cambiado a getSupportActionBar, y con solo esos cambios, así es como se ve ahora mi actividad:
Notarás que obtuve un volcado de IU del Monitor del dispositivo, y está empujando la barra de acción inferior a un espacio extraño y llamando a la barra de acción, y eliminando mi vista personalizada superior.
Aquí está mi código para configurar mi barra de acción:
public void initializeActionBar(){
View customNav = LayoutInflater.from(this).inflate(R.layout.action_bar_top, null);
actionBar = getSupportActionBar();
actionBar.setBackgroundDrawable(getResources().getDrawable(R.drawable.transparent_fifty_percent));
final PopupWindow window = addPopupWindow();
actionBarOptions = (ImageView)customNav.findViewById(R.id.options);
actionBarOptions.setVisibility(View.GONE);
actionBarOptions.setImageDrawable(app.svgToBitmapDrawable(getResources(), R.raw.vertical_ellipsis, app.scaleByDensity(48)));
actionBarOptions.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
window.showAsDropDown(actionBarOptions, 0, 0);
}
});
TextView title = (TextView) customNav.findViewById(R.id.screen_title);
Typeface font1 = Typeface.createFromAsset(getAssets(), "Merriweather-Italic.ttf");
title.setText("Parsley");
title.setTypeface(font1);
actionBar.setCustomView(customNav);
actionBar.setDisplayShowCustomEnabled(true);
actionBar.setDisplayShowTitleEnabled(false);
actionBar.setDisplayShowHomeEnabled(false);
actionBar.setDisplayUseLogoEnabled(false);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
new MenuInflater(this).inflate(R.menu.test, menu);
LinearLayout fullMenu = (LinearLayout) menu.findItem(R.id.full_menu).getActionView();
ViewGroup.LayoutParams params;
icon1 = (ImageView) fullMenu.findViewById(R.id.action_item1);
params = icon1.getLayoutParams();
params.width = getResources().getDisplayMetrics().widthPixels / 4;
params.height = (int) (48 * getResources().getDisplayMetrics().density);
icon1.setImageDrawable(app.svgToBitmapDrawable(getResources(), R.raw.shopping_list_icon, app.scaleByDensity(32)));
icon2 = (ImageView) fullMenu.findViewById(R.id.action_item2);
icon3 = (ImageView) fullMenu.findViewById(R.id.action_item3);
icon4 = (ImageView) fullMenu.findViewById(R.id.action_item4);
icon2.setImageDrawable(app.svgToBitmapDrawable(getResources(), R.raw.recipe_box_icon, app.scaleByDensity(32)));
icon3.setImageDrawable(app.svgToBitmapDrawable(getResources(), R.raw.icon_search, app.scaleByDensity(32)));
icon4.setImageDrawable(app.svgToBitmapDrawable(getResources(), R.raw.icon_add, app.scaleByDensity(32)));
params = icon2.getLayoutParams();
params.width = getResources().getDisplayMetrics().widthPixels / 4;
params.height = (int) (48 * getResources().getDisplayMetrics().density);
params = icon3.getLayoutParams();
params.width = getResources().getDisplayMetrics().widthPixels / 4;
params.height = (int) (48 * getResources().getDisplayMetrics().density);
params = icon4.getLayoutParams();
params.width = getResources().getDisplayMetrics().widthPixels / 4;
params.height = (int) (48 * getResources().getDisplayMetrics().density);
if (!firstLoad) {
setBottomActionBarActive();
setActiveTab(0);
}
optionsLoaded = true;
return true;
}
initializeActionBar () se llama desde onCreate en mi actividad. ¿Alguna idea de lo que estoy haciendo mal?
Si bien la solución de user482277 puede funcionar para instancias con una barra de acción dividida más tradicional, utilizando elementos de acción, un cajón de navegación, etc., no funcionó para mí. Lo que terminé haciendo fue construir un par de vistas personalizadas (compuestas realmente) para emular las barras de acción superior e inferior. Encontré que esta situación funciona mucho mejor, especialmente con compatibilidad hacia atrás. No tengo que preocuparme por las versiones anteriores que admiten la barra de acciones, porque al final del día, solo se trata de un par de clases que amplían LinearLayout. Además, no tengo que preocuparme por los diferentes tamaños de pantalla (especialmente las tabletas) que no admiten la versión dividida.
Si solo quieres recuperar tu barra de acción inferior, simplemente puedes volver a appcompat v7: 20, y funciona para mí. El problema es que la barra de acción dividida ya no se admite en appcomat v7: 21.