web-dev-qa-db-fra.com

Je dois cliquer deux fois sur le bouton pour que cela fonctionne

J'ai donc un bouton dans mon application et un edittext. Lorsque je clique sur le bouton et écris quelque chose dans l'edittext, une vue de texte change. Tout fonctionne comme il se doit, sauf pour une chose. Je dois cliquer deux fois sur le bouton pour que cela fonctionne (uniquement la première fois que j'ouvre une activité). La toute première fois après que j'ouvre l'activité, j'appuie sur le bouton et rien ne se passe, après cela fonctionne comme il se doit.

J'ai déjà fait mes recherches à ce sujet et, autant que je sache, le problème est la focalisation, mais j'ai essayé plusieurs choses et rien n'a fonctionné.

Code XML du bouton:

<Button
    Android:id="@+id/submitButton"
    Android:layout_width="wrap_content"
    Android:layout_height="wrap_content"
    Android:layout_alignBaseline="@+id/editText1"
    Android:layout_alignBottom="@+id/editText1"
    Android:layout_alignLeft="@+id/checkBox25"
    Android:text="@string/addMaterial"
    Android:onClick="submitQuantityButton" >
</Button>

Code XML Edittext:

<EditText
    Android:id="@+id/editText1"
    Android:layout_width="wrap_content"
    Android:layout_height="wrap_content"
    Android:layout_alignParentLeft="true"
    Android:layout_below="@+id/spinner1"
    Android:ems="3"
    Android:inputType="number"
    Android:maxLength="3" >
</EditText>

J'ai essayé d'ajouter Android: focusableInTouchMode = "false" au bouton XML, j'ai également essayé d'ajouter requestFocus au bouton XML et cela ne fonctionne toujours pas. J'ai également supprimé le requestFocus d'edittext et cela ne fonctionne pas. Je suis à court d'idées quoi d'essayer.

méthode onClick:

public void submitQuantityButton (View v){
    Button submitButton = (Button)findViewById(R.id.submitButton);
    final Spinner sItems = (Spinner)findViewById(R.id.spinner1);
    final Context context = this;
    final CheckBox cb4 = (CheckBox) findViewById(R.id.checkBox4);
    final CheckBox cb5 = (CheckBox) findViewById(R.id.checkBox5);
    final CheckBox cb33 = (CheckBox) findViewById(R.id.checkBox33);
    final CheckBox cb30 = (CheckBox) findViewById(R.id.checkBox30);
    final CheckBox cb6 = (CheckBox) findViewById(R.id.checkBox6);
    final CheckBox cb7 = (CheckBox) findViewById(R.id.checkBox7);
    final CheckBox cb9 = (CheckBox) findViewById(R.id.checkBox9);
    final CheckBox cb10 = (CheckBox) findViewById(R.id.checkBox10);
    final CheckBox cb11 = (CheckBox) findViewById(R.id.checkBox11);
    final CheckBox cb12 = (CheckBox) findViewById(R.id.checkBox12);

    //
    final AlertDialog.Builder emptyETextErrorBuilder = new AlertDialog.Builder(context);
    emptyETextErrorBuilder.setTitle("Warning");
    emptyETextErrorBuilder.setMessage("Please enter a value before pressing this button");
    emptyETextErrorBuilder.setPositiveButton("OK", new DialogInterface.OnClickListener() {

        @Override
        public void onClick(DialogInterface dialog, int which) {
            dialog.cancel();
        }
    });

    submitButton.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            final int position = sItems.getSelectedItemPosition();
            EditText quantityEditText = (EditText)findViewById(R.id.editText1);

            switch (position){
            case 0:
                AlertDialog.Builder spinnerErrorBuilder = new AlertDialog.Builder(context);
                spinnerErrorBuilder.setTitle("Warning");
                spinnerErrorBuilder.setMessage("Please choose an item from the list above and then enter a certain value");
                spinnerErrorBuilder.setPositiveButton("OK", new DialogInterface.OnClickListener() {

                    @Override
                    public void onClick(DialogInterface dialog, int id) {
                        dialog.cancel();
                    }
                });
                AlertDialog spinnerError = spinnerErrorBuilder.create();
                spinnerError.show();
                break;
            case 1:
                String item1 = quantityEditText.getText().toString();
                if (item1.matches(""))
                {
                    AlertDialog emptyETextError = emptyETextErrorBuilder.create();
                    emptyETextError.show();
                }
                else
                {
                    cb4.setText("Elaborate Totem (" + item1 + "/250)");
                }
                break;
            case 2:
                String item2 = quantityEditText.getText().toString();
                if (item2.matches(""))
                {
                    AlertDialog emptyETextError = emptyETextErrorBuilder.create();
                    emptyETextError.show();
                }
                else
                {
                    cb5.setText("Pile of Crystalline Dust (" + item2 + "/250)");
                }
                break;
            case 3:
                String item3 = quantityEditText.getText().toString();
                if (item3.matches(""))
                {
                    AlertDialog emptyETextError = emptyETextErrorBuilder.create();
                    emptyETextError.show();
                }
                else
                {
                    cb33.setText("Pile of Crystalline Dust (" + item3 + "/250)");
                }
                break;
            case 4:
                String item4 = quantityEditText.getText().toString();
                if (item4.matches(""))
                {
                    AlertDialog emptyETextError = emptyETextErrorBuilder.create();
                    emptyETextError.show();
                }
                else
                {
                    cb30.setText("Pile of Crystalline Dust (" + item4 + "/250)");
                }
                break;
            case 5:
                String item5 = quantityEditText.getText().toString();
                if (item5.matches(""))
                {
                    AlertDialog emptyETextError = emptyETextErrorBuilder.create();
                    emptyETextError.show();
                }
                else
                {
                    cb6.setText("Powerful Venom Sac (" + item5 + "/250)");
                }
                break;
            case 6:
                String item6 = quantityEditText.getText().toString();
                if (item6.matches(""))
                {
                    AlertDialog emptyETextError = emptyETextErrorBuilder.create();
                    emptyETextError.show();
                }
                else
                {
                    cb7.setText("Vial of Powerful Blood (" + item6 + "/250)");
                }
                break;
            case 7:
                String item7 = quantityEditText.getText().toString();
                if (item7.matches(""))
                {
                    AlertDialog emptyETextError = emptyETextErrorBuilder.create();
                    emptyETextError.show();
                }
                else
                {
                    cb9.setText("Ancient Bone (" + item7 + "/250)");
                }
                break;
            case 8:
                String item8 = quantityEditText.getText().toString();
                if (item8.matches(""))
                {
                    AlertDialog emptyETextError = emptyETextErrorBuilder.create();
                    emptyETextError.show();
                }
                else
                {
                    cb10.setText("Armored Scale (" + item8 + "/250)");
                }
                break;
            case 9:
                String item9 = quantityEditText.getText().toString();
                if (item9.matches(""))
                {
                    AlertDialog emptyETextError = emptyETextErrorBuilder.create();
                    emptyETextError.show();
                }
                else
                {
                    cb11.setText("Vicious Claw (" + item9 + "/250)");
                }
                break;
            case 10:
                String item10 = quantityEditText.getText().toString();
                if (item10.matches(""))
                {
                    AlertDialog emptyETextError = emptyETextErrorBuilder.create();
                    emptyETextError.show();
                }
                else
                {
                    cb12.setText("Vicious Fang (" + item10 + "/250)");
                }
                break;
            }
        }
    });
}
23
Guy

D'accord, j'ai enfin compris par moi-même la cause du problème. Je ne peux pas croire que j'ai raté un problème aussi évident. La chose qui a causé le problème n'était pas le focus, mais la méthode elle-même. Dans mon fichier XML, j’ai appelé la méthode onClick d’Android: onClick = "onClick", puis j’ai également ajouté un buttonlistener dans la méthode onClick au code Java. 

Tout ce que j'ai fait, c'est supprimer le buttonlistener et il n'y a plus de double-clic nécessaire! Donc, si quelqu'un a ce problème à l'avenir, assurez-vous simplement de ne pas avoir une méthode onClick ET un écouteur de boutons en même temps.

Mauvais code:

public void submitQuantityButton (View v){

submitButton.setOnClickListener(new View.OnClickListener() {

    @Override
    public void onClick(View v) {
.
.
. //REST OF THE CODE

Pour que cela fonctionne, j'ai simplement supprimé l'auditeur onclick, en ne laissant que:

public void submitQuantityButton (View v){
.
.
. //REST OF THE CODE
4
Guy

Mon problème était le Button XML définissant:

Android:focusableInTouchMode="true"

Supprimez cet attribut et le bouton ne nécessite pas d'être touché deux fois. Il semble que le premier contact soit consommé pour assigner le focus au bouton et le second déclenche alors la OnClickListener.

Notez que le bouton fonctionne sans problème avec l'attribut Android:focusable="true".

35
TheIT

Si vous gonflez une vue sur une autre, essayez de définir sur la vue parent:

view.setFocusable(false);

a travaillé pour moi. 

2
Jan Moravec

Parfois, je rencontrais le problème lorsque je cliquais sur btn ou txt ou edt sur le fragment, et que j'utilisais réellement .setOnClickListener () need .setOnTouchListener like cet exemple: 

txtClose.setOnTouchListener((v, event) -> {
                // do staff...
                return false;
            });
1
nicolas asinovich

J'ai eu le même problème que l'OP. J'ai essayé toutes les suggestions relatives à la mise au point, mais aucune d'entre elles n'a fonctionné à chaque fois pour moi.

J'ai essayé de supprimer la NavigationDrawer de ma mise en page, mais cela n'a pas fonctionné.

Enfin, j'ai essayé de remplacer ma CoordinatorLayout par une LinearLayout et maintenant mes boutons cliquent pour la première fois. Ça pourrait valoir la peine d'essayer.

0
ban-geoengineering

essayez cette fois
MIS &AGRAVE; JOUR

overrideonResume méthode dans votre activity puis désactivez le focus de votre edittext et définissez le focus sur votre mise en page principale

edittext.clearFocus();
layout.requestFocus();

ou 

button.requestFocus();

si le problème concerne le clavier virtuel, cela peut vous aider

dans votre fichier AndroidManifest.xml dans votre balise Activity, mettez cette ligne

Android:windowSoftInputMode="stateHidden"
0
Michael Shrestha

Utilisez simplement getText () pour obtenir du texte à partir de EditText Et définissez le texte de TextView à l’aide de setText ().

0
Eduardo Savrin