Я должен дважды щелкнуть кнопку, чтобы она работала

Итак, у меня есть кнопка в моем приложении и edittext. Когда я нажимаю кнопку и пишу что-то в редакторе, изменяется текст. Все это работает, за исключением одного. Я должен дважды щелкнуть по кнопке, чтобы она работала (только в первый раз, когда я открываю активность). В первый раз после открытия активности я нажимаю кнопку, и ничего не происходит, после этого она работает так, как должна.

Я уже занимался этим исследованием, и насколько я знаю, что вызывает проблемы, основное внимание уделяется, но я пробовал несколько вещей и ничего не работал.

Кнопка XML-кода:

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

Код Edittext XML:

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

Я попробовал добавить android: focusableInTouchMode = "false" к кнопке XML, я также попытался добавить requestFocus в кнопку XML, и он все еще не работает. Я также удалил requestFocus из edittext, и он не работает. У меня заканчиваются идеи, что еще попробовать.

метод 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;
            }
        }
    });
}

Ответы

Ответ 1

Хорошо, поэтому я, наконец, понял, что вызвало проблему, сам. Не могу поверить, что я пропустил такую ​​очевидную проблему. То, что вызвало проблему, было не фокусом, а самим методом. В моем XML файле я вызывал метод onClick по android: onClick = "onClick", а затем я также добавил кнопку buttonlistener внутри метода onClick для java-кода.

Все, что я делал, это удалить кнопку buttonlistener, и больше нет двойного щелчка! Поэтому, если у кого-то есть эта проблема в будущем, просто убедитесь, что у вас нет метода onClick и buttonlistener в то же время.

Неверный код:

public void submitQuantityButton (View v){

submitButton.setOnClickListener(new View.OnClickListener() {

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

Чтобы сделать это, я просто удалил прослушиватель onclick, оставив только:

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

Ответ 2

Моя проблема заключалась в определении XML Button:

android:focusableInTouchMode="true"

Удалите этот атрибут, и кнопка не требует двойного касания. Кажется, что первое касание потребляется, чтобы назначить фокус на кнопку, а второй - затем OnClickListener.

Обратите внимание, что кнопка работает без проблем с атрибутом android:focusable="true".

Ответ 3

Если вы раздуваете представление на другое, попробуйте установить родительский вид:

view.setFocusable(false);

работал у меня.

Ответ 4

попробуйте это раз ОБНОВЛЕНО

override onResume в activity а затем очистить фокус от вашего edittext и установить фокус на ваш основной макет.

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

или

button.requestFocus();

Если проблема связана с виртуальной клавиатурой, это может помочь вам

в вашем AndroidManifest.xml файле внутри тэга activity поместите эту строку

android:windowSoftInputMode="stateHidden"

Ответ 5

Просто используйте getText(), чтобы получить текст из EditText А затем установите текст TextView с помощью setText().

Ответ 6

У меня была та же проблема, что и у OP. Я пробовал все связанные с фокусом предложения, но никто из них не работал каждый раз для меня.

Я попытался удалить NavigationDrawer из моего макета, но это не сработало.

Наконец, я попытался заменить мой CoordinatorLayout на LinearLayout, и теперь мои кнопки нажимают первый раз каждый раз. Возможно, стоит попробовать.

Ответ 7

Когда-нибудь у меня возникла проблема при нажатии на btn или txt или edt на фрагменте, и это действительно помогает использовать вместо . setOnClickListener() нужен .setOnTouchListener, как этот пример:

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