Android: dibujable junto a TextView con el peso de cada TextView en LinearLayout
Estoy tratando de lograr el resultado como se muestra en Pic1. Probado la gravedad del ajuste, paddingleft etc, pero la imagen dibujable viene en el extremo derecho y no al lado de texto (mostrado en la imagen 2 ). ¿Alguien puede sugerir cómo alinear la imagen junto a TextView? ¿También cómo fijar el tamaño de drawable?
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="wrap_content" android:orientation="horizontal" android:background="@drawable/separator" android:padding="10dp"> <TextView android:id="@+id/sms" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginLeft="2dp" android:layout_marginRight="2dp" android:layout_weight="1" android:drawableEnd="@drawable/message" android:drawableRight="@drawable/message" android:gravity="center" android:paddingLeft="3dp" android:paddingRight="3dp" android:text="SMS" /> <TextView android:id="@+id/call" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" android:drawableEnd="@drawable/call" android:drawableRight="@drawable/call" android:gravity="center" android:text="CALL" /> <TextView android:id="@+id/email" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" android:gravity="center" android:drawableEnd="@drawable/mail" android:drawablePadding="3dp" android:drawableRight="@drawable/mail" android:text="MAIL" />
- Alinear el botón a la parte inferior de la pantalla
- ClipToBounds para niños Vistas dentro de LinearLayout android
- ¿Por qué se puede hacer clic en un botón cuando hay otro diseño que lo superpone?
- Elemento seleccionado en listview personalizado con barra de acción contextual
- Android LinearLayout divisor, pero el porcentaje?
- ¿Es Android diseño realmente exponencial duro?
- Diseño lineal y peso en Android
- ¿Cómo crear una vista personalizada simple?
- Ver animaciones en Android Colapsar / Expandir vistas en LinearLayout
- Transparente LinearLayout en Android
- ¿Por qué android: layout_gravity = "derecho" no funciona aquí en android xml
- compruebe si existe una vista desde un inflador de diseño antes de añadir otro
- Emulador Android no Desplácese hacia abajo
Trate de construir alrededor de esto.
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="wrap_content" android:background="@android:color/transparent" android:orientation="horizontal" android:padding="10dp"> <LinearLayout android:layout_width="0dp" android:layout_height="wrap_content" android:gravity="center" android:layout_weight="1"> <TextView android:id="@+id/sms" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginLeft="2dp" android:layout_marginRight="2dp" android:gravity="center" android:drawableRight="@drawable/message" android:text="SMS" /> </LinearLayout> <LinearLayout android:layout_width="0dp" android:layout_height="wrap_content" android:gravity="center" android:layout_weight="1"> <TextView android:id="@+id/call" android:layout_width="wrap_content" android:layout_height="wrap_content" android:drawableRight="@drawable/call" android:gravity="center" android:text="CALL" /> </LinearLayout> <LinearLayout android:layout_width="0dp" android:layout_height="wrap_content" android:gravity="center" android:layout_weight="1"> <TextView android:id="@+id/email" android:layout_width="wrap_content" android:layout_height="wrap_content" android:drawableRight="@drawable/mail" android:gravity="center" android:text="MAIL" /> </LinearLayout> </LinearLayout>
El principal problema es que, está configurando el layoutWidth = 0dp y el peso 1. Esto hace que cada TextView tome el ancho máximo de acuerdo con el peso. El drawableRight / drawableEnd establece el recurso extraíble que se dibujará en el borde derecho de la vista. Si desea mantener este diseño simplemente envolverlo en otro viewGroup como @Dhinakaran ha demostrado. Un mejor enfoque sería utilizar un diseño de tabulación .
En lugar de utilizar varios Linear Layouts, puede utilizar un Layout relativo.
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" app:layout_behavior="@string/appbar_scrolling_view_behavior"> <RelativeLayout android:layout_width="match_parent" android:layout_height="50dp" android:layout_gravity="bottom" android:layout_weight=".33" android:gravity="center_horizontal|center_vertical"> <TextView android:id="@+id/textView" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerHorizontal="true" android:layout_centerVertical="true" android:text="Small Text" android:textAppearance="?android:attr/textAppearanceSmall"/> <ImageView android:id="@+id/imageView" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerVertical="true" android:layout_toEndOf="@+id/textView" android:layout_toRightOf="@+id/textView" android:src="@android:drawable/btn_star"/> </RelativeLayout> <RelativeLayout android:layout_width="match_parent" android:layout_height="50dp" android:layout_gravity="bottom" android:layout_weight=".33" android:gravity="center_horizontal|center_vertical"> <TextView android:id="@+id/textView2" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerHorizontal="true" android:layout_centerVertical="true" android:text="Small Text" android:textAppearance="?android:attr/textAppearanceSmall"/> <ImageView android:id="@+id/imageView2" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerVertical="true" android:layout_toEndOf="@+id/textView2" android:layout_toRightOf="@+id/textView2" android:src="@android:drawable/btn_star"/> </RelativeLayout> <RelativeLayout android:layout_width="match_parent" android:layout_height="50dp" android:layout_gravity="bottom" android:layout_weight=".33" android:gravity="center_horizontal|center_vertical"> <TextView android:id="@+id/textView3" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerHorizontal="true" android:layout_centerVertical="true" android:text="Small Text" android:textAppearance="?android:attr/textAppearanceSmall"/> <ImageView android:id="@+id/imageView3" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerVertical="true" android:layout_toEndOf="@+id/textView3" android:layout_toRightOf="@+id/textView3" android:src="@android:drawable/btn_star"/> </RelativeLayout> </LinearLayout>
Resultado
Creó un botón personalizado que no requiere anidaciones de diseño y puede alinear imágenes dibujables según sea necesario.
Archivo de diseño button.xml:
<Button xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/custom_button" style="@style/custom_button" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" android:drawablePadding="5dp" android:gravity="center" />
Clase de encargo del botón:
public class DrawableAlignedButton extends RelativeLayout { private View view; private Button button; /** * @param context * used to inflate the View. * @param attrs * XML defined attributes. */ public DrawableAlignedButton(final Context context, final AttributeSet attrs) { super(context, attrs); init(context, attrs); } /** * @param context * used to inflate the View. */ public DrawableAlignedButton(final Context context) { super(context); init(context, null); } /** * @param context * used to inflate the View. * @param attrs * XML defined attributes. * @param style * the style for the View. */ public DrawableAlignedButton(final Context context, final AttributeSet attrs, final int style) { super(context, attrs, style); init(context, attrs); } private void init(final Context context, final AttributeSet attributeSet) { view = ((Activity) getContext()).getLayoutInflater().inflate(R.layout.button, this, true); button = (Button) view.findViewById(R.id.custom_button); String buttonText = null; int drawableStart = 0; int drawableEnd = 0; if (attributeSet != null) { final TypedArray a = context.getTheme().obtainStyledAttributes(attributeSet, R.styleable.CustomButtonStyle, 0, 0); buttonText = a.getString(R.styleable.CustomButtonStyle_buttonText); drawableStart = a.getResourceId(R.styleable.CustomButtonStyle_buttonDrawableStart, 0); drawableEnd = a.getResourceId(R.styleable.CustomButtonStyle_buttonDrawableEnd, 0); a.recycle(); } FontUtil.getInstance(context).useNormalRegularFont(button); if (buttonText != null) { button.setText(buttonText); } button.setCompoundDrawablesRelativeWithIntrinsicBounds(drawableStart, 0, drawableEnd, 0); } /** * Sets the button text. * * @param text * the text to be set. */ public void setButtonText(final String text) { if (button != null) { button.setText(text); } } /** * Sets the drawable to the button. * * @param drawableStart * the drawable to set at the beginning of the text. * @param drawableEnd * the drawable to set at the end of the text. */ public void setDrawableStart(final int drawableStart, final int drawableEnd) { if (button != null) { button.setCompoundDrawablesRelativeWithIntrinsicBounds(drawableStart, 0, drawableEnd, 0); } } }
Cómo usarlo en XML:
<com.package.view.DrawableAlignedButton xmlns:drawableAlignedButton="http://schemas.android.com/apk/res-auto" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" android:background="@drawable/transparent_button_selector" drawableAlignedButton:buttonDrawableStart="@drawable/small_active" drawableAlignedButton:buttonText="Button Text" />