2010-12-10 53 views
26

Je suis générer RadioButtons dynamiquement avecbouton android RadioButton gravité drawable

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 voir, je suis en train désespérément de mettre la gravité du bouton drawable centre, mais sans raison est toujours le centre et Aligné à gauche, Heres le style par défaut de raison- 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> 

Est-il possible que je peux aligner le bouton drawable pour centrer?

Répondre

66

Selon CompoundButton.onDraw() source code, 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 passer outre onDraw().

EXEMPLE PLUS TARD AJOUTÉE:

Ok, donc 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> 

En second lieu ici est 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 vous devez mettre en res/valeurs de sorte que le le code peut obtenir des 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> 
+0

Pouvez-vous fournir un exemple d'extrait? Je ne suis pas capable de le comprendre! – Shardul

+0

Oui, c'est vraiment une valeur de 1000. Mais je ne l'accepte pas puisque je l'ai approché avec selon moi d'une manière plus simple. Pas de manque de respect. Encore merci! – Shardul

+8

Merci à un groupe Shardul. Permettez-moi de souligner que votre version a un constructeur personnalisé, n'utilise pas les attributs correctement, et ne peut donc pas être utilisé comme un substitut de remplacement pour RadioButton. Ça ne fait rien. C'est la dernière fois que je vais à ce genre de problème. –

6

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"/> 

mise à 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> 
+0

cela ne résout pas le problème - le bouton de la radio sera toujours aligné sur la gauche –

+0

je mets à jour mon code xml, espérons utile pour u @ ılǝ – hoot

+0

huée, merci pour l'effort - mais toujours non. La tâche consiste à aligner l'objet 'button', vous utilisez drawableTop. Voir la réponse acceptée - vous devez implémenter un RadioButton personnalisé pour y parvenir. –

0

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

Fondamentalement - j'ai un groupe de boutons radio alignés horizontalement, et en développant la couleur de fond à la 20dp gauche (ou tout autre moitié de la largeur de votre du bouton radio) il semble que c'est centré.