it-swarm.com.de

Ich muss zweimal auf die Schaltfläche klicken, damit sie funktioniert

Ich habe also einen Button in meiner App und einen Edittext. Wenn ich auf die Schaltfläche klicke und etwas in den Edittext schreibe, ändert sich eine Textansicht. Es funktioniert alles so, wie es sollte, bis auf eine Sache. Ich muss zweimal auf die Schaltfläche klicken, damit sie funktioniert (nur beim ersten Öffnen der Aktivität). Das allererste Mal, nachdem ich die Aktivität geöffnet habe, drücke ich die Taste und nichts passiert, danach funktioniert es wie erwartet.

Ich habe bereits meine Nachforschungen angestellt und soweit ich weiß, ist die Sache, die Probleme verursacht, der Fokus, aber ich habe ein paar Dinge ausprobiert und nichts hat funktioniert.

Button XML-Code:

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

XML-Code von 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>

Ich habe versucht, Android: focusableInTouchMode = "false" zu Button XML hinzuzufügen, ich habe auch versucht, requestFocus zu Button XML hinzuzufügen, und es funktioniert immer noch nicht. Ich habe den requestFocus auch aus edittext entfernt und es funktioniert nicht. Mir gehen die Ideen aus, was ich sonst noch versuchen sollte.

onClick-Methode:

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

Okay, also habe ich endlich herausgefunden, was das Problem verursacht hat. Ich kann nicht glauben, dass ich ein so offensichtliches Problem übersehen habe. Die Ursache des Problems war nicht der Fokus, sondern die Methode selbst. In meiner XML-Datei habe ich die onClick-Methode von Android aufgerufen: onClick = "onClick" und dann in Java-Code einen Buttonlistener innerhalb der onClick-Methode hinzugefügt. 

Ich habe nur den Buttonlistener entfernt und es ist kein Doppelklick mehr nötig! Wenn also jemand dieses Problem in der Zukunft hat, stellen Sie sicher, dass Sie nicht gleichzeitig eine onClick-Methode UND einen Buttonlistener haben.

Falscher Code:

public void submitQuantityButton (View v){

submitButton.setOnClickListener(new View.OnClickListener() {

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

Damit es funktioniert, habe ich einfach den Onclick-Listener gelöscht und nur noch:

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

Mein Problem war die Button-XML, die Folgendes definiert:

Android:focusableInTouchMode="true"

Entfernen Sie dieses Attribut, und die Schaltfläche muss nicht zweimal berührt werden. Es scheint, als wäre die erste Berührung erforderlich, um der Schaltfläche den Fokus zuzuweisen, und die zweite löst dann die OnClickListener aus.

Beachten Sie, dass der Button ohne Probleme mit dem Android:focusable="true"-Attribut funktioniert.

35
TheIT

Wenn Sie die Ansicht auf eine andere vergrößern, versuchen Sie, die übergeordnete Ansicht einzustellen:

view.setFocusable(false);

arbeitete für mich 

2
Jan Moravec

Irgendwann hatte ich ein Problem, wenn Sie auf btn oder txt oder edt auf das Fragment klicken, und wirklich hilft, stattdessen .setOnClickListener () need .setOnTouchListener like zu verwenden dieses Beispiel: 

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

Ich hatte das gleiche Problem wie das OP. Ich habe alle fokusbezogenen Vorschläge ausprobiert, aber keiner von ihnen hat jedes Mal für mich gearbeitet.

Ich habe versucht, die NavigationDrawer aus meinem Layout zu entfernen, aber das hat nicht funktioniert.

Schließlich versuchte ich, meine CoordinatorLayout durch eine LinearLayout zu ersetzen, und jetzt klicken meine Schaltflächen jedes Mal beim ersten Mal. Könnte einen Versuch wert sein.

0

versuchen Sie es einmal
AKTUALISIERTE

overrideonResume-Methode in Ihrer activity und löschen Sie dann den Fokus von Ihrem Edittext und setzen Sie den Fokus auf Ihr Hauptlayout

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

oder 

button.requestFocus();

wenn das Problem mit der virtuellen Tastatur zusammenhängt, kann dies möglicherweise helfen

setzen Sie diese Zeile in Ihre AndroidManifest.xml-Datei in Ihrem Activity-Tag

Android:windowSoftInputMode="stateHidden"
0

Verwenden Sie einfach getText (), um Text aus EditText .__ abzurufen, und legen Sie den Text von TextView mit setText () fest.

0
Eduardo Savrin