Join FlipAndroid.COM Telegram Group: https://t.me/joinchat/F_aqThGkhwcLzmI49vKAiw


¿Dónde está el relleno, al configurar el fondo ¿Dibujable?

Tengo este problema en mi EditText y las vistas del Button , donde tengo un relleno agradable para ellos al espacio lejos del texto, pero cuando cambio el fondo con el setBackgroundDrawable o el setBackgroundResource que el acolchado se pierde para siempre.

  • Establecer fuente para todas las textViews en la actividad?
  • Error 'Android iónico ejecutar' en el dispositivo
  • Mockito - ¿Qué hace el método de verificación?
  • Establecer la fecha de un shell en Android
  • Publicar automáticamente la aplicación beta de Android en Google Play Store
  • Asegurar la fecha / hora correcta
  • ScaleGestureDetector.onTouchEvent devuelve siempre 'true'
  • LocationServices.SettingsApi Restablecer SETTINGS_CHANGE_UNAVAILABLE flag
  • 12 Solutions collect form web for “¿Dónde está el relleno, al configurar el fondo ¿Dibujable?”

    Lo que encontré fue la adición de un parche 9 como un recurso de fondo restablecer el relleno – aunque curiosamente si he añadido un color, o una imagen de parche no-9, no lo hizo. La solución era guardar los valores de relleno antes de que se agregara el fondo, luego volverlos a configurar después.

     private EditText value = (EditText) findViewById(R.id.value); int pL = value.getPaddingLeft(); int pT = value.getPaddingTop(); int pR = value.getPaddingRight(); int pB = value.getPaddingBottom(); value.setBackgroundResource(R.drawable.bkg); value.setPadding(pL, pT, pR, pB); 

    Yo era capaz de envolver el elemento dentro de otro diseño, en este caso, un FrameLayout . Eso me permitió cambiar el fondo en el FrameLayout sin destruir el relleno, que está en el RelativeLayout contenido.

     <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/commentCell" android:layout_width="fill_parent" android:layout_height="wrap_content" android:background="@drawable/comment_cell_bg_single" > <RelativeLayout android:layout_width="fill_parent" android:layout_height="fill_parent" android:padding="20dp"> <ImageView android:id="@+id/sourcePic" android:layout_height="75dp" android:layout_width="75dp" android:padding="5dp" android:background="@drawable/photoframe"/> ... 

    La otra opción es configurarlo programáticamente después de establecer el fondo Drawable como se sugiere anteriormente. Sólo asegúrese de calcular los píxeles para corregir la resolución del dispositivo.

    No he probado este super completamente, pero este método podría ser de uso:

      /** * Sets the background for a view while preserving its current padding. If the background drawable * has its own padding, that padding will be added to the current padding. * * @param view View to receive the new background. * @param backgroundDrawable Drawable to set as new background. */ public static void setBackgroundAndKeepPadding(View view, Drawable backgroundDrawable) { Rect drawablePadding = new Rect(); backgroundDrawable.getPadding(drawablePadding); int top = view.getPaddingTop() + drawablePadding.top; int left = view.getPaddingLeft() + drawablePadding.left; int right = view.getPaddingRight() + drawablePadding.right; int bottom = view.getPaddingBottom() + drawablePadding.bottom; view.setBackgroundDrawable(backgroundDrawable); view.setPadding(left, top, right, bottom); } 

    Use esto en lugar de view.setBackgroundDrawable (Drawable).

    Tenía este problema en un TextView, por lo que subclase TextView y hizo un método de reemplazo del método TextView.setBackgroundResource(int resid) . Me gusta esto:

     @Override public void setBackgroundResource(int resid) { int pl = getPaddingLeft(); int pt = getPaddingTop(); int pr = getPaddingRight(); int pb = getPaddingBottom(); super.setBackgroundResource(resid); this.setPadding(pl, pt, pr, pb); } 

    De esta manera, obtiene el relleno del elemento antes de que establece el recurso, pero no se meten con la funcionalidad original del método, aparte de mantener el relleno.

    Para el buscador común,

    Sólo tiene que agregar setPadding después de setBackgroudDrawable. Cuando cambie su drawable, usted tiene que llamar a setPadding de nuevo.

    Me gusta:

     view.setBackgroundDrawable(backgroundDrawable); view.setPadding(x, x, x, x); 

    La forma más limpia es definir los rellenos dentro de un xml-drawable que apunta a la drawable-image-file

    Greatings

    Versión contraria compatible de la respuesta de cottonBallPaws

     /** * Sets the background for a view while preserving its current padding. If the background drawable * has its own padding, that padding will be added to the current padding. * * @param view View to receive the new background. * @param backgroundDrawable Drawable to set as new background. */ @TargetApi(Build.VERSION_CODES.JELLY_BEAN) @SuppressWarnings("deprecation") public static void setBackgroundAndKeepPadding(View view, Drawable backgroundDrawable) { Rect drawablePadding = new Rect(); backgroundDrawable.getPadding(drawablePadding); int top = view.getPaddingTop() + drawablePadding.top; int left = view.getPaddingLeft() + drawablePadding.left; int right = view.getPaddingRight() + drawablePadding.right; int bottom = view.getPaddingBottom() + drawablePadding.bottom; int sdk = android.os.Build.VERSION.SDK_INT; if(sdk < android.os.Build.VERSION_CODES.JELLY_BEAN) { view.setBackgroundDrawable(backgroundDrawable); } else { view.setBackground(backgroundDrawable); } view.setPadding(left, top, right, bottom); } 

    Mi solución fue ampliar los métodos view (en mi caso un EditText ) y sobreescribir los setBackgroundDrawable() y setBackgroundResource() :

     // Stores padding to avoid padding removed on background change issue public void storePadding(){ mPaddingLeft = getPaddingLeft(); mPaddingBottom = getPaddingTop(); mPaddingRight = getPaddingRight(); mPaddingTop = getPaddingBottom(); } // Restores padding to avoid padding removed on background change issue private void restorePadding() { this.setPadding(mPaddingLeft, mPaddingTop, mPaddingRight, mPaddingBottom); } @Override public void setBackgroundResource(@DrawableRes int resId) { storePadding(); super.setBackgroundResource(resId); restorePadding(); } @Override public void setBackgroundDrawable(Drawable background) { storePadding(); super.setBackgroundDrawable(background); restorePadding(); } 

    Usted puede dar un poco de relleno mediante el uso de imágenes de 9 parches y la definición del área de contenido en el dibujable. Mira esto

    También puede configurar el relleno en su diseño de xml o programatically

    Etiquetas de relleno xml

     android:padding android:paddingLeft android:paddingRight android:paddingTop android:paddingBottom 

    Puede intentar configurar el relleno manualmente desde el código después de llamar a setBackgroundDrawable llamando a setPadding en su EditText o Button Views

    Sólo cambiar lib a v7: 22.1.0 en android studio como este compilar 'com.android.support:appcompat-v7:22.1.0'

    Yo uso esta solución bastante fácil Definir un accentColor en mi style.xml como a continuación

     <item name="colorAccent">#0288D1</item> 

    Y luego utilizo uno de los estilos siguientes en mis etiquetas de Button

     style="@style/Base.Widget.AppCompat.Button.Colored" style="@style/Base.Widget.AppCompat.Button.Small" 

    por ejemplo :

     <Button android:id="@+id/btnLink" style="@style/Base.Widget.AppCompat.Button.Colored" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_below="@id/tvDescription" android:textColor="@color/textColorPrimary" android:text="Visit Website" /> <Button android:id="@+id/btnSave" style="@style/Base.Widget.AppCompat.Button.Small" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_below="@id/tvDescription" android:layout_toRightOf="@id/btnLink" android:textColor="@color/textColorPrimaryInverse" android:text="Save" /> 

    La mayoría de las respuestas son correctas pero deben manejar la configuración de fondo correctamente.

    Primero obtenga el relleno de su vista

     //Here my view has the same padding in all directions so I need to get just 1 padding int padding = myView.getPaddingTop(); 

    A continuación, establezca el fondo

     //If your are supporting lower OS versions make sure to verify the version if(android.os.Build.VERSION.SDK_INT < android.os.Build.VERSION_CODES.JELLY_BEAN) { //getDrawable was deprecated so use ContextCompat myView.setBackgroundDrawable(ContextCompat.getDrawable(context, R.drawable.bg_accent_underlined_white)); } else { myView.setBackground(ContextCompat.getDrawable(context, R.drawable.bg_accent_underlined_white)); } 

    A continuación, establezca el relleno que tenía la vista antes del cambio de fondo

     myView.setPadding(padding, padding, padding, padding); 

    Aquí una versión mejorada de setBackgroundAndKeepPadding de cottonBallPaws. Esto mantiene el relleno incluso si llama al método varias veces:

     /** * Sets the background for a view while preserving its current padding. If the background drawable * has its own padding, that padding will be added to the current padding. */ public static void setBackgroundAndKeepPadding(View view, Drawable backgroundDrawable) { Rect drawablePadding = new Rect(); backgroundDrawable.getPadding(drawablePadding); // Add background padding to view padding and subtract any previous background padding Rect prevBackgroundPadding = (Rect) view.getTag(R.id.prev_background_padding); int left = view.getPaddingLeft() + drawablePadding.left - (prevBackgroundPadding == null ? 0 : prevBackgroundPadding.left); int top = view.getPaddingTop() + drawablePadding.top - (prevBackgroundPadding == null ? 0 : prevBackgroundPadding.top); int right = view.getPaddingRight() + drawablePadding.right - (prevBackgroundPadding == null ? 0 : prevBackgroundPadding.right); int bottom = view.getPaddingBottom() + drawablePadding.bottom - (prevBackgroundPadding == null ? 0 : prevBackgroundPadding.bottom); view.setTag(R.id.prev_background_padding, drawablePadding); view.setBackgroundDrawable(backgroundDrawable); view.setPadding(left, top, right, bottom); } 

    Debe definir un id de recurso mediante valores / ids.xml:

     <?xml version="1.0" encoding="utf-8"?> <resources> <item name="prev_background_padding" type="id"/> </resources> 
    FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.