2013-06-23 16 views
16

Mam przycisk w mojej aplikacji i edittext. Kiedy klikam przycisk i piszę coś w edytorze tekstu, zmienia się widok tekstowy. Wszystko działa tak, jak powinno, z wyjątkiem jednej rzeczy. Muszę dwa razy kliknąć przycisk, aby zadziałał (tylko przy pierwszym uruchomieniu). Po raz pierwszy po otwarciu działalności naciskam przycisk i nic się nie dzieje, po czym działa tak, jak powinien.Muszę dwukrotnie kliknąć przycisk, aby zadziałał.

Zrobiłem już swoje badania na ten temat i o ile mi wiadomo, problemem jest koncentracja, ale spróbowałem kilku rzeczy i nic nie działało.

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

Próbowałem dodając androida: focusableInTouchMode = "false" na przycisk XML, próbowałem również dodanie requestFocus do przycisku XML i to wciąż nie działa. Usunąłem także requestFocus z edytora edittext i to nie działa. Brakuje mi pomysłów, co jeszcze spróbować. Metoda

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

Kiedy mówisz kilka rzeczy, czy próbowałeś skupić uwagę? – Evilunclebill

+0

Tak, próbowałem tego, ale zapomniałem wspomnieć o tym w pytaniu – Guy

+0

Czekaj, gdzie powinienem spróbować clearfocus? Próbowałem tylko dodać go do edittext w pliku XML. – Guy

Odpowiedz

2

OK, więc w końcu zorientowałem się, co spowodowało problem, sam. Nie mogę uwierzyć, że przegapiłem tak oczywisty problem. Rzeczą, która spowodowała problem, nie było skupienie, ale sama metoda. W moim pliku XML nazwałem metodę onClick przez android: onClick = "onClick", a następnie dodałem metodę buttonlistener wewnątrz metody onClick do kodu java.

Wszystko, co zrobiłem, to usunięcie listlistnika i nie ma już potrzeby dwukrotnego kliknięcia! Jeśli więc ktoś ma ten problem w przyszłości, po prostu upewnij się, że nie posiadasz jednocześnie metody onClick ORAZ buttonlistlist.

Niewłaściwy kod:

public void submitQuantityButton (View v){ 

submitButton.setOnClickListener(new View.OnClickListener() { 

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

Aby to działa po prostu usunięte słuchacza onclick, pozostawiając jedynie:

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

To nie działa dla mnie z jakiegoś powodu. Nie mam dwóch programów onClick, dodam tylko jeden w moim kodzie. Zmienia stan przycisku, aby skupił się najpierw przed rozpoczęciem pracy, dlatego po prostu wyodrębnię zawartość metody onClick i wywołaj ją zarówno w zdarzeniu onClick, jak i zdarzeniu onFocus.Podobnie jak onClick z wieloma przyciskami, przechwytuj wszystkie zdarzenia onFocus za pomocą onFocusChangeListener, a następnie sprawdź, czy przycisk jest zaznaczony. –

0

spróbować tego raz
UPDATED

overrideonResume metodę w swojej activity a następnie usunąć wyróżnienie ze swojej EditText i ustawić ostrość na głównym układzie

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

lub

button.requestFocus(); 

czy problem jest z wirtualną klawiaturą może pomóc

w pliku AndroidManifest.xml wewnątrz Activity tagu umieścić ten wiersz

android:windowSoftInputMode="stateHidden" 
+0

Dzięki za odpowiedź, ale nadal nie działa – Guy

+0

spróbuj 'android: descendantFocusability =" beforeDescendants " android: focusableInTouchMode = "true" 'w twoim układzie, który zawiera' button' i 'edittext' –

+0

Dodano te 2 w moim względnym layoucie (myślę, że to właśnie miałeś na myśli) i to niestety nadal nie zadziała – Guy

0

Wystarczy użyć getText(), aby uzyskać tekst z EditText A następnie ustaw tekst TextView za pomocą setText().

23

Mój problem został XML Button określenia:

android:focusableInTouchMode="true" 

Usuń ten atrybut, a przycisk nie wymaga dwukrotnego dotknięcia. Wygląda to tak, jakby pierwsze dotknięcie zostało zużyte, aby przypisać fokus na przycisku, a drugie wywoła OnClickListener.

Należy zauważyć, że przycisk działa bez problemu z atrybutem android:focusable="true".

+0

Zmiana 'focusableInTouchMode' była rozwiązaniem dla mnie. Dzięki! – Merlevede

0

Miałem ten sam problem co OP. Próbowałem wszystkich sugestii związanych z fokusem, ale żaden z nich nie działał za każdym razem.

Próbowałem usunąć NavigationDrawer z mojego układu, ale to nie zadziałało.

Na koniec próbowałem zastąpić mój CoordinatorLayout za pomocą LinearLayout, a teraz moje przyciski za każdym razem klikają za pierwszym razem. Może warto spróbować.

1

Jeśli pompowania widoku do innego, spróbuj ustawić na widzenia dominującej:

view.setFocusable(false); 

pracował dla mnie.

0

Kiedyś miałem go problem, gdy kliknięcie BTN lub txt lub edt na fragmencie, i naprawdę pomaga używać zamiast .setOnClickListener() potrzebę .setOnTouchListener jak w poniższym przykładzie:

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