Ausrichten von drawableLeft mit Text der Schaltfläche

Hier ist mein Layout:

Bildbeschreibung hier eingeben

  • Android AudioRecord lesen immer wieder -3 (ERROR_INVALID_OPERATION)
  • Wie bekomme ich getIntent (), um null zurückzukehren, nachdem die Aktivität mit einem Intent-Set aufgerufen wurde
  • Android content provider sum query
  • LoopJ AndroidAsyncHttp und JSON POST ARRAY
  • Ausnahme: Rückrufe müssen übergeordnete Schranken in populateNodeForVirtualViewId ()
  • Löschen eines Ordners auf SD-Karte
  • Das Problem, mit dem ich konfrontiert bin, ist mit dem ziehbaren Häkchen. Wie würde ich es tun, um es neben dem Text auszurichten, die beide in der Schaltfläche zentriert sind? Hier ist das XML:

    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".PostAssignmentActivity" > <LinearLayout style="?android:attr/buttonBarStyle" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_alignParentBottom="true" android:orientation="horizontal" > <Button style="?android:attr/buttonBarButtonStyle" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_weight="1" android:drawableLeft="@drawable/ic_checkmark_holo_light" android:text="Post" /> <Button style="?android:attr/buttonBarButtonStyle" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_weight="1" android:text="Cancel" /> </LinearLayout> </RelativeLayout> 

    Anwendung android: gravity = "center_vertical" zieht den Text und zieht zusammen, aber dann ist der Text nicht mehr in der Mitte ausgerichtet.

  • Wie deaktiviere ich 3D-Gebäude mit Google Maps Android API v2
  • .jar android Bibliothek importieren in Xamarin Projekt
  • Siehe ActionBarSherlock aus einer Bibliothek
  • Android-Studio (oder IDEA im Allgemeinen) Refactor über mehrere Quellsätze
  • Obj Fragment falsch 2. Argument Typ gefunden 'Android.support.V4.app.Fragment.' Erforderlich 'Android.app.Fragment'
  • Wie bekommst du die Manifest Versionsnummer aus den XML-Variablen der App (Layout)?
  • 10 Solutions collect form web for “Ausrichten von drawableLeft mit Text der Schaltfläche”

    Lösung 1

    Set android:paddingLeft in deiner ersten Taste. Dies zwingt die drawableLeft durch paddingLeft Betrag rechts. Das ist die schnelle / hackige Lösung.

    Lösung 2

    Verwenden Sie statt eines ButtonViews ein LinearLayout, das sowohl eine Textansicht als auch eine Bildansicht enthält. Das ist eine bessere Lösung . Es gibt Ihnen mehr Flexibilität bei der Positionierung des Häkchens.

    Ersetzen Sie Ihre ButtonView mit dem folgenden Code. Sie benötigen das LinearLayout und TextView , um TextView zu verwenden, damit die Hintergrundfarben bei der Auswahl korrekt sind und die Textgröße korrekt ist. Sie müssen android:background="#0000" für die Kinder setzen, so dass nur die LinearLayout die Hintergrundfärbung verarbeitet.

     <LinearLayout style="?android:attr/buttonBarButtonStyle" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_weight="1" android:orientation="horizontal" > <ImageView style="?android:attr/buttonBarButtonStyle" android:layout_width="wrap_content" android:layout_height="wrap_content" android:clickable="false" android:background="#0000" android:src="@drawable/ic_checkmark_holo_light"/> <TextView style="?android:attr/buttonBarButtonStyle" android:layout_width="wrap_content" android:layout_height="wrap_content" android:clickable="false" android:background="#0000" android:text="Done" /> </LinearLayout> 

    Hier sind einige Screenshots, die ich beim Ausprobieren gemacht habe.

    Bildbeschreibung hier eingebenBildbeschreibung hier eingebenBildbeschreibung hier eingeben

    Keine dieser Lösungen funktionierte richtig, ohne inakzeptable Kompromisse zu präsentieren (erstellen Sie ein Layout mit Ansichten in ihm? Nicht eine gute Idee). Also warum nicht selbst rollen Das habe ich bekommen

    Bildbeschreibung hier eingeben

    Erstellen Sie zunächst eine attrs.xml :

     <resources> <declare-styleable name="IconButton"> <attr name="iconSrc" format="reference" /> <attr name="iconSize" format="dimension" /> <attr name="iconPadding" format="dimension" /> </declare-styleable> </resources> 

    Dies ermöglicht es, ein Symbol mit bestimmter Größe, Polsterung aus Text und Bild in unserer neuen Ansicht zu erstellen. Der Viewcode sieht so aus:

     public class IconButton extends Button { private Bitmap mIcon; private Paint mPaint; private Rect mSrcRect; private int mIconPadding; private int mIconSize; public IconButton(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); init(context, attrs); } public IconButton(Context context, AttributeSet attrs) { super(context, attrs); init(context, attrs); } public IconButton(Context context) { super(context); } @Override protected void onDraw(Canvas canvas) { int shift = (mIconSize + mIconPadding) / 2; canvas.save(); canvas.translate(shift, 0); super.onDraw(canvas); if (mIcon != null) { float textWidth = getPaint().measureText((String)getText()); int left = (int)((getWidth() / 2f) - (textWidth / 2f) - mIconSize - mIconPadding); int top = getHeight()/2 - mIconSize/2; Rect destRect = new Rect(left, top, left + mIconSize, top + mIconSize); canvas.drawBitmap(mIcon, mSrcRect, destRect, mPaint); } canvas.restore(); } private void init(Context context, AttributeSet attrs) { TypedArray array = context.obtainStyledAttributes(attrs, R.styleable.IconButton); for (int i = 0; i < array.getIndexCount(); ++i) { int attr = array.getIndex(i); switch (attr) { case R.styleable.IconButton_iconSrc: mIcon = drawableToBitmap(array.getDrawable(attr)); break; case R.styleable.IconButton_iconPadding: mIconPadding = array.getDimensionPixelSize(attr, 0); break; case R.styleable.IconButton_iconSize: mIconSize = array.getDimensionPixelSize(attr, 0); break; default: break; } } array.recycle(); //If we didn't supply an icon in the XML if(mIcon != null){ mPaint = new Paint(); mSrcRect = new Rect(0, 0, mIcon.getWidth(), mIcon.getHeight()); } } public static Bitmap drawableToBitmap (Drawable drawable) { if (drawable instanceof BitmapDrawable) { return ((BitmapDrawable)drawable).getBitmap(); } Bitmap bitmap = Bitmap.createBitmap(drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight(), Bitmap.Config.ARGB_8888); Canvas canvas = new Canvas(bitmap); drawable.setBounds(0, 0, canvas.getWidth(), canvas.getHeight()); drawable.draw(canvas); return bitmap; } } 

    Und dann kann es so verwendet werden:

     <com.example.grennis.myapplication.IconButton android:layout_width="200dp" android:layout_height="64dp" android:text="Delete" app:iconSrc="@android:drawable/ic_delete" app:iconSize="32dp" app:iconPadding="6dp" /> 

    Das funktioniert für mich.

    Hier ist eine saubere einfache Art und Weise, ohne etwas Phantasie zu tun, um die Ergebnisse eines Knopfes zu erreichen, der viel breiter ist als der Inhalt mit Bild und Text, die zentriert sind.

     <RelativeLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:clickable="true" android:background="@drawable/button_background_selector"> <Button android:layout_centerInParent="true" android:gravity="center" android:duplicateParentState="true" android:layout_width="wrap_content" android:text="New User" android:textSize="15sp" android:id="@android:id/button1" android:textColor="@android:color/white" android:drawablePadding="6dp" android:drawableLeft="@drawable/add_round_border_32x32" android:layout_height="64dp" /> </RelativeLayout> 

    Bildbeschreibung hier eingeben

    In unserem Fall wollten wir die Standard-Button-Klasse verwenden (um ihre verschiedenen Stile und Verhaltensweisen zu erben) und wir mussten in der Lage sein, die Schaltfläche im Code zu erstellen. Auch in unserem Fall könnten wir Text, eine Ikone (linksziehbar) oder beides haben.

    Ziel war es, das Icon und / oder den Text als Gruppe zu zentrieren, wenn die Tastenbreite breiter war als wrap_content.

     public class CenteredButton extends Button { public CenteredButton(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); // We always want our icon and/or text grouped and centered. We have to left align the text to // the (possible) left drawable in order to then be able to center them in our onDraw() below. // setGravity(Gravity.LEFT|Gravity.CENTER_VERTICAL); } @Override protected void onDraw(Canvas canvas) { // We want the icon and/or text grouped together and centered as a group. // We need to accommodate any existing padding // float buttonContentWidth = getWidth() - getPaddingLeft() - getPaddingRight(); // In later versions of Android, an "all caps" transform is applied to buttons. We need to get // the transformed text in order to measure it. // TransformationMethod method = getTransformationMethod(); String buttonText = ((method != null) ? method.getTransformation(getText(), this) : getText()).toString(); float textWidth = getPaint().measureText(buttonText); // Compute left drawable width, if any // Drawable[] drawables = getCompoundDrawables(); Drawable drawableLeft = drawables[0]; int drawableWidth = (drawableLeft != null) ? drawableLeft.getIntrinsicWidth() : 0; // We only count the drawable padding if there is both an icon and text // int drawablePadding = ((textWidth > 0) && (drawableLeft != null)) ? getCompoundDrawablePadding() : 0; // Adjust contents to center // float bodyWidth = textWidth + drawableWidth + drawablePadding; canvas.translate((buttonContentWidth - bodyWidth) / 2, 0); super.onDraw(canvas); } } 

    Hier ist mein Code und funktioniert perfekt.

     <Button android:id="@+id/button" android:layout_width="200dp" android:layout_height="50dp" android:layout_gravity="center" android:background="@drawable/green_btn_selector" android:gravity="left|center_vertical" android:paddingLeft="50dp" android:drawableLeft="@drawable/plus" android:drawablePadding="5dp" android:text="@string/create_iou" android:textColor="@color/white" /> 
     public class DrawableCenterTextView extends TextView { public DrawableCenterTextView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); } public DrawableCenterTextView(Context context, AttributeSet attrs) { super(context, attrs); } public DrawableCenterTextView(Context context) { super(context); } @Override protected void onDraw(Canvas canvas) { Drawable[] drawables = getCompoundDrawables(); if (drawables != null) { Drawable drawableLeft = drawables[0]; Drawable drawableRight = drawables[2]; if (drawableLeft != null || drawableRight != null) { float textWidth = getPaint().measureText(getText().toString()); int drawablePadding = getCompoundDrawablePadding(); int drawableWidth = 0; if (drawableLeft != null) drawableWidth = drawableLeft.getIntrinsicWidth(); else if (drawableRight != null) { drawableWidth = drawableRight.getIntrinsicWidth(); } float bodyWidth = textWidth + drawableWidth + drawablePadding; canvas.translate((getWidth() - bodyWidth) / 2, 0); } } super.onDraw(canvas); } } 

    Ich begann mit @ BobDickinson Antwort , aber es hat nicht gut mit mehreren Zeilen zu bewältigen. Der Ansatz ist gut, denn du bist immer noch am Ende mit einem Button , der richtig wiederverwendet werden kann.

    Hier ist eine passende Lösung, die auch funktioniert, wenn die Schaltfläche mehrere Zeilen hat (bitte nicht fragen warum.)

    Verlängern Sie einfach den Button und verwenden Sie den folgenden in onDraw , der getLineRight() wird verwendet, um die tatsächliche Länge jeder Zeile getLineRight() .

     @Override protected void onDraw(Canvas canvas) { // We want the icon and/or text grouped together and centered as a group. // We need to accommodate any existing padding final float buttonContentWidth = getWidth() - getPaddingLeft() - getPaddingRight(); float textWidth = 0f; final Layout layout = getLayout(); if (layout != null) { for (int i = 0; i < layout.getLineCount(); i++) { textWidth = Math.max(textWidth, layout.getLineRight(i)); } } // Compute left drawable width, if any Drawable[] drawables = getCompoundDrawables(); Drawable drawableLeft = drawables[0]; int drawableWidth = (drawableLeft != null) ? drawableLeft.getIntrinsicWidth() : 0; // We only count the drawable padding if there is both an icon and text int drawablePadding = ((textWidth > 0) && (drawableLeft != null)) ? getCompoundDrawablePadding() : 0; // Adjust contents to center float bodyWidth = textWidth + drawableWidth + drawablePadding; canvas.save(); canvas.translate((buttonContentWidth - bodyWidth) / 2, 0); super.onDraw(canvas); canvas.restore(); } 

    Hier ist eine andere Lösung:

      <LinearLayout android:id="@+id/llButton" android:layout_width="match_parent" style="@style/button_celeste" android:layout_height="wrap_content" android:orientation="horizontal"> <TextView style="@style/button_celeste" android:layout_width="wrap_content" android:layout_height="wrap_content" android:drawablePadding="10dp" android:clickable="false" android:drawableLeft="@drawable/icon_phone" android:text="@string/call_runid"/> </LinearLayout> 

    Und die Veranstaltung:

      LinearLayout btnCall = (LinearLayout) findViewById(R.id.llButton); btnCall.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { call(runid.Phone); } }); 

    Ich hatte das gleiche Problem, und ich habe eine Lösung, die keine XML-Änderungen oder benutzerdefinierte Ansichten erfordert.

    Dieses Code-Snippet ruft die Breite des Textes und die links / rechts-Zeichensätze ab und setzt die linke / rechte Polsterung des Knopfes so, dass es nur genügend Platz gibt, um den Text und die Zeichenkörbe zu zeichnen, und es wird kein Polster mehr hinzugefügt. Dies kann sowohl für Buttons als auch für TextViews, deren Superklassen, angewendet werden.

     public class TextViewUtils { private static final int[] LEFT_RIGHT_DRAWABLES = new int[]{0, 2}; public static void setPaddingForCompoundDrawableNextToText(final TextView textView) { ViewTreeObserver vto = textView.getViewTreeObserver(); vto.addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { @Override public void onGlobalLayout() { shinkRoomForHorizontalSpace(textView); } }); } private static void shinkRoomForHorizontalSpace(TextView textView) { int textWidth = getTextWidth(textView); int sideCompoundDrawablesWidth = getSideCompoundDrawablesWidth(textView); int contentWidth = textWidth + sideCompoundDrawablesWidth; int innerWidth = getInnerWidth(textView); int totalPadding = innerWidth - contentWidth; textView.setPadding(totalPadding / 2, 0, totalPadding / 2, 0); } private static int getTextWidth(TextView textView) { String text = textView.getText().toString(); Paint textPaint = textView.getPaint(); Rect bounds = new Rect(); textPaint.getTextBounds(text, 0, text.length(), bounds); return bounds.width(); } private static int getSideCompoundDrawablesWidth(TextView textView) { int sideCompoundDrawablesWidth = 0; Drawable[] drawables = textView.getCompoundDrawables(); for (int drawableIndex : LEFT_RIGHT_DRAWABLES) { Drawable drawable = drawables[drawableIndex]; if (drawable == null) continue; int width = drawable.getBounds().width(); sideCompoundDrawablesWidth += width; } return sideCompoundDrawablesWidth; } private static int getInnerWidth(TextView textView) { Rect backgroundPadding = new Rect(); textView.getBackground().getPadding(backgroundPadding); return textView.getWidth() - backgroundPadding.left - backgroundPadding.right; } } 

    Beachte das:

    • Es hat noch etwas mehr Platz als nötig (gut genug für meine Zwecke, aber du kannst nach dem Fehler suchen)
    • Es überschreibt, was links / rechts padding ist da. Ich denke, es ist nicht schwer, das zu beheben.

    Um es zu benutzen, ruf einfach TextViewUtils.setPaddingForCompoundDrawableNextToText(button) auf deinem onCreate oder onViewCreated() .

    Eine weitere ganz hackige Alternative ist, leere Distanzansichten mit weight="1" auf jeder Seite der Tasten hinzuzufügen. Ich weiß nicht, wie das die Leistung beeinträchtigen würde.

      <View android:layout_width="0dp" android:layout_height="fill_parent" android:layout_weight="1" /> 
    Das Android ist ein Google Android Fan-Website, Alles ├╝ber Android Phones, Android Wear, Android Dev und Android Spiele Apps und so weiter.