36

そのため、アプリにボタンと編集テキストがあります。ボタンをクリックして編集テキストに何かを書き込むと、テキストビューが変更されます。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" を追加しようとしましたが、requestFocus をボタン XML に追加しようとしましたが、まだ機能しません。edittext から 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;
            }
        }
    });
}
4

8 に答える 8

50

私の問題は、Button次の XML 定義でした。

android:focusableInTouchMode="true"

この属性を削除すると、ボタンを 2 回タップする必要がなくなります。ボタンにフォーカスを割り当てるために最初のタッチが消費され、次にOnClickListener.

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

于 2015-11-05T04:27:53.717 に答える
8

さて、私はついに自分で問題の原因を突き止めました。こんな明白な問題を見逃したなんて信じられない。問題を引き起こしたのはフォーカスではなく、メソッドそのものです。私の XML ファイルでは、android:onClick="onClick" で onClick メソッドを呼び出し、次に onClick メソッド内のボタンリスナーを Java コードに追加しました。

ボタンリスナーを削除しただけで、ダブルクリックする必要がなくなりました。したがって、将来この問題が発生した場合は、 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
于 2013-06-26T13:37:18.573 に答える
2

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

txtClose.setOnTouchListener((v, event) -> {
                // do staff...
                return false;
            });
于 2017-10-18T09:42:30.637 に答える
0

これを一度試してください
UPDATED

override onResumeメソッドを使用してactivity から、編集テキストからフォーカスをクリアし、メインレイアウトにフォーカスを設定します

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

また

button.requestFocus();

問題が仮想キーボードにある場合は、それが役立つかもしれません

タグ内のファイルにこの行を入れAndroidManifest.xmlますActivity

android:windowSoftInputMode="stateHidden"
于 2013-06-23T14:49:51.977 に答える
-1

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

于 2013-06-23T14:55:31.463 に答える