pulsante di pulsante di Android RadioButton gravità

Sto generando RadioButton in modo dinamico con

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

come puoi vedere sto cercando disperatamente di impostare la gravità del pulsante estraibile al centro, ma senza una ragione è sempre centrato e allineato a sinistra, ecco il motivo: lo stile predefinito del pulsante di scelta Android:

  true true ?android:attr/textAppearance ?android:attr/textColorPrimaryDisableOnly center_vertical|left   @android:drawable/btn_radio_label_background @android:drawable/btn_radio  

C’è un modo in cui posso allineare il pulsante estraibile al centro?

Secondo il codice sorgente di CompoundButton.onDraw() è sempre allineato a sinistra.

(Nota il buttonDrawable.setBounds(0, y, buttonDrawable.getIntrinsicWidth(), y + height); )

Dovrai derivare una nuova class da RadioButton e sovrascrivere onDraw() .

ESEMPIO AGGIUNTO SUCCESSIVO:

Ok, ecco cosa fai. Innanzitutto, ecco un layout:

 < ?xml version="1.0" encoding="utf-8"?>    

In secondo luogo, ecco il disegno personalizzato 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); } } } 

Infine, ecco un file attrs.xml che devi inserire in res / values ​​in modo che il codice possa ottenere attributi definiti dalla piattaforma.

 < ?xml version="1.0" encoding="utf-8"?>      

Soluzione semplice, puoi aggiungere uno sfondo a RadioButton o impostare background = “@ null”,.

  

aggiornamento:

     

Fondamentalmente, ho un gruppo radio allineato orizzontalmente e espandendo il colore di sfondo a sinistra 20dp (o qualunque 1/2 della larghezza del pulsante di opzione) appare come se fosse centrato.