Ich möchte einen Android-Button mit Symbol + Text in der Mitte haben. Ich verwende das drawableLeft-Attribut, um das Bild festzulegen. Dies funktioniert gut, wenn die Schaltfläche eine Breite von "wrap_content"
hat. Ich muss mich jedoch auf die maximale Breite dehnen, damit ich die Breite "fill_parent"
verwenden kann. Dadurch wird mein Symbol direkt nach links von der Schaltfläche verschoben und ich möchte, dass sowohl Symbol als auch Text innerhalb der Schaltfläche zentriert werden.
Ich habe versucht, das Padding einzurichten, aber dies erlaubt nur einen festen Wert, so dass es nicht das ist, was ich brauche. Ich muss Symbol + Text in der Mitte haben.
<Button
Android:id="@+id/startTelemoteButton"
Android:text="@string/start_telemote"
Android:drawableLeft="@drawable/start"
Android:paddingLeft="20dip"
Android:paddingRight="20dip"
Android:width="fill_parent"
Android:heigh="wrap_content" />
Irgendwelche Vorschläge, wie ich das erreichen könnte?
Android: drawableLeft hält immer Android: paddingLeft als Abstand vom linken Rand. Wenn der Button nicht auf Android eingestellt ist: width = "wrap_content", hängt er immer nach links!
Mit Android 4.0 (API-Ebene 14) können Sie das Attribut Android: drawableStart verwenden, um ein Zeichen am Anfang des Textes zu platzieren. Die einzige abwärtskompatible Lösung, die ich entwickelt habe, ist die Verwendung von ImageSpan , um ein Text + Image Spannable zu erstellen:
Button button = (Button) findViewById(R.id.button);
Spannable buttonLabel = new SpannableString(" Button Text");
buttonLabel.setSpan(new ImageSpan(getApplicationContext(), R.drawable.icon,
ImageSpan.ALIGN_BOTTOM), 0, 1, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
button.setText(buttonLabel);
In meinem Fall musste ich auch das Android: Schwerkraftattribut des Buttons anpassen, damit es zentriert aussieht:
<Button
Android:id="@+id/button"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:minHeight="32dp"
Android:minWidth="150dp"
Android:gravity="center_horizontal|top" />
Ich weiß, dass ich diese Frage zu spät beantworte, aber das hat mir geholfen:
<FrameLayout
Android:layout_width="match_parent"
Android:layout_height="35dp"
Android:layout_marginBottom="5dp"
Android:layout_marginTop="10dp"
Android:background="@color/fb" >
<Button
Android:id="@+id/fbLogin"
Android:layout_width="wrap_content"
Android:layout_height="match_parent"
Android:layout_gravity="center"
Android:background="@null"
Android:drawableLeft="@drawable/ic_facebook"
Android:gravity="center"
Android:minHeight="0dp"
Android:minWidth="0dp"
Android:text="FACEBOOK"
Android:textColor="@Android:color/white" />
</FrameLayout>
Ich habe diese Lösung von hier aus gefunden: Android-Benutzeroberflächenprobleme: Erstellen einer Schaltfläche mit zentriertem Text und Symbol
Ich habe LinearLayout anstelle von Button verwendet. Der OnClickListener , den ich verwenden muss, funktioniert auch für LinearLayout.
<LinearLayout
Android:id="@+id/my_button"
Android:layout_width="match_parent"
Android:layout_height="wrap_content"
Android:background="@drawable/selector"
Android:gravity="center"
Android:orientation="horizontal"
Android:clickable="true">
<ImageView
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:layout_marginRight="15dp"
Android:adjustViewBounds="true"
Android:scaleType="fitCenter"
Android:src="@drawable/icon" />
<TextView
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:gravity="center"
Android:text="Text" />
</LinearLayout>
Sie können einen benutzerdefinierten Button verwenden, der misst und zeichnet, um ein linkes Zeichenelement aufzunehmen. Beispiel und Verwendung finden Sie hier
public class DrawableAlignedButton extends Button {
public DrawableAlignedButton(Context context, AttributeSet attrs) {
super(context, attrs);
}
public DrawableAlignedButton(Context context) {
super(context);
}
public DrawableAlignedButton(Context context, AttributeSet attrs, int style) {
super(context, attrs, style);
}
private Drawable mLeftDrawable;
@Override
//Overriden to work only with a left drawable.
public void setCompoundDrawablesWithIntrinsicBounds(Drawable left,
Drawable top, Drawable right, Drawable bottom) {
if(left == null) return;
left.setBounds(0, 0, left.getIntrinsicWidth(), left.getIntrinsicHeight());
mLeftDrawable = left;
}
@Override
protected void onDraw(Canvas canvas) {
//transform the canvas so we can draw both image and text at center.
canvas.save();
canvas.translate(2+mLeftDrawable.getIntrinsicWidth()/2, 0);
super.onDraw(canvas);
canvas.restore();
canvas.save();
int widthOfText = (int)getPaint().measureText(getText().toString());
int left = (getWidth()+widthOfText)/2 - mLeftDrawable.getIntrinsicWidth() - 2;
canvas.translate(left, (getHeight()-mLeftDrawable.getIntrinsicHeight())/2);
mLeftDrawable.draw(canvas);
canvas.restore();
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
int height = getMeasuredHeight();
height = Math.max(height, mLeftDrawable.getIntrinsicHeight() + getPaddingTop() + getPaddingBottom());
setMeasuredDimension(getMeasuredWidth(), height);
}
}
Verwendungszweck
<com.mypackage.DrawableAlignedButton
Android:layout_width="0dp"
Android:layout_height="wrap_content"
Android:layout_weight="1"
Android:drawableLeft="@drawable/my_drawable"
Android:gravity="center"
Android:padding="7dp"
Android:text="My Text" />
Ich bin vor kurzem auf das gleiche Problem gestoßen. Ich habe versucht, eine günstigere Lösung zu finden, also kam dies dazu.
<LinearLayout
Android:id="@+id/linearButton"
Android:layout_width="match_parent"
Android:layout_height="match_parent"
Android:background="@drawable/selector_button_translucent_ab_color"
Android:clickable="true"
Android:descendantFocusability="blocksDescendants"
Android:gravity="center"
Android:orientation="horizontal" >
<ImageView
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:contentDescription="@string/app_name"
Android:src="@drawable/ic_launcher" />
<TextView
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:text="@string/app_name"
Android:textColor="@Android:color/white" />
</LinearLayout>
Dann rufen Sie einfach die OnClickListener
auf LinearLayout
auf.
Hoffe, das hilft jemandem, denn es scheint ein sehr verbreitetes Problem zu sein. :)
Ich passe es an, indem ich links und rechts die Auffüllung wie folgt hinzufüge:
<Button
Android:layout_width="0dp"
Android:layout_height="wrap_content"
Android:layout_weight="1"
Android:id="@+id/btn_facebookact_like"
Android:text="@string/btn_facebookact_like"
Android:textColor="@color/black"
Android:textAllCaps="false"
Android:background="@color/white"
Android:drawableStart="@drawable/like"
Android:drawableLeft="@drawable/like"
Android:gravity="center"
Android:layout_gravity="center"
Android:paddingLeft="40dp"
Android:paddingRight="40dp"
/>
Das ist meine Lösung ..
<FrameLayout
Android:id="@+id/login_button_login"
Android:background="@drawable/apptheme_btn_default_holo_dark"
Android:layout_width="280dp"
Android:layout_gravity="center"
Android:layout_height="40dp">
<Button
Android:clickable="false"
Android:drawablePadding="15dp"
Android:layout_gravity="center"
style="@style/WhiteText.Small.Bold"
Android:drawableLeft="@drawable/lock"
Android:background="@color/transparent"
Android:text="LOGIN" />
</FrameLayout>
Ich weiß, dass diese Frage etwas älter ist, aber vielleicht sind Sie noch offen für Hinweise oder Problemumgehungen:
Erstellen Sie ein RelativeLayout "wrap_content" mit dem Schaltflächenbild als Hintergrund oder der Schaltfläche selbst als erstes Element des Layouts. Holen Sie sich ein LinearLayout und setzen Sie es auf "layout_centerInParent" und "wrap_content". Legen Sie dann Ihren Drawable als Bildansicht fest. Legen Sie zuletzt eine Textansicht mit Ihrem Text (Gebietsschema) fest.
im Grunde haben Sie diese Struktur:
RelativeLayout
Button
LinearLayout
ImageView
TextView
oder so:
RelativeLayout with "Android-specific" button image as background
LinearLayout
ImageView
TextView
Ich weiß, mit dieser Lösung gibt es viele Elemente, mit denen man sich auseinandersetzen muss, aber Sie können ganz einfach Ihren eigenen benutzerdefinierten Button erstellen und auch die exakte Position von Text und Drawables festlegen :)
Meine Lösung bestand darin, die Schaltfläche mit leichtgewichtigen <View ../>
-Elementen zu umgeben, die ihre Größe dynamisch ändern. Nachfolgend finden Sie einige Beispiele dafür, was damit erreicht werden kann:
Beachten Sie, dass der anklickbare Bereich der Schaltflächen in Beispiel 3 derselbe wie in 2 ist (d. H. Mit Leerzeichen). Dies unterscheidet sich von Beispiel 4, wo keine "unklickbaren" Lücken dazwischen liegen.
Code:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:layout_width="match_parent"
Android:layout_height="match_parent"
Android:orientation="vertical">
<TextView
Android:layout_marginStart="5dp"
Android:layout_marginLeft="5dp"
Android:layout_marginTop="10dp"
Android:layout_marginBottom="5dp"
Android:layout_width="match_parent"
Android:layout_height="wrap_content"
Android:textStyle="bold"
Android:text="Example 1: Button with a background color:"/>
<LinearLayout
Android:layout_width="match_parent"
Android:layout_height="wrap_content">
<View
Android:layout_width="0dp"
Android:layout_height="match_parent"
Android:layout_weight="1"/>
<Button
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:text="Button"
Android:textColor="@Android:color/white"
Android:drawableLeft="@Android:drawable/ic_secure"
Android:drawableStart="@Android:drawable/ic_secure"
Android:background="@Android:color/darker_gray"
Android:paddingStart="20dp"
Android:paddingEnd="20dp"
Android:layout_weight="0.3"/>
<!-- Play around with the above 3 values to modify the clickable
area and image alignment with respect to text -->
<View
Android:layout_width="0dp"
Android:layout_height="match_parent"
Android:layout_weight="1"/>
</LinearLayout>
<TextView
Android:layout_marginStart="5dp"
Android:layout_marginLeft="5dp"
Android:layout_marginTop="20dp"
Android:layout_marginBottom="5dp"
Android:layout_width="match_parent"
Android:layout_height="wrap_content"
Android:textStyle="bold"
Android:text="Example 2: Button group + transparent layout + spacers:"/>
<LinearLayout
Android:layout_width="match_parent"
Android:layout_height="wrap_content">
<View
Android:layout_width="0dp"
Android:layout_height="match_parent"
Android:layout_weight="1"/>
<Button
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:text="Button"
Android:textColor="@Android:color/white"
Android:drawableLeft="@Android:drawable/ic_secure"
Android:drawableStart="@Android:drawable/ic_secure"
Android:background="@Android:color/darker_gray"
Android:paddingStart="10dp"
Android:paddingEnd="10dp"
Android:layout_weight="1"/>
<View
Android:layout_width="0dp"
Android:layout_height="match_parent"
Android:layout_weight="1"/>
<Button
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:text="Button"
Android:textColor="@Android:color/white"
Android:drawableLeft="@Android:drawable/ic_secure"
Android:drawableStart="@Android:drawable/ic_secure"
Android:background="@Android:color/darker_gray"
Android:paddingStart="10dp"
Android:paddingEnd="10dp"
Android:layout_weight="1"/>
<View
Android:layout_width="0dp"
Android:layout_height="match_parent"
Android:layout_weight="1"/>
<Button
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:text="Button"
Android:textColor="@Android:color/white"
Android:drawableLeft="@Android:drawable/ic_secure"
Android:drawableStart="@Android:drawable/ic_secure"
Android:background="@Android:color/darker_gray"
Android:paddingStart="10dp"
Android:paddingEnd="10dp"
Android:layout_weight="1"/>
<View
Android:layout_width="0dp"
Android:layout_height="match_parent"
Android:layout_weight="1"/>
</LinearLayout>
<TextView
Android:layout_marginStart="5dp"
Android:layout_marginLeft="5dp"
Android:layout_marginTop="20dp"
Android:layout_marginBottom="5dp"
Android:layout_width="match_parent"
Android:layout_height="wrap_content"
Android:textStyle="bold"
Android:text="Example 3: Button group + colored layout:"/>
<LinearLayout
Android:layout_width="match_parent"
Android:layout_height="wrap_content"
Android:background="@Android:color/darker_gray">
<View
Android:layout_width="0dp"
Android:layout_height="match_parent"
Android:layout_weight="1"/>
<Button
style="?android:attr/buttonBarButtonStyle"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:text="Button"
Android:textColor="@Android:color/white"
Android:drawableLeft="@Android:drawable/ic_secure"
Android:drawableStart="@Android:drawable/ic_secure"
Android:background="@Android:color/darker_gray"
Android:paddingStart="10dp"
Android:paddingEnd="10dp"
Android:layout_weight="1"/>
<View
Android:layout_width="0dp"
Android:layout_height="match_parent"
Android:layout_weight="1"/>
<Button
style="?android:attr/buttonBarButtonStyle"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:text="Button"
Android:textColor="@Android:color/white"
Android:drawableLeft="@Android:drawable/ic_secure"
Android:drawableStart="@Android:drawable/ic_secure"
Android:background="@Android:color/darker_gray"
Android:paddingStart="10dp"
Android:paddingEnd="10dp"
Android:layout_weight="1"/>
<View
Android:layout_width="0dp"
Android:layout_height="match_parent"
Android:layout_weight="1"/>
<Button
style="?android:attr/buttonBarButtonStyle"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:text="Button"
Android:textColor="@Android:color/white"
Android:drawableLeft="@Android:drawable/ic_secure"
Android:drawableStart="@Android:drawable/ic_secure"
Android:background="@Android:color/darker_gray"
Android:paddingStart="10dp"
Android:paddingEnd="10dp"
Android:layout_weight="1"/>
<View
Android:layout_width="0dp"
Android:layout_height="match_parent"
Android:layout_weight="1"/>
</LinearLayout>
<TextView
Android:layout_marginStart="5dp"
Android:layout_marginLeft="5dp"
Android:layout_marginTop="20dp"
Android:layout_marginBottom="5dp"
Android:layout_width="match_parent"
Android:layout_height="wrap_content"
Android:textStyle="bold"
Android:text="Example 4 (reference): Button group + no spacers:"/>
<LinearLayout
Android:layout_width="match_parent"
Android:layout_height="wrap_content"
Android:background="@Android:color/darker_gray">
<Button
style="?android:attr/buttonBarButtonStyle"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:text="Button"
Android:textColor="@Android:color/white"
Android:drawableLeft="@Android:drawable/ic_secure"
Android:drawableStart="@Android:drawable/ic_secure"
Android:background="@Android:color/darker_gray"
Android:paddingStart="10dp"
Android:paddingEnd="10dp"
Android:layout_weight="1"/>
<Button
style="?android:attr/buttonBarButtonStyle"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:text="Button"
Android:textColor="@Android:color/white"
Android:drawableLeft="@Android:drawable/ic_secure"
Android:drawableStart="@Android:drawable/ic_secure"
Android:background="@Android:color/darker_gray"
Android:paddingStart="10dp"
Android:paddingEnd="10dp"
Android:layout_weight="1"/>
<Button
style="?android:attr/buttonBarButtonStyle"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:text="Button"
Android:textColor="@Android:color/white"
Android:drawableLeft="@Android:drawable/ic_secure"
Android:drawableStart="@Android:drawable/ic_secure"
Android:background="@Android:color/darker_gray"
Android:paddingStart="10dp"
Android:paddingEnd="10dp"
Android:layout_weight="1"/>
</LinearLayout>
</LinearLayout>
Sie können ein benutzerdefiniertes Widget erstellen:
Die Java-Klasse IButton:
public class IButton extends RelativeLayout {
private RelativeLayout layout;
private ImageView image;
private TextView text;
public IButton(Context context) {
this(context, null);
}
public IButton(Context context, AttributeSet attrs) {
this(context, attrs, 0);
}
public IButton(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
LayoutInflater inflater = (LayoutInflater) context
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View view = inflater.inflate(R.layout.ibutton, this, true);
layout = (RelativeLayout) view.findViewById(R.id.btn_layout);
image = (ImageView) view.findViewById(R.id.btn_icon);
text = (TextView) view.findViewById(R.id.btn_text);
if (attrs != null) {
TypedArray attributes = context.obtainStyledAttributes(attrs,R.styleable.IButtonStyle);
Drawable drawable = attributes.getDrawable(R.styleable.IButtonStyle_button_icon);
if(drawable != null) {
image.setImageDrawable(drawable);
}
String str = attributes.getString(R.styleable.IButtonStyle_button_text);
text.setText(str);
attributes.recycle();
}
}
@Override
public void setOnClickListener(final OnClickListener l) {
super.setOnClickListener(l);
layout.setOnClickListener(l);
}
public void setDrawable(int resId) {
image.setImageResource(resId);
}
}
Das Layout ibutton.xml
<RelativeLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:id="@+id/btn_layout"
Android:layout_width="match_parent"
Android:layout_height="match_parent"
Android:clickable="true" >
<ImageView
Android:id="@+id/btn_icon"
Android:layout_width="wrap_content"
Android:layout_height="fill_parent"
Android:layout_marginRight="2dp"
Android:layout_toLeftOf="@+id/btn_text"
Android:duplicateParentState="true" />
<TextView
Android:id="@+id/btn_text"
Android:layout_width="wrap_content"
Android:layout_height="fill_parent"
Android:layout_centerInParent="true"
Android:duplicateParentState="true"
Android:gravity="center_vertical"
Android:textColor="#000000" />
</RelativeLayout>
Um dieses benutzerdefinierte Widget zu verwenden:
<com.test.Android.widgets.IButton
Android:id="@+id/new"
Android:layout_width="fill_parent"
Android:layout_height="@dimen/button_height"
ibutton:button_text="@string/btn_new"
ibutton:button_icon="@drawable/ic_action_new" />
Sie müssen den Namespace für die benutzerdefinierten Attribute angeben Xmlns: ibutton = "http://schemas.Android.com/apk/res/com.test.Android.xxx" Where com. test.Android.xxx ist das Stammpaket der Anwendung.
Setzen Sie es einfach unter xmlns: Android = "http://schemas.Android.com/apk/res/Android".
Das letzte, was Sie brauchen, sind die benutzerdefinierten Attribute in der Datei attrs.xml.
In den Dateien attrs.xml
<?xml version="1.0" encoding="utf-8"?>
<resources>
<declare-styleable name="IButtonStyle">
<attr name="button_text" />
<attr name="button_icon" format="integer" />
</declare-styleable>
<attr name="button_text" />
</resources>
Um die Positionierung zu verbessern, wickeln Sie den benutzerdefinierten Button in ein LinearLayout ein, wenn Sie potenzielle Probleme mit RelativeLayout-Positionierungen vermeiden möchten.
Genießen!
Hatte ein ähnliches Problem, wollte aber Mitte zeichnen, ohne Text und ohne umschlossene Layouts. Die Lösung bestand darin, einen benutzerdefinierten Knopf zu erstellen und zusätzlich zu LINKS, RECHTS, OBEN, UNTEN einen weiteren Zeichenbereich hinzuzufügen. Sie können die Zeichenposition leicht ändern und sie in der gewünschten Position relativ zum Text haben.
CenterDrawableButton.Java
public class CenterDrawableButton extends Button {
private Drawable mDrawableCenter;
public CenterDrawableButton(Context context) {
super(context);
init(context, null);
}
public CenterDrawableButton(Context context, AttributeSet attrs) {
super(context, attrs);
init(context, attrs);
}
public CenterDrawableButton(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
init(context, attrs);
}
@TargetApi(Build.VERSION_CODES.Lollipop)
public CenterDrawableButton(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
super(context, attrs, defStyleAttr, defStyleRes);
init(context, attrs);
}
private void init(Context context, AttributeSet attrs){
//if (isInEditMode()) return;
if(attrs!=null){
TypedArray a = context.getTheme().obtainStyledAttributes(
attrs, R.styleable.CenterDrawableButton, 0, 0);
try {
setCenterDrawable(a.getDrawable(R.styleable.CenterDrawableButton_drawableCenter));
} finally {
a.recycle();
}
}
}
public void setCenterDrawable(int center) {
if(center==0){
setCenterDrawable(null);
}else
setCenterDrawable(getContext().getResources().getDrawable(center));
}
public void setCenterDrawable(@Nullable Drawable center) {
int[] state;
state = getDrawableState();
if (center != null) {
center.setState(state);
center.setBounds(0, 0, center.getIntrinsicWidth(), center.getIntrinsicHeight());
center.setCallback(this);
}
mDrawableCenter = center;
invalidate();
requestLayout();
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
if(mDrawableCenter!=null) {
setMeasuredDimension(Math.max(getMeasuredWidth(), mDrawableCenter.getIntrinsicWidth()),
Math.max(getMeasuredHeight(), mDrawableCenter.getIntrinsicHeight()));
}
}
@Override
protected void drawableStateChanged() {
super.drawableStateChanged();
if (mDrawableCenter != null) {
int[] state = getDrawableState();
mDrawableCenter.setState(state);
mDrawableCenter.setBounds(0, 0, mDrawableCenter.getIntrinsicWidth(),
mDrawableCenter.getIntrinsicHeight());
}
invalidate();
}
@Override
protected void onDraw(@NonNull Canvas canvas) {
super.onDraw(canvas);
if (mDrawableCenter != null) {
Rect rect = mDrawableCenter.getBounds();
canvas.save();
canvas.translate(getWidth() / 2 - rect.right / 2, getHeight() / 2 - rect.bottom / 2);
mDrawableCenter.draw(canvas);
canvas.restore();
}
}
}
attrs.xml
<resources>
<attr name="drawableCenter" format="reference"/>
<declare-styleable name="CenterDrawableButton">
<attr name="drawableCenter"/>
</declare-styleable>
</resources>
verwendungszweck
<com.virtoos.Android.view.custom.CenterDrawableButton
Android:id="@id/centerDrawableButton"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
app:drawableCenter="@Android:drawable/ic_menu_info_details"/>
Sie können die Schaltfläche über einem LinearLayout platzieren
<RelativeLayout
Android:layout_width="match_parent"
Android:layout_height="@dimen/activity_login_fb_height"
Android:background="@mipmap/bg_btn_fb">
<LinearLayout
Android:layout_width="match_parent"
Android:layout_height="match_parent"
Android:gravity="center">
<TextView
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:id="@+id/lblLoginFb"
Android:textColor="@color/white"
Android:drawableLeft="@mipmap/icon_fb"
Android:textSize="@dimen/activity_login_fb_textSize"
Android:text="Login with Facebook"
Android:gravity="center" />
</LinearLayout>
<Button
Android:layout_width="match_parent"
Android:layout_height="match_parent"
Android:id="@+id/btnLoginFb"
Android:background="@color/transparent"
/>
</RelativeLayout>
<style name="captionOnly">
<item name="Android:background">@null</item>
<item name="Android:clickable">false</item>
<item name="Android:focusable">false</item>
<item name="Android:minHeight">0dp</item>
<item name="Android:minWidth">0dp</item>
</style>
<FrameLayout
style="?android:attr/buttonStyle"
Android:layout_width="match_parent"
Android:layout_height="wrap_content" >
<Button
style="@style/captionOnly"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:layout_gravity="center"
Android:drawableLeft="@Android:drawable/ic_delete"
Android:gravity="center"
Android:text="Button Challenge" />
</FrameLayout>
Setzen Sie das FrameLayout in LinearLayout und setzen Sie die Ausrichtung auf Horizontal.
Wenn Sie eine der Lösungen von custom view verwenden, müssen Sie vorsichtig sein, da sie häufig bei langem oder mehrzeiligem Text ausfallen. Ich schrieb einige Antworten um, ersetzte onDraw()
und verstand, dass dies ein falscher Weg war.
Dies kann ein alter/geschlossener Thread sein, aber ich habe überall gesucht, dass es nicht nützlich war, bis ich mich entschied, meine eigene Lösung zu erstellen. Wenn hier jemand nach Antworten sucht, versuchen Sie es hier. Vielleicht sparen Sie sich eine Minute zum Nachdenken
<LinearLayout
Android:id="@+id/llContainer"
Android:layout_width="match_parent"
Android:layout_height="match_parent"
Android:background="@drawable/selector"
Android:clickable="true"
Android:gravity="center"
Android:orientation="vertical"
Android:padding="10dp"
Android:textStyle="bold">
<TextView
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:gravity="center"
Android:text="This is a text" />
<ImageView
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:src="@drawable/icon_image />
</LinearLayout>
Da das lineare Layout als Container fungiert und derjenige ist, der über die Auswahl verfügt, würde das Anklicken des gesamten linearen Layouts genau so aussehen, wie es sein sollte. Wenn Sie möchten, dass beide zentriert sind, verwenden Sie relative insteaf. Wenn Sie möchten, dass es horizontal zentriert ist, ändern Sie die Ausrichtung in horizontal.
Notieren Sie NICHT - vergessen Sie nicht, Android hinzuzufügen: clickable = "true" zu Ihrem Hauptcontainer (relativ oder linear), damit die Aktion ausgeführt wird.
Auch dies kann ein alter Thread sein, kann aber trotzdem jemandem helfen.
-cheers hoffen es hilft - happycodings.
Schmutzige Verlegenheit.
Android:paddingTop="10dp"
Android:drawableTop="@drawable/ic_src"
Richtige Polsterung den Zweck lösen. Verwenden Sie für verschiedene Bildschirme jedoch unterschiedliche Auffüllungen und legen Sie diese in dimens resource in den entsprechenden Wertordner.
Verwenden Sie RelativeLayout (Container) und Android: layout_centerHorizontal = "true" , Mein Beispiel:
<RelativeLayout
Android:layout_width="0dp"
Android:layout_height="match_parent"
Android:layout_weight="1" >
<CheckBox
Android:layout_width="wrap_content"
Android:layout_height="match_parent"
Android:layout_centerHorizontal="true"
Android:layout_gravity="center"
Android:layout_marginBottom="5dp"
Android:layout_marginLeft="10dp"
Android:layout_marginTop="5dp"
Android:button="@drawable/bg_fav_detail"
Android:drawablePadding="5dp"
Android:text=" Favorite" />
</RelativeLayout>
die öffentliche Klasse DrawableCenterTextView erweitert 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);
}
}
Andere Möglichkeit, Button-Thema zu behalten.
<Button
Android:id="@+id/pf_bt_edit"
Android:layout_height="@dimen/standard_height"
Android:layout_width="match_parent"
/>
<LinearLayout
Android:layout_width="0dp"
Android:layout_height="0dp"
Android:layout_alignBottom="@id/pf_bt_edit"
Android:layout_alignLeft="@id/pf_bt_edit"
Android:layout_alignRight="@id/pf_bt_edit"
Android:layout_alignTop="@id/pf_bt_edit"
Android:layout_margin="@dimen/margin_10"
Android:clickable="false"
Android:elevation="20dp"
Android:gravity="center"
Android:orientation="horizontal"
>
<ImageView
Android:layout_width="wrap_content"
Android:layout_height="match_parent"
Android:adjustViewBounds="true"
Android:clickable="false"
Android:src="@drawable/ic_edit_white_48dp"/>
<TextView
Android:id="@+id/pf_tv_edit"
Android:layout_width="wrap_content"
Android:layout_height="match_parent"
Android:layout_marginLeft="@dimen/margin_5"
Android:clickable="false"
Android:gravity="center"
Android:text="@string/pf_bt_edit"/>
</LinearLayout>
Mit dieser Lösung fügen Sie @ Color/your_color @ Color/your_highlight_color .__ hinzu. In Ihrem Aktivitätsthema können Sie das Matherial-Thema auf Lollipop mit Schatten und Ripple sowie für die vorherige Version einen flachen Button mit Ihrer Farbe und dem hervorgehobenen Farbton verwenden, wenn Sie darauf drücken.
Darüber hinaus kann mit dieser Lösung das Bild automatisch verkleinert werden
Ergebnis: Zuerst auf Lollipop-Gerät Zweitens: Auf Pre-Lollipop-Gerät 3.: Vor Lollipop-Gerät drücken Sie die Taste
Wie von Rodja vorgeschlagen, gibt es vor 4.0 keine direkte Möglichkeit, den Text mit dem Zeichenelement zu zentrieren. Durch das Setzen eines padding_left-Werts wird der Zeichner tatsächlich vom Rand weg bewegt. Mein Vorschlag ist daher, dass Sie zur Laufzeit genau berechnen, wie viele Pixel Sie von der linken Begrenzungslinie aus zeichnen müssen, und diese dann mit setPadding .__ übergeben. Ihre Berechnung kann etwa so aussehen
int paddingLeft = (button.getWidth() - drawableWidth - textWidth) / 2;
Die Breite Ihres Zeichenbereichs ist festgelegt und Sie können nachschlagen und die Textbreite berechnen oder schätzen.
Schließlich müssten Sie den Auffüllwert mit der Bildschirmdichte multiplizieren, was Sie mit DisplayMetrics tun können.
Ich teste es nicht, aber es scheint, dass Sie die CenteredContentButton-Bibliothek verwenden können
Ich denke, Android: Schwerkraft = "Mitte" sollte funktionieren
benutze diesen Android:background="@drawable/ic_play_arrow_black_24dp"
setzen Sie einfach den Hintergrund auf das Symbol, das Sie zentrieren möchten
Alle Antworten sind veraltet !!!
Sie können jetzt die MaterialButton
verwenden, mit der Sie die Symbolschwerkraft einstellen können.
<com.google.Android.material.button.MaterialButton
Android:id="@+id/btnDownloadPdf"
Android:layout_width="0dp"
Android:layout_height="56dp"
Android:layout_margin="16dp"
Android:gravity="center"
Android:textAllCaps="true"
app:backgroundTint="#fc0"
app:icon="@drawable/ic_pdf"
app:iconGravity="textStart"
app:iconPadding="10dp"
app:iconTint="#f00"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
tools:text="Download Pdf" />
Was passiert, wenn Sie Android ausprobieren: gravity = "center_horizontal"?
Ich habe textView
mit dem Symbol zentriert, indem Sie paddingLeft
und und textView auf left | centerVertical ausrichten. und für eine kleine Lücke zwischen Ansicht und Symbol verwendete ich drawablePadding
<Button
Android:id="@+id/have_it_main"
Android:layout_width="match_parent"
Android:layout_height="wrap_content"
Android:background="@drawable/textbox"
Android:drawableLeft="@drawable/have_it"
Android:drawablePadding="30dp"
Android:gravity="left|center_vertical"
Android:paddingLeft="60dp"
Android:text="Owner Contact"
Android:textColor="@Android:color/white" />