Я повинен двічі натиснути кнопку, щоб вона працювала

Так що у мене є кнопка у моєму додатку та редагованийтекст. Коли я натискаю кнопку та пишу щось у редакторі тексту, текстовий перегляд змінюється. Все працює так, як треба, крім одного. Я повинен двічі натиснути кнопку, щоб він працював (тільки в перший раз, коли я відкриваю активність). У перший раз, коли я відкриваю активність, я натискаю кнопку, і нічого не відбувається, після цього він працює, як треба.

Я вже зробив свої дослідження на цьому, і, наскільки я знаю, те, що викликає проблеми, - фокус, але я спробував кілька речей і нічого не працював.

Кнопка 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>

Змінити текст XML-коду:



Я намагався додати android: focusableInTouchMode = "false" для кнопки XML, я також намагався додавати requestFocus до кнопки XML, і це все одно не працює. Я також видалив requestFocus з редагуваннятексту, і він не працює. Я вичерпаю ідеї, що ще спробувати.

метод 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;
            }
        }
    });
}
17
так, я спробував це, але я забув згадати це в питанні
додано Автор Guy, джерело
Дочекатися, де я повинен спробувати очистити фокус? Я тільки намагався додати його до редагування тексту у файлі XML.
додано Автор Guy, джерело
Я зробив це, перевірте відредагований пост
додано Автор Guy, джерело
Опублікуйте свій onClick ... можливо, ви щось робите там
додано Автор codeMagic, джерело
Коли ви кажете кілька речей, ви намагалися очистити фокус?
додано Автор Evilunclebill, джерело

7 Відповіді

Моя проблема полягала в визначенні XML-коду Button :

android:focusableInTouchMode="true"

Видаліть цей атрибут, і для кнопки не потрібно двічі торкнутися. Здається, перший дотик споживається, щоб призначити фокус на кнопку, а другий - запускати OnClickListener .

Зверніть увагу, що кнопка працює без проблем з атрибутом android: focusable = "true" .

28
додано
Зміна focusableInTouchMode була для мене рішенням. Дякую!
додано Автор Merlevede, джерело
Я використовую зображення, але це не працює для мене ?? Що я повинен зробити?
додано Автор ZIA ANSARI, джерело

Гаразд так, я нарешті зрозумів, що викликав проблему, сам. Я не можу повірити, що я пропустив таку очевидну проблему. Річ, яка викликала проблему, - це не фокус, а саме сам метод. У моєму XML-файлі я зателефонував методу onClick від android: onClick = "onClick", а потім я також додав програму з підсвічуванням у методі onClick для коду Java.

Усе, що я зробив, було видалити кнопки, і більше немає необхідності подвійного натискання! Отже, якщо хтось матиме цю проблему в майбутньому, просто переконайтеся, що у вас одночасно немає методу onClick AND 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
3
додано
Чомусь це не працює для мене. У мене немає двох onClicks, я додаю лише один у свій код. Це змінює стан кнопки, перш за все, до фокусування, перш ніж працювати, тому я просто витягну зміст методу onClick і називаю його як на події onClick, так і на події onFocus. Так само, як onClick з кількома кнопками, спіймайте всі події onFocus за допомогою onFocusChangeListener, а потім перевірте, чи вибрано цю кнопку.
додано Автор G_V, джерело

Якщо ви наказуєте перегляд іншим, спробуйте встановити на батьківський вигляд:

view.setFocusable(false);

працював для мене.

2
додано

У мене була така сама проблема, що й ОП. Я спробував всі пропозиції, пов'язані з фокусом, але жоден з них не працював кожного разу для мене.

Я спробував видалити NavigationDrawer з мого макета, але це не спрацювало.

Нарешті, я намагався замінити мій CoordinatorLayout за допомогою LinearLayout , і тепер мої кнопки натискають перший раз кожен раз. Може бути варто спробувати.

0
додано

Деякий час у мене виникла проблема при натисканні на фрагмент btn або txt або edt і дійсно допомагає використовувати .setOnClickListener() потрібен .setOnTouchListener , як цей приклад:

txtClose.setOnTouchListener((v, event) -> {
               //do staff...
                return false;
            });
0
додано

try this once
UPDATED

override onResume method in your activity and then clear focus from your edittext and set focus to your main layout

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

або

button.requestFocus();

якщо проблема з віртуальною клавіатурою може допомогти вам

у вашому файлі AndroidManifest.xml всередині тегу Activity поставте цей рядок

android:windowSoftInputMode="stateHidden"
0
додано
Дякую за вашу відповідь, але це все одно не працює
додано Автор Guy, джерело
Додано ці 2 в моїй відносній макеті (я думаю, що це те, що ви мали на увазі), і це, на жаль, все одно не спрацює
додано Автор Guy, джерело
Я зробив edittext.clearfocus (), але це не працює. Але я не міг додати layout.requestFocus() (затьмарення підкреслено його червоним кольором)
додано Автор Guy, джерело
Так, я спробував це зробити в xml (requestFocus), і це не спрацювало. Після всього цього часу, намагаючись зосередити це, я почав думати, може бути, все-таки це не проблема фокусу ...
додано Автор Guy, джерело
спробуйте android: descendantFocusability = "beforeDescendants" android: focusableInTouchMode = "true" у вашому макеті, що містить кнопку і edittext
додано Автор Michael Shrestha, джерело
@ Маттх, будь ласка, перевірте оновлену відповідь
додано Автор Michael Shrestha, джерело
Ви намагалися встановити фокус на вашій кнопці?
додано Автор Michael Shrestha, джерело

Просто скористайтеся getText (), щоб отримати текст з EditText А потім встановіть текст TextView за допомогою setText ().

0
додано
ІТ КПІ - Java
ІТ КПІ - Java
436 учасників

android_jobs_ua
android_jobs_ua
120 учасників

Публикуем вакансии и запросы на поиск работы по направлению Android. Здесь всё: full-time, part-time, remote и разовые подработки.

Mobile Dev Jobs UA
Mobile Dev Jobs UA
20 учасників

Публикуем вакансии и запросы на поиск работы по направлению iOS, Android, Xamarin, RN и т.д.