2013-06-23 15 views
16

Vì vậy, tôi có một nút trong ứng dụng của tôi và một văn bản. Khi tôi nhấp vào nút và viết một cái gì đó trong văn bản, một thay đổi văn bản thay đổi. Tất cả hoạt động như nó nên ngoại trừ một điều. Tôi phải bấm vào nút hai lần để làm cho nó hoạt động (chỉ lần đầu tiên tôi mở hoạt động). Lần đầu tiên sau khi tôi mở hoạt động, tôi nhấn nút và không có gì xảy ra, sau đó nó hoạt động như nó cần.Tôi phải bấm vào nút hai lần để nó hoạt động

Tôi đã nghiên cứu về điều này và theo như tôi biết điều gây rắc rối là tập trung, nhưng tôi đã thử một vài điều và không có gì hiệu quả.

mã XML

Button:

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

mã XML EditText:

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

Tôi đã cố gắng thêm android: focusableInTouchMode = "false" để nút XML, tôi cũng đã cố gắng thêm requestFocus nút XML và nó vẫn không hoạt động. Tôi cũng đã xóa requestFocus khỏi edittext và nó không hoạt động. Tôi đang hết ý tưởng những gì khác để thử. phương pháp

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; 
      } 
     } 
    }); 
} 
+0

Khi bạn nói một vài điều, bạn đã cố gắng xóa tiêu điểm chưa? – Evilunclebill

+0

vâng, tôi đã thử điều đó nhưng tôi quên đề cập đến nó trong câu hỏi – Guy

+0

Chờ, tôi nên thử làm rõ nét ở đâu? Tôi chỉ thử thêm nó vào edittext trong tập tin XML. – Guy

Trả lời

2

Được rồi vì vậy cuối cùng tôi cũng đã tìm ra nguyên nhân gây ra sự cố. Tôi không thể tin rằng tôi đã bỏ lỡ một vấn đề rõ ràng như vậy. Điều gây ra vấn đề không phải là sự tập trung, mà là chính phương thức đó. Trong tệp XML của tôi, tôi đã gọi phương thức onClick bằng android: onClick = "onClick" và sau đó tôi cũng đã thêm một buttonlistener bên trong phương thức onClick vào mã java.

Tất cả những gì tôi đã làm là xóa trình chọn nút và không cần phải nhấn đúp chuột nữa! Vì vậy, nếu bất cứ ai có vấn đề này trong tương lai chỉ cần chắc chắn rằng bạn không có một onClick phương pháp VÀ listlistener cùng một lúc.

sai mã:

public void submitQuantityButton (View v){ 

submitButton.setOnClickListener(new View.OnClickListener() { 

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

Để làm cho nó làm việc tôi chỉ đơn giản là xóa người nghe onclick, chỉ để lại:

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

Điều này không làm việc cho tôi vì một lý do nào đó. Tôi không có hai onClicks, tôi chỉ thêm một trong mã của tôi. Nó thay đổi trạng thái của nút để tập trung đầu tiên trước khi làm việc, vì vậy tôi chỉ đơn giản là sẽ trích xuất nội dung của phương thức onClick và gọi nó cả trên sự kiện onClick và trên sự kiện onFocus.Cũng giống như một onClick với nhiều nút, bắt tất cả các sự kiện onFocus với onFocusChangeListener và sau đó kiểm tra xem nút có được chọn hay không. –

0

thử một lần
CẬP NHẬT phương pháp

overrideonResume này trong thư mục activity và sau đó tập trung rõ ràng từ EditText của bạn và đặt trọng tâm vào bố cục chính của bạn

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

hoặc

button.requestFocus(); 

nếu vấn đề là với bàn phím ảo nó có thể giúp bạn

trong tập tin AndroidManifest.xml của bạn bên trong thẻ Activity bạn đặt dòng này

android:windowSoftInputMode="stateHidden" 
+0

Cảm ơn câu trả lời của bạn, nhưng nó vẫn không hoạt động – Guy

+0

thử' android: descendantFocusability = "beforeDescendants" android: focusableInTouchMode = "true" 'trong layout của bạn có chứa' button' và 'edittext' –

+0

Đã thêm 2 cái trong bố cục tương đối của tôi (tôi nghĩ đó là ý của bạn) và thật đáng buồn là vẫn không hoạt động – Guy

0

Đơn giản chỉ cần sử dụng gettext() để có được văn bản từ EditText Và sau đó đặt văn bản của TextView bằng cách sử dụng setText().

23

Vấn đề của tôi đã được các Button XML xác định:

android:focusableInTouchMode="true" 

Loại bỏ thuộc tính này và nút không yêu cầu bị chạm hai lần. Có vẻ như lần chạm đầu tiên được tiêu thụ để chỉ định tiêu điểm trên nút và nút thứ hai sau đó kích hoạt OnClickListener.

Lưu ý rằng nút hoạt động mà không có vấn đề với thuộc tính android:focusable="true".

+0

Thay đổi 'focusableInTouchMode' là giải pháp cho tôi. Cảm ơn! – Merlevede

0

Tôi gặp vấn đề tương tự như OP. Tôi đã thử tất cả các đề xuất liên quan đến tiêu điểm, nhưng không có đề xuất nào trong số họ làm việc mọi lúc cho tôi.

Tôi đã cố gắng xóa NavigationDrawer khỏi bố cục của tôi, nhưng cách đó không hiệu quả.

Cuối cùng, tôi đã thử thay thế CoordinatorLayout bằng một LinearLayout và giờ đây các nút của tôi nhấp lần đầu tiên mỗi lần. Có thể đáng để thử.

1

Nếu bạn đang lạm phát xem với nhau, cố gắng thiết lập vào xem mẹ:

view.setFocusable(false); 

làm việc cho tôi.

0

Đôi khi tôi đã có nó vấn đề khi nhấp chuột vào btn hoặc txt hoặc edt trên mảnh, và thực sự giúp sử dụng thay vì .setOnClickListener() cần .setOnTouchListener như ví dụ sau:

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