我必须单击两次按钮才能工作

时间:2013-06-23 14:42:59

标签: java android eclipse button focus

所以我的应用程序中有一个按钮和一个edittext。当我单击按钮并在edittext中写入内容时,textview会发生变化。除了一件事,它一切正常。我必须单击按钮两次才能使其工作(仅在我第一次打开活动时)。在我打开活动后第一次按下按钮,没有任何反应,之后就可以正常工作了。

我已经对此进行了研究,据我所知,引起麻烦的事情是焦点,但我尝试了一些事情,没有任何效果。

按钮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,但它仍然不起作用。我还从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;
            }
        }
    });
}

8 个答案:

答案 0 :(得分:36)

我的问题是Button XML定义:

android:focusableInTouchMode="true"

删除此属性,该按钮不需要被触摸两次。看起来似乎消耗了第一次触摸来将焦点分配给按钮,然后第二次触摸会触发OnClickListener

请注意,Button的android:focusable="true"属性无效。

答案 1 :(得分:4)

好的,所以我终于弄明白是什么原因引起了这个问题。我不敢相信我错过了这么明显的问题。导致问题的不是焦点,而是方法本身。在我的XML文件中,我通过android调用了onClick方法:onClick =“onClick”然后我还在onClick方法中添加了一个buttonlistener到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

答案 2 :(得分:2)

如果要将视图扩展到另一个视图,请尝试设置父视图:

view.setFocusable(false);

为我工作。

答案 3 :(得分:1)

有时我在片段上点击 btn txt edt 时遇到问题,并且实际上有助于使用。 setOnClickListener()需要 .setOnTouchListener ,如下例所示:

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

答案 4 :(得分:0)

尝试一次这个 <强>已更新

override中的

onResume activity方法 然后从您的edittext中清除焦点并将焦点设置为主要布局

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

button.requestFocus();

如果问题出在虚拟键盘上,它可能对你有帮助

AndroidManifest.xml标记内的Activity文件中

放入此行

android:windowSoftInputMode="stateHidden"

答案 5 :(得分:0)

只需使用getText()从EditText中获取文本 然后使用setText()设置TextView的文本。

答案 6 :(得分:0)

我和OP有同样的问题。我尝试了所有与焦点相关的建议,但每次都没有为我工作。

我尝试从我的布局中删除NavigationDrawer,但这不起作用。

最后,我尝试用CoordinatorLayout替换LinearLayout,现在我的按钮每次都会第一次点击。值得一试。

答案 7 :(得分:0)

通过添加以下行:

 <Button
    android:id="@+id/sauvegarder"
    android:text="Sauvegarder"
    android:layout_gravity="center"
    android:background="@color/colorAccent"
    android:layout_margin="@dimen/fontmargin"
    style="@style/edit"
    android:gravity="center"
    android:textColor="@color/colorPrimary"
    android:layout_width="220dp"
    android:layout_height="wrap_content"
    android:focusableInTouchMode="false"
    />

在我的xml文件中,它运行完美!