web-dev-qa-db-ja.com

ボタンを2回クリックしないと機能しません

だから私は私のアプリとedittextにボタンを持っています。ボタンをクリックしてedittextに何かを書き込むと、textviewが変化します。 1つのことを除いて、すべて正常に機能します。ボタンを2回クリックして機能させる必要があります(初めてアクティビティを開いたときのみ)。アクティビティを開いた後、初めてボタンを押しても何も起こりません。その後は正常に機能します。

私はすでにこれについて自分の研究をしており、問題を引き起こしていることが焦点であることがわかっている限り、いくつかのことを試みましたが、何もうまくいきませんでした。

ボタン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>

ボタンXMLにAndroid:focusableInTouchMode = "false"を追加してみました。ボタンXMLにrequestFocusも追加しようとしましたが、それでも機能しません。 editFocusから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;
            }
        }
    });
}
31
Guy

さて、私は最終的に自分で問題の原因を突き止めました。私はそのような明らかな問題を見逃したなんて信じられません。問題を引き起こしたのは焦点ではなく、方法自体でした。私のXMLファイルでは、Android:onClick = "onClick"によってonClickメソッドを呼び出し、次にonClickメソッド内にJavaコードにbuttonlistenerを追加しました。

私がしたのはボタンリスナーを削除することだけで、ダブルクリックの必要はもうありません!したがって、将来この問題が発生する場合は、onClickメソッドとボタンリスナーを同時に使用しないようにしてください。

不正なコード:

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

私の問題はButton XMLの定義でした:

Android:focusableInTouchMode="true"

この属性を削除すると、ボタンを2回押す必要がなくなります。最初のタッチがボタンにフォーカスを割り当てるために消費され、2番目のタッチがOnClickListenerをトリガーするように見えます。

ボタンはAndroid:focusable="true"属性で問題なく機能することに注意してください。

39
TheIT

ビューを別のビューに拡張している場合は、親ビューに設定してみてください。

view.setFocusable(false);

私のために働いた。

2
Jan Moravec

フラグメントでbtnまたはtxtまたはedtをクリックすると問題が発生することがありましたが、実際には代わりに。setOnClickListener( )必要。setOnTouchListenerこの例のように:

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

OPと同じ問題がありました。私はすべてのフォーカス関連の提案を試みましたが、それらのどれも私のために毎回うまくいきませんでした。

レイアウトからNavigationDrawerを削除しようとしましたが、うまくいきませんでした。

最後に、CoordinatorLayoutLinearLayoutに置き換えてみたところ、ボタンが毎回最初にクリックされました。試してみる価値があるかもしれません。

0

これを一度試してください
[〜#〜]更新済み[〜#〜]

overrideonResumeactivityメソッドを使用して、edittextからフォーカスをクリアし、メインレイアウトにフォーカスを設定します

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

または

button.requestFocus();

問題が仮想キーボードにある場合、それはあなたを助けるかもしれません

あなたのAndroidManifest.xmlActivityタグ内のファイルに次の行を追加します

Android:windowSoftInputMode="stateHidden"
0

単にgetText()を使用してEditTextからテキストを取得し、次にsetText()を使用してTextViewのテキストを設定します。

0
Eduardo Savrin