icono - ¿Cómo personalizar Android ActionBar para mostrar una vista personalizada antes de las pestañas?
tabs android studio example (7)
¿Estás haciendo una aplicación para la tableta? Por lo que yo sé, la barra de pestañas de la barra de acciones básicamente aparece debajo de ella en el teléfono celular.
Si está en la tableta, me temo que no puede ajustar las posiciones de las pestañas. Lo que sí puedo pensar es que debe dejar de usar el modo de navegación y crear una vista personalizada que se asemeje a pestañas para reemplazar las pestañas de ActionBar. Por supuesto, esto provoca un gran esfuerzo adicional para lidiar con la navegación.
Estoy usando una vista personalizada para ActionBar con pestañas. Mi problema es ordenar la vista personalizada. Android lo está mostrando DESPUÉS de las pestañas, que no quiero.
Quiero que se muestre la vista personalizada ANTES de las pestañas.
¿Hay alguna manera de personalizar la barra de acciones para mostrar la vista personalizada antes de las pestañas? ¿O esto no es posible?
Código:
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
final ActionBar bar = getActionBar();
bar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
View customActionBarView =
getLayoutInflater().inflate(R.layout.home_actionbar, null, true);
ActionBar.LayoutParams lp =
new ActionBar.LayoutParams(LayoutParams.WRAP_CONTENT,
LayoutParams.WRAP_CONTENT);
lp.gravity = Gravity.START;
bar.setCustomView(customActionBarView, lp);
bar.setLogo(R.drawable.logo);
bar.setHomeButtonEnabled(true);
bar.setDisplayShowCustomEnabled(true);
bar.addTab(bar.newTab()
.setText("Stuff")
.setTabListener(new TabListener<StuffFragment>(
this, "stuff", StuffFragment.class)));
bar.addTab(bar.newTab()
.setText("Friends")
.setTabListener(new TabListener<ContactsFragment>(
this, "friends", ContactsFragment.class)));
bar.addTab(bar.newTab()
.setText("Messages")
.setTabListener(new TabListener<ConversationsFragment>(
this, "messages", ConversationsFragment.class)));
if (savedInstanceState != null) {
bar.setSelectedNavigationItem(savedInstanceState.getInt("tab", 0));
}
bar.setDisplayOptions(ActionBar.DISPLAY_SHOW_CUSTOM |
ActionBar.DISPLAY_SHOW_HOME | ActionBar.DISPLAY_USE_LOGO);
bar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
}
Cuando agrega su vista personalizada a ActionBar, también puede especificar la gravedad.
ActionBar.LayoutParams lp = new ActionBar.LayoutParams(LayoutParams.WRAP_CONTENT,LayoutParams.WRAP_CONTENT);
lp.gravity = Gravity.LEFT;
customView.setLayoutParams(lp);
Este parece ser el comportamiento previsto al usar pestañas y vistas personalizadas. https://code.google.com/p/android/issues/detail?id=36191#c3
Si echa un vistazo a ActionBarSherlock - Pestañas que aparecen ARRIBA la barra de acciones con vista personalizada, muchas otras personas también están experimentando esto y algunas personas han ofrecido soluciones.
No he podido lograr que ninguna de las soluciones funcione, pero pueden funcionar para usted. El truco parece ser asegurarse de que el logotipo no esté configurado para ocultarse. Llamada
getActionBar().setDisplayShowHomeEnabled(true)
o getSupportActionBar().setDisplayShowHomeEnabled(true)
si usa ActionBarSherlock.
Luego llame:
View homeIcon = findViewById(
Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB ?
android.R.id.home : R.id.abs__home);
((View) homeIcon.getParent()).setVisibility(View.GONE);
((View) homeIcon).setVisibility(View.GONE);
Esto obtendrá una referencia a la vista de la barra de acciones que contiene el logotipo y lo configura para desaparecer, habilita la vista personalizada para llenar toda la vista principal, pero debe mantener las pestañas debajo ...
Como dije, no pude hacer que esto funcionara, pero algunas personas tuvieron éxito.
Buena suerte.
Primero establezca la propiedad "DisplayShowHomeEnabled" de la barra de acciones en "true": actionBar.setDisplayShowHomeEnabled (true);
y entonces:
View homeIcon = findViewById(android.R.id.home);
((View) homeIcon.getParent()).setVisibility(View.GONE);
((View) homeIcon).setVisibility(View.GONE);
Espero que ayude :)
Simplemente cree una vista personalizada para su botón de inicio. En esta vista, puede combinar el logotipo y la vista personalizada que está tratando de ubicar a la izquierda. Luego agrega pestañas como siempre
El único inconveniente de esta solución es que tendrá que mantener el estado del botón de retroceso usted mismo (si lo usa)
Tuve el mismo problema y descubrí una forma de resolverlo. No es una solución "elegante", pero fue lo mejor que pude encontrar. Como primera cosa, dado que desea modificar el comportamiento estándar de ActionBar, debe forzar a ActionBar Sherlok a usar siempre la implementación no nativa. Para hacerlo, abra ActionBarSherlok.java y comente esta línea de código:
registerImplementation(ActionBarSherlockNative.class);
luego elimine todos los valores-v11 values-v14 etc. y asegúrese de extender siempre Theme.Sherlock y nunca Theme.Holo
En este punto, está seguro de que la implementación de ActionBar es siempre la que redactó Jake Wharton. Lo único que queda por hacer es hacer que el diseño de vista de ActionBar tenga la forma que desee. Abra ActionBarView.java y en el método onLayout () mueva este fragmento de código
if (mExpandedActionView == null) {
final boolean showTitle = mTitleLayout != null && mTitleLayout.getVisibility() != GONE &&
(mDisplayOptions & ActionBar.DISPLAY_SHOW_TITLE) != 0;
if (showTitle) {
x += positionChild(mTitleLayout, x, y, contentHeight);
}
switch (mNavigationMode) {
case ActionBar.NAVIGATION_MODE_STANDARD:
break;
case ActionBar.NAVIGATION_MODE_LIST:
if (mListNavLayout != null) {
if (showTitle) x += mItemPadding;
x += positionChild(mListNavLayout, x, y, contentHeight) + mItemPadding;
}
break;
case ActionBar.NAVIGATION_MODE_TABS:
if (mTabScrollView != null) {
if (showTitle) x += mItemPadding;
x += positionChild(mTabScrollView, x, y, contentHeight) + mItemPadding;
}
break;
}
}
justo antes de esta pieza
if (mProgressView != null) {
mProgressView.bringToFront();
final int halfProgressHeight = mProgressView.getMeasuredHeight() / 2;
mProgressView.layout(mProgressBarPadding, -halfProgressHeight,
mProgressBarPadding + mProgressView.getMeasuredWidth(), halfProgressHeight);
}
¡Terminaste! Espero que esto ayude
usa ActionBarSherlock , que es una muy buena implementación de Custom ActionBar para todas las versiones de Android y muy fácil de usar.
o puede crear su propia barra de acciones utilizando una barra de título personalizada y es bastante fácil de implementar. Puedes ver this y this ejemplos son muy buenos ejemplos de barras de título personalizadas.