-1
votes

App se bloque en essayant de faire sauter une boîte de dialogue

J'ai un bouton dans ma disposition d'activité. Lorsque le bouton est cliqué sur une boîte de dialogue apparaît. Lorsque je tapote en dehors des limites de la boîte de dialogue, la boîte de dialogue disparaît. (Je n'ai aucun problème avec ce problème).

Mais quand je clique sur le bouton sur le bouton, je m'attends à ce que la boîte de dialogue apparaisse à nouveau mais que l'application se bloque à la place. P>

Je suis juste Jouer avec des dialogues pour la mettre en œuvre réellement dans ma vraie application forte> p>

My StackTrace: P>

public class MainActivity extends AppCompatActivity {
    private Spinner spinner;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        ArrayList<String> avc = new ArrayList<String>();
        avc.add("sb");
        avc.add("eerig");
        avc.add("sb");
        avc.add("eerig");
        avc.add("sb");
        avc.add("eerig");
        avc.add("sb");
        avc.add("eerig");
        ArrayAdapter adapter = new ArrayAdapter(this, android.R.layout.simple_spinner_dropdown_item, avc);
        spinner = new Spinner(this);
        spinner.setAdapter(adapter);

        findViewById(R.id.button).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);
                builder.setTitle("abc");
                builder.setMessage("abcde");
                builder.setView(spinner);
                builder.show();
            }
        });
    }
}


0 commentaires

3 Réponses :


2
votes

Ce problème se produit à cause de ce spinner code> qui est déjà attaché à la boîte de dialogue précédente ou dans un autre mot a parent. Vous devez le créer chaque fois que vous souhaitez afficher votre boîte de dialogue:

        findViewById(R.id.button).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);
                builder.setTitle("abc");
                builder.setMessage("abcde");
                ArrayAdapter adapter = new ArrayAdapter(this, android.R.layout.simple_spinner_dropdown_item, avc);
                spinner = new Spinner(this);
                spinner.setAdapter(adapter);
                builder.setView(spinner);
                builder.show();
            }
        });


2 commentaires

Ainsi, lorsque la boîte de dialogue est apparue seconde et tente d'ajouter la fileuse à elle-même, elle jette une erreur car la spinner a déjà un parent?


Pas besoin de recréer l'instance d'adaptateur Array, vous n'avez besoin que d'un nouvel objet Spinner.



0
votes

Ajustez votre code.

findViewById(R.id.button).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

            mSpinner = new Spinner(this);
            mSpinner.setAdapter(adapter);
    
            AlertDialog.Builder builder = new 
            AlertDialog.Builder(MainActivity.this);
            builder.setTitle("abc");
            builder.setMessage("abcde");
            builder.setView(mSpinner);
            builder.show();
            }
       });


3 commentaires

Pourriez-vous également préciser pourquoi est-ce une façon terrible de le faire?


Vous créez une instance de dialogue d'alerte plusieurs fois lorsque vous cliquez sur, pourquoi ne pas créer une boîte de dialogue personnalisée, chaque fois que vous cliquez pour utiliser la même instance de dialogue pour remplacer le texte. Par conséquent, vous économiser une création OBJ non nécessaire.


Désolé je n'ai pas compris ce que vous vouliez réellement dire. Voulez-vous dire que je devrais instancier l'alertdialog ailleurs?



0
votes

Essayez ceci.

Déclarez votre arrayadapter juste en dessous de la déclaration Spinner: p> xxx pré>

puis l'initialise dans l'Oncreate: p>

findViewById(R.id.button).setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);
            builder.setTitle("abc");
            builder.setMessage("abcde");
            spinner = new Spinner(this);
            spinner.setAdapter(adapter);
            builder.setView(spinner);
            builder.show();
        }
    });


0 commentaires