Traté de llenar RadioButtons de RadioGroup en "onCreateMethod" en lugar de usar XML porque mi propósito es obtenerlo de algún tipo de base de datos u otro modelo de objetos comerciales que funcione con aleatoriedad. Los RadioButtons están bien, pero no sucede nada cuando hago clic en ellos, de lo contrario, cuando creé en el archivo de actividad XML, ni un mensaje de registro ni un brindis de prueba. Por cierto, como dije, necesito crear los botones por código, gracias, es mi primer paso en Android.

XML de mi actividad:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/quiz"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
</LinearLayout>

Mi código:

public class ListaAlunosActivity extends AppCompatActivity {


    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_lista_alunos);

        LinearLayout questoesQuiz = (LinearLayout) findViewById(R.id.quiz);
        // Log.d(TAG,"Populate List View; Displaying Data in the List View");

        ArrayList<String> dataList = new ArrayList<>(Arrays.asList("sup1", "sup2", "sup3"));
        RadioGroup listaDeQuestoes = new RadioGroup(this);
        listaDeQuestoes.setOrientation(RadioGroup.VERTICAL);
        RadioGroup.LayoutParams lp;

        for (int i = 0; i < dataList.size(); i++) {
            RadioButton botao = new RadioButton(this);
            botao.setText(dataList.get(i));
            lp = new RadioGroup.LayoutParams(RadioGroup.LayoutParams.MATCH_PARENT, RadioGroup.LayoutParams.MATCH_PARENT);
            listaDeQuestoes.addView(botao, lp);
        }
        questoesQuiz.addView(listaDeQuestoes);
    }


    public void onRadioButtonClicked(View view) {

        boolean checked = ((RadioButton) view).isChecked();


        final String TAG = "MyActivity";


        Log.v("On clicked working", "clicado");

        int id = view.getId();


        Toast toast2 = Toast.makeText(this, "toast working", Toast.LENGTH_LONG);
        toast2.setGravity(Gravity.CENTER_HORIZONTAL | Gravity.CENTER_VERTICAL, 0, 0);
        toast2.show();
  }
}

¡Los botones están bien!

Buttons are okay

1
JamesB 8 sep. 2018 a las 00:58

4 respuestas

La mejor respuesta

El uso de onClick para encontrar el botón de selección seleccionado no es la mejor solución, pero como desea usar onClick, le mostraré cómo hacerlo con cambios mínimos en su código. realice estos tres cambios en su código:

public class ListaAlunosActivity extends AppCompatActivity 
        implements View.OnClickListener {// <------ 1. implement OnClickListener

protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_lista_alunos);

        LinearLayout questoesQuiz = (LinearLayout) findViewById(R.id.quiz);
        // Log.d(TAG,"Populate List View; Displaying Data in the List View");

        ArrayList<String> dataList = new ArrayList<>(Arrays.asList("sup1", "sup2", "sup3"));
        RadioGroup listaDeQuestoes = new RadioGroup(this);
        listaDeQuestoes.setOrientation(RadioGroup.VERTICAL);
        RadioGroup.LayoutParams lp;

        for (int i = 0; i < dataList.size(); i++) {
            RadioButton botao = new RadioButton(this);
            botao.setOnClickListener(this);//  <---------- 2.add this line
            botao.setText(dataList.get(i));
            lp = new RadioGroup.LayoutParams(RadioGroup.LayoutParams.MATCH_PARENT, RadioGroup.LayoutParams.MATCH_PARENT);
            listaDeQuestoes.addView(botao, lp);
        }
        questoesQuiz.addView(listaDeQuestoes);
    }
@Override
public abstract void onClick (View v){ //<-------- 3. override onClick
   boolean checked = ((RadioButton) v).isChecked();


        final String TAG = "MyActivity";


        Log.v("On clicked working", "clicado");

        int id = v.getId();// your radio buttons have no id thus use title instead of id:
        String title = ((RadioButton) v).getText();


        Toast toast2 = Toast.makeText(this, "toast working", Toast.LENGTH_LONG);
        toast2.setGravity(Gravity.CENTER_HORIZONTAL | Gravity.CENTER_VERTICAL, 0, 0);
        toast2.show();
}
2
Bahman 8 sep. 2018 a las 20:18

Si te fijas bien, tu onRadioButtonClicked es solo un método que nunca se llama. Ahora lo que tiene que hacer es hacer que la Actividad implemente RadioGroup.OnCheckedChangeListener. Y en el método onCheckedChanged, haga el Toast y funcionará. Aquí está el código.

public class ListaAlunosActivity extends AppCompatActivity implements RadioGroup.OnCheckedChangeListener {


protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_lista_alnus);

    LinearLayout questoesQuiz = (LinearLayout) findViewById(R.id.quiz);
    // Log.d(TAG,"Populate List View; Displaying Data in the List View");

    ArrayList<String> dataList = new ArrayList<>(Arrays.asList("sup1", "sup2", "sup3"));
    RadioGroup listaDeQuestoes = new RadioGroup(this);
    listaDeQuestoes.setOrientation(RadioGroup.VERTICAL);
    RadioGroup.LayoutParams lp;

    for (int i = 0; i < dataList.size(); i++) {
        RadioButton botao = new RadioButton(this);
        botao.setId(i);
        botao.setText(dataList.get(i));
        lp = new RadioGroup.LayoutParams(RadioGroup.LayoutParams.MATCH_PARENT, RadioGroup.LayoutParams.MATCH_PARENT);
        listaDeQuestoes.addView(botao, lp);
    }
    questoesQuiz.addView(listaDeQuestoes);

    listaDeQuestoes.setOnCheckedChangeListener(this);
}



@Override
public void onCheckedChanged(RadioGroup group, int checkedId) {
    Toast toast2 = Toast.makeText(this, "toast working for id "+ checkedId, Toast.LENGTH_LONG);
    toast2.setGravity(Gravity.CENTER_HORIZONTAL | Gravity.CENTER_VERTICAL, 0, 0);
    toast2.show();

}

}

Hice esto y funciona perfectamente

2
ngenge 7 sep. 2018 a las 22:43

No estoy completamente seguro de qué debe hacer su código, pero usaría un setOnCheckedChangeListener en lugar de onClick.

Algo como esto

    listaDeQuestoes.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener()
    {
        @Override
        public void onCheckedChanged(RadioGroup group, int checkedId) {
            final String TAG = "MyActivity"; // not used?

            Log.v("On clicked working", "clicado");

            // Note checkedId is +1 when accessing the arraylist so needs to be decremented to get a list item
            Toast toast2 = Toast.makeText(ListaAlunosActivity.this, "toast working clicked (" + checkedId + ") [" + dataList.get(checkedId - 1) + "]", Toast.LENGTH_LONG);
            toast2.setGravity(Gravity.CENTER_HORIZONTAL | Gravity.CENTER_VERTICAL, 0, 0);
            toast2.show();
        }
    });

El Toast está funcionando y le mostré cómo puede determinar en qué botón se hizo clic y cómo acceder a su matriz de datos con él, si lo desea.

2
nobody special 7 sep. 2018 a las 22:51

La razón principal de esto, como señala BAHMAN, es que no ha configurado ningún oyente. SIN EMBARGO. Establecer un oyente en los botones no es una muy buena idea. Es mejor configurarlo en el grupo de radio. Y es mejor tener sus elementos de diseño en su archivo de diseño. Esto los hace más fáciles de modificar y comprender.

Otra cosa que es la preferencia personal: prefiero implementar el oyente como una clase anónima donde se establece. Las soluciones donde la clase implementa al oyente hacen que sea más difícil de leer para clases grandes donde puede ser molesto ir en busca de oyentes. Podría hacer una excepción si el oyente es muy complejo o si es algo que podría usarse más de una vez.

También limpié un poco el código. Comentarios agregados donde hice

De todos modos, así es como escribiría este código:

Diseño de actividad principal:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/quiz"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <RadioGroup
        android:id="@+id/radio_button_list"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />
</LinearLayout>

Código de actividad principal:

public class ListaAlunosActivity extends AppCompatActivity {
    // I put your tag at the top of the class so it's more useful
    public static final String TAG = "ListaAlunosActivity"; 

    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_lista_alunos);

        // You didn't really need an arraylist here for this static content.
        // I just made it an array
        String[] dataList = {"sup1", "sup2", "sup3"}; 

        // Get this from your layout instead of adding it manually.
        // It's a cleaner way to set up the layout that makes the
        // code more maintainable
        RadioGroup listaDeQuestoes = findViewById(R.id.radio_button_list);

        // I changed this to a for each loop because it's a little cleaner
        for (String name : dataList){
            RadioButton botao = new RadioButton(this);
            botao.setText(name);
            listaDeQuestoes.addView(botao);
        }

        // This is the code that will react to the new radio button being selected 
        listaDeQuestoes.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(RadioGroup group, int checkedId) {
                // Either way we do it, we need to grab the view to get the name
                RadioButton buttonView = group.findViewById(checkedId);

                // You can use this code to get the index if you need it
                int checkedIndex = group.indexOfChild(buttonView);

                // And you can use either of these methods to get the name:
                String buttonNameFromView = buttonView.getText().toString();
                String buttonNameFromDataSource = dataList[checkedIndex];

                String output = "Button with Id: " + checkedId + " and Name: " + buttonNameFromView + " was clicked";

                Log.v(TAG, output);

                Toast toast = Toast.makeText(ListaAlunosActivity.this, output, Toast.LENGTH_LONG);
                // I set gravity to just center here.  This is the same as center_vertical | center_horizontal.  Personally, I wouldn't set it at all.
                toast.setGravity(Gravity.CENTER, 0, 0);
                toast.show();
            }
        });
    }
}
2
rexar5 10 sep. 2018 a las 21:42