2010-12-10 16 views
26

Sana umutsuzca merkeze düğme çekilebilir ciddiyetini ayarlamak çalışıyorum gördüğünüz gibiandroid RadioButton düğmesi çekilebilir yerçekimi

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

dinamik RadioButtons üreten, ama sebepsiz onun her zaman merkezi ve heres, sola dayalı android radyo düğmesinin gerekçeyi varsayılan stil:

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

Ben düğmesi çekilebilir merkezi hizaya herhangi bir yolu var mı?

cevap

66

CompoundButton.onDraw() source code'a göre, her zaman sola hizalanmış.

Sen RadioButton gelen yeni bir sınıf türetmek ve onDraw() geçersiz kılmak zorunda kalacak

(çizgi buttonDrawable.setBounds(0, y, buttonDrawable.getIntrinsicWidth(), y + height); unutmayın).

ÖRNEK SONRA EKLENDİ: işte

Tamam, böyle yapar./

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

, burada res koymak gerekir bir attrs.xml dosya yüzden değerleri: İkincisi burada

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

özel çizim RadioButtonCenter oluyor: Birincisi, burada bir düzen var kod, platform tanımlı özniteliklerde edinilebilir.

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

Örnek bir snippet sağlayabilir misiniz? Anlayamıyorum! – Shardul

+0

Evet, gerçekten 1000'ler değerinde. Ama ona göre yaklaştığımdan daha basit bir şekilde kabul etmiyorum. Saygısızlık yok. Yine Thanx! – Shardul

+8

Teşekkürler bir grup Shardul. Sürümünüzün özel bir kurucuya sahip olduğunu, özelliklerin uygun şekilde kullanılmadığını ve bu nedenle de RadioButton için bir drop-in yedeği olarak kullanılamayacağını belirtmeme izin verin. Boşver. En son bu tür sorunlara gittim. –

6

Basit çözüm, sen RadioButton için bir arka plan ekleyebilir veya set arka plan = "@ boş". Bir yatay hizalanmış radyo grubu var ve sol 20dp Arka plan rengini genişleterek (veya genişliğinin ne olursa olsun 1/2 - Temelde

<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

Bu sorunu çözmezse - hayır hala ama - radyonun düğmesini hala i –

+0

hizalanmış olacaktır. Görev 'button' nesnesini hizalamaktır, drawableTop kullanıyorsunuz. Kabul edilen cevaba bakın - bunu başarmak için özel bir RadioButton uygulamanız gerekir. – hoot

+0

yuh ılǝ u @ için çaba için teşekkür benim xml kodunu, umut usefull güncellemek sola –

0

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

:

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

updated radyo düğmesi) ortalanmış gibi görünür.