2010-12-10 13 views
26

Ich bin Radiobuttons dynamisch mitandroid RadioButton- Taste ziehbar Schwerkraft

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); 

erzeugt wird, wie man sehen kann ich verzweifelt versuche Schwere der Taste ziehbar zum Zentrum zu setzen, aber ohne Grund seines immer im Mittelpunkt und links ausgerichtet, here der angemessene der Standardstil von android Radiobutton:

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

gibt es eine Möglichkeit I-Taste ziehbar zum Zentrum ausrichten kann?

Antwort

66

Nach CompoundButton.onDraw() source code ist es immer linksbündig.

(Beachten Sie die Zeile buttonDrawable.setBounds(0, y, buttonDrawable.getIntrinsicWidth(), y + height);)

Sie haben eine neue Klasse von RadioButton und außer Kraft setzen onDraw() abzuleiten.

Beispiel später hinzugefügt:

Ok, also hier, was Sie tun. Zum einen ist hier ein Layout:

<?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> 

Zweitens hier ist die individuelle Zieh RadioButtonCenter:

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); 
      } 
     } 
} 

Schließlich ist hier ein attrs.xml Datei müssen Sie in res setzen/Werte so die Code kann bei plattformdefinierten Attributen abgerufen werden.

<?xml version="1.0" encoding="utf-8"?> 
<resources>  
    <declare-styleable name="CompoundButton"> 
     <attr name="android:button" /> 
    </declare-styleable> 
</resources> 
+0

Können Sie ein Beispiel-Snippet bereitstellen? Ich bin nicht in der Lage es herauszufinden! – Shardul

+0

Ja, es ist wirklich im Wert von 1000s. Aber ich akzeptiere es nicht, seit ich es mit einem einfacheren Weg an mich herangetragen habe. Keine Respektlosigkeit. Danke nochmal! – Shardul

+8

Dank ein Haufen Shardul. Gestatten Sie mir, darauf hinzuweisen, dass Ihre Version über einen benutzerdefinierten Konstruktor verfügt, Attribute nicht ordnungsgemäß verwendet und daher nicht als Ersatz für RadioButton verwendet werden kann. Vergiss es. Das ist das letzte Mal, dass ich solche Schwierigkeiten habe. –

6

Einfache Lösung, können Sie einen Hintergrund zu RadioButton hinzufügen oder Hintergrund = "@ null",.

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

aktualisiert:

<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

dies löst das Problem nicht - der Knopf des Radios wird immer noch nach links ausgerichtet –

+0

ich update meine XML-Code, hoffe nützlich für Sie @ – hoot

+0

Hupen, danke für die Mühe - aber immer noch nein. Die Aufgabe besteht darin, das Objekt "button" auszurichten, indem Sie drawableTop verwenden. Sehen Sie sich die akzeptierte Antwort an - Sie müssen einen benutzerdefinierten RadioButton implementieren, um dies zu erreichen. –

0

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

Grundsätzlich - ich eine horizontal ausgerichtete Radio-Gruppe haben, und durch die Hintergrundfarbe auf der linken Seite 20DP Erweiterung (oder was auch immer 1/2 Ihrer Breite des Radioknopfes) scheint es, als ob es zentriert ist.

Verwandte Themen