web-dev-qa-db-fra.com

android RadioButton bouton gravable gravité

Je génère des RadioButtons de manière dynamique avec

RadioButton radioButton=new RadioButton(context);  

LayoutParams layoutParams=new LayoutParams(radioWidth,radioHeight);
layoutParams.gravity=Gravity.CENTER;

radioButton.setLayoutParams(layoutParams);
radioButton.setGravity(Gravity.CENTER);

BitmapDrawable bitmap = ((BitmapDrawable)drawableResource);
bitmap.setGravity(Gravity.CENTER);

radioButton.setBackgroundDrawable(getResources().getDrawable(R.drawable.itabs_radio));
radioButton.setButtonDrawable(bitmap);

comme vous pouvez le constater, j'essaie désespérément de régler le centre de gravité du bouton, mais sans raison, il est toujours centré et aligné à gauche, voici la raison - le style par défaut du bouton radio Android:

<style name="Widget.CompoundButton">
<item name="Android:focusable">true</item> 
<item name="Android:clickable">true</item>
<item name="Android:textAppearance">?android:attr/textAppearance</item> 
<item name="Android:textColor">?android:attr/textColorPrimaryDisableOnly</item> 
<item name="Android:gravity">center_vertical|left</item> 
</style>

<style name="Widget.CompoundButton.RadioButton">
<item name="Android:background">@Android:drawable/btn_radio_label_background</item> 
<item name="Android:button">@Android:drawable/btn_radio</item> 
</style>

Y a-t-il un moyen que je peux aligner le bouton pour dessiner au centre?

26
Shardul

Selon CompoundButton.onDraw() code source il est toujours aligné à gauche.

(Notez la ligne buttonDrawable.setBounds(0, y, buttonDrawable.getIntrinsicWidth(), y + height);)

Vous devrez dériver une nouvelle classe de RadioButton et remplacer onDraw().

EXEMPLE AJOUTE PLUS TARD:

Ok, alors voici ce que vous faites. Tout d'abord, voici une mise en page:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:orientation="vertical"
    Android:layout_width="fill_parent"
    Android:layout_height="fill_parent"
    >
<org.test.TestProj.RadioButtonCenter
    Android:id="@+id/myview"
    Android:layout_width="fill_parent" 
    Android:layout_height="100dp" 
    Android:layout_centerInParent="true"
    Android:text="Button test"
    />
</RelativeLayout>

Deuxièmement, voici le RadioButtonCenter à dessin personnalisé:

package org.test.TestProj;

import Android.content.Context;
import Android.content.res.TypedArray;
import Android.util.AttributeSet;
import Android.view.Gravity;
import Android.widget.RadioButton;
import Android.graphics.Canvas;
import Android.graphics.drawable.Drawable;

public class RadioButtonCenter extends RadioButton {

    public RadioButtonCenter(Context context, AttributeSet attrs) {
        super(context, attrs);
        TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.CompoundButton, 0, 0);
        buttonDrawable = a.getDrawable(1);
        setButtonDrawable(Android.R.color.transparent);
    }
    Drawable buttonDrawable;


     @Override
        protected void onDraw(Canvas canvas) {
            super.onDraw(canvas);

            if (buttonDrawable != null) {
                buttonDrawable.setState(getDrawableState());
                final int verticalGravity = getGravity() & Gravity.VERTICAL_GRAVITY_MASK;
                final int height = buttonDrawable.getIntrinsicHeight();

                int y = 0;

                switch (verticalGravity) {
                    case Gravity.BOTTOM:
                        y = getHeight() - height;
                        break;
                    case Gravity.CENTER_VERTICAL:
                        y = (getHeight() - height) / 2;
                        break;
                }

            int buttonWidth = buttonDrawable.getIntrinsicWidth();
            int buttonLeft = (getWidth() - buttonWidth) / 2;
            buttonDrawable.setBounds(buttonLeft, y, buttonLeft+buttonWidth, y + height);
                buttonDrawable.draw(canvas);
            }
        }   
}

Enfin, voici un fichier attrs.xml que vous devez insérer dans res/values ​​afin que le code puisse être attribué aux attributs définis par la plate-forme.

<?xml version="1.0" encoding="utf-8"?>
<resources>    
     <declare-styleable name="CompoundButton">
        <attr name="Android:button" />
    </declare-styleable>
</resources>
68
Reuben Scratton

Solution simple, vous pouvez ajouter un arrière-plan à RadioButton ou définir background = "@ null",.

<RadioButton
                Android:id="@+id/cp_rd_btn"
                Android:layout_width="0dp"
                Android:layout_height="wrap_content"
                Android:layout_weight="1"
                Android:background="@null"/>

mis à jour:

<RadioGroup
                Android:layout_width="fill_parent"
                Android:layout_height="wrap_content"
                Android:orientation="horizontal" >

                <RadioButton
                    Android:layout_width="0dp"
                    Android:layout_height="wrap_content"
                    Android:layout_weight="1"
                    Android:background="@null"
                    Android:button="@null"
                    Android:drawableTop="@drawable/account_coolme_selector"
                    Android:gravity="center" />

                <RadioButton
                    Android:layout_width="0dp"
                    Android:layout_height="fill_parent"
                    Android:layout_weight="1"
                    Android:background="@null"
                    Android:button="@null"
                    Android:drawableTop="@drawable/account_qq_selector"
                    Android:gravity="center"
                    />
            </RadioGroup>
7
hoot

<radiogroup Android:paddingLeft = "20dp" Android:background="@color/gray">

Fondamentalement - j'ai un groupe radio aligné horizontalement, et en développant la couleur d'arrière-plan à gauche de 20dp (ou la moitié de la largeur de votre bouton radio), il apparaît comme s'il était centré.

0
Anna Billstrom