getsupportactionbar - eliminar el relleno alrededor de la barra de acciones icono de la izquierda en Android 4.0+
setsupportactionbar (6)
Buscando fuentes AOSP, parece que el código involucrado está en com.android.internal.widget.ActionBarView.java
. En particular, la parte relevante es el método onLayout()
de la clase interna ActionBarView$HomeView
, que se muestra parcialmente a continuación (líneas 1433-1478):
@Override
protected void onLayout(boolean changed, int l, int t, int r, int b) {
...
final LayoutParams iconLp = (LayoutParams) mIconView.getLayoutParams();
final int iconHeight = mIconView.getMeasuredHeight();
final int iconWidth = mIconView.getMeasuredWidth();
final int hCenter = (r - l) / 2;
final int iconTop = Math.max(iconLp.topMargin, vCenter - iconHeight / 2);
final int iconBottom = iconTop + iconHeight;
final int iconLeft;
final int iconRight;
int marginStart = iconLp.getMarginStart();
final int delta = Math.max(marginStart, hCenter - iconWidth / 2);
if (isLayoutRtl) {
iconRight = width - upOffset - delta;
iconLeft = iconRight - iconWidth;
} else {
iconLeft = upOffset + delta;
iconRight = iconLeft + iconWidth;
}
mIconView.layout(iconLeft, iconTop, iconRight, iconBottom);
}
el mismo widget usa este diseño, definido en res/layout/action_bar_home.xml
:
<view xmlns:android="http://schemas.android.com/apk/res/android"
class="com.android.internal.widget.ActionBarView$HomeView"
android:layout_width="wrap_content"
android:layout_height="match_parent">
<ImageView android:id="@android:id/up"
android:src="?android:attr/homeAsUpIndicator"
android:layout_gravity="center_vertical|start"
android:visibility="gone"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginEnd="-8dip" />
<ImageView android:id="@android:id/home"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginEnd="8dip"
android:layout_marginTop="@android:dimen/action_bar_icon_vertical_padding"
android:layout_marginBottom="@android:dimen/action_bar_icon_vertical_padding"
android:layout_gravity="center"
android:adjustViewBounds="true"
android:scaleType="fitCenter" />
</view>
Según las fuentes, el icono se muestra en la Imageview
la Imageview
con id = android.R.id.home
. El método onLayout()
informado anteriormente tiene en cuenta los márgenes de ImageView
definidos en el diseño, que no pueden establecerse mediante el reemplazo de tema / estilo porque usan el valor @android:dimen/action_bar_icon_vertical_padding
.
Todo lo que puede hacer es deshacerse de esos valores en tiempo de ejecución y configurarlos de acuerdo con sus necesidades: simplemente recupere ImageView
y establezca sus márgenes superior e inferior en 0
. Algo como esto:
ImageView icon = (ImageView) findViewById(android.R.id.home);
FrameLayout.LayoutParams iconLp = (FrameLayout.LayoutParams) icon.getLayoutParams();
iconLp.topMargin = iconLp.bottomMargin = 0;
icon.setLayoutParams( iconLp );
EDITAR: Me acabo de dar cuenta de que no cubrí cómo deshacerme del relleno izquierdo. Solución a continuación.
El relleno izquierdo en la barra de acciones se ve afectado por el comportamiento de Navegación hacia arriba del icono de la barra de acciones. Cuando está desactivado (a través de ActionBar.setDisplayHomeAsUpEnabled(false)
), el indicador de izquierda / arriba se ha ido, pero también se usa un margen izquierdo. Una solución simple:
- habilitar la navegación de la
ActionBar.setDisplayHomeAsUpEnabled(true)
usandoActionBar.setDisplayHomeAsUpEnabled(true)
para considerar la vista del indicador en el proceso de diseño - forzar el drawable usado como indicador ascendente en su
res/values-v14/styles.xml
anull
p.ej:
<style name="AppBaseTheme" parent="android:Theme.Holo.Light.DarkActionBar">
<!-- API 14 theme customizations can go here. -->
<item name="android:homeAsUpIndicator">@null</item>
</style>
Quiero eliminar el relleno alrededor del ícono a la izquierda en la barra de acción estándar de Android 4.0+. Estoy configurando el ícono con:
getActionBar().setIcon(getResources().getDrawable(R.drawable.ic_action_myapp));
Y me gustaría que el icono llene verticalmente el espacio, tocando arriba y abajo, de forma similar a lo que hace la aplicación SoundCloud:
Encontré otra resolución (referencia appcompat-v7) que cambia el toolbarStyle, siguiendo el código:
<item name="toolbarStyle">@style/Widget.Toolbar</item>
<style name="Widget.Toolbar" parent="@style/Widget.AppCompat.Toolbar">
<item name="contentInsetStart">0dp</item>
</style>
Para establecer la altura de ActionBar puede crear un nuevo tema como este:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<style name="Theme.BarSize" parent="Theme.Sherlock.Light.DarkActionBar">
<item name="actionBarSize">48dip</item>
<item name="android:actionBarSize">48dip</item>
</style>
</resources>
y establece este tema para tu actividad:
android: theme = "@ style / Theme.BarSize"
Ahora, configure la altura de los íconos en "match_parent"
.
Eso eliminaría el relleno superior e inferior.
Ahora, la flecha de la izquierda está incorporada en el marco, por lo que tiene dos opciones para una solución alternativa:
Use ActionBarSherlock. Utiliza sus propios drwables y recursos, por lo que puedes modificar el ícono de la flecha a un png emty, para que tu ícono se mueva a la extrema izquierda.
El ícono de arriba / atrás surge de:
public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case android.R.id.home: NavUtils.navigateUpFromSameTask(this); return true; } }
Entonces, en lugar de usar esta opción para el botón arriba, puede hacer otra opción de barra de acciones, que tiene una intención para la actividad anterior, y luego colocar ese ícono en su barra de acciones.
Sin embargo, será una solución más grande.
Espero que ayude.. :)
puedes encontrar homeview en actionbarview definir de esta manera:
<view xmlns:android="http://schemas.android.com/apk/res/android"
class="com.android.internal.widget.ActionBarView$HomeView"
android:layout_width="wrap_content"
android:layout_height="match_parent">
<ImageView android:id="@android:id/up"
android:src="?android:attr/homeAsUpIndicator"
android:layout_gravity="center_vertical|start"
android:visibility="gone"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginEnd="-8dip" />
<ImageView android:id="@android:id/home"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginEnd="8dip"
android:layout_marginTop="@android:dimen/action_bar_icon_vertical_padding"
android:layout_marginBottom="@android:dimen/action_bar_icon_vertical_padding"
android:layout_gravity="center"
android:adjustViewBounds="true"
android:scaleType="fitCenter" />
pero no puedes obtener upView por findViewById(android.R.id.up)
.
para que pueda ver homeView y obtener su vista principal, configurar el ancho de vista 0
ImageView view = (ImageView)findViewById(android.R.id.home);
if(view.getParent() instanceof ViewGroup){
ViewGroup viewGroup = (ViewGroup)view.getParent();
View upView = viewGroup.getChildAt(0);
FrameLayout.LayoutParams layoutParams = (FrameLayout.LayoutParams) upView.getLayoutParams();
layoutParams.width = 0;
upView.setLayoutParams(layoutParams);
}
usar diseño personalizado para ActionBar
public class TestActivity extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
final ActionBar actionBar = getActionBar();
actionBar.setCustomView(R.layout.actionbar_custom_view_home);
actionBar.setDisplayShowTitleEnabled(false);
actionBar.setDisplayShowCustomEnabled(true);
actionBar.setDisplayUseLogoEnabled(false);
actionBar.setDisplayShowHomeEnabled(false);
setContentView(R.layout.main);
}
public void Click(View v) {
if (v.getId() == R.id.imageIcon) {
Log.e("click on--> ", "Action icon");
}
}
}
actionbar_custom_view_home.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/linearLayout1"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:gravity="center" >
<ImageView
android:id="@+id/imageIcon"
android:onClick="Click"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:src="@drawable/ic_launcher" />
<TextView
android:id="@+id/textView1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Large Icon With Title"
android:textAppearance="?android:attr/textAppearanceLarge" />
</LinearLayout>
Respuesta mejorada de parrzhang para eliminar el relleno alrededor de la barra de acciones icono de la izquierda en Android 4.0+
private void adjustHomeButtonLayout(){
ImageView view = (ImageView)findViewById(android.R.id.home);
if(view.getParent() instanceof ViewGroup){
ViewGroup viewGroup = (ViewGroup)view.getParent();
View upView = viewGroup.getChildAt(0);
if(upView != null && upView.getLayoutParams() instanceof FrameLayout.LayoutParams){
FrameLayout.LayoutParams layoutParams = (FrameLayout.LayoutParams) upView.getLayoutParams();
layoutParams.width = 20;// **can give your own width**
upView.setLayoutParams(layoutParams);
}
}
}