2010-06-11 15 views
24

W edytorze tekstu, po wpisaniu klawisza "Enter", system tworzy w nim nową linię. Chciałbym skupić się na kolejnym edytorze tekstu, bez nowej linii. jak kodować? mój kod XML jest poniżejKeyCode_Enter to next edittext

<EditText 
    android:id="@+id/txtNPCode" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:textSize="18sp" 
    android:layout_alignLeft="@+id/lblNPCode" 
    android:layout_below="@+id/lblNPCode" 
    android:layout_centerHorizontal="true"/> 
<EditText 
    android:id="@+id/txtCNPCode" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:textSize="18sp" 
    android:layout_alignLeft="@+id/lblCNPCode" 
    android:layout_below="@+id/lblCNPCode" 
    android:layout_centerHorizontal="true"/> 

ja też caputer kodu klucza w setOnKeyListener

tCNPCode.setOnKeyListener(new OnKeyListener() { 
     public boolean onKey(View v, int keyCode, KeyEvent event) { 
      // TODO Auto-generated method stub 
      if(keyCode == 66) { 
       Toast.makeText(S_PCode.this, "Enter Key", Toast.LENGTH_LONG).show(); 
       //tNPCode.setFocusable(true); 
      } 
      return false; 
     } 
    }); 

Odpowiedz

12

Musisz użyć metody requestFocus. W twoim przypadku będzie to coś takiego:

tCNPCode.setOnKeyListener(new OnKeyListener() { 
    public boolean onKey(View v, int keyCode, KeyEvent event) { 
     if(keyCode == 66) { 
      txtCNPCode.requestFocus(); 
     } 
     return false; 
    } 
}); 
+1

Dziękuję. Używam requestFocus. Zadziałało. trzeba dodać return true ;? – soclose

+3

Proponuję odfiltrować go również za pomocą ACTION_UP, ponieważ dwa razy użyjesz metody onKey i jeśli implementujesz setOnKeyListener do listy EditTexts wewnątrz ArrayList , ryzykujesz wykonanie dwóch kroków do przodu. if (keyCode == KeyEvent.KEYCODE_ENTER && event.getAction() == KeyEvent.ACTION_UP) – jkanini

+0

Nie użyłbym rzeczywistego int literału, ponieważ nie jest w ogóle czytelny. – styler1972

34

Nie trzeba nawet używać OnKeyListener. Po prostu dodaj linię android:singleLine="true" do swojej EditText. Po tej operacji EditText zachowuje się dokładnie tak, jak chcesz. Tak więc w danym przypadku:

<EditText 
    android:id="@+id/txtNPCode" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:textSize="18sp" 
    android:layout_alignLeft="@+id/lblNPCode" 
    android:layout_below="@+id/lblNPCode" 
    android:layout_centerHorizontal="true" 
    android:singleLine="true" 
/> 
<EditText 
    android:id="@+id/txtCNPCode" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:textSize="18sp" 
    android:layout_alignLeft="@+id/lblCNPCode" 
    android:layout_below="@+id/lblCNPCode" 
    android:layout_centerHorizontal="true" 
/> 

rozwiązuje problem.

+0

To połączenie z IME było najlepszą opcją dzięki –

+0

Dzięki za to niesamowite i proste wyjaśnienie – anetha

+1

To id świetnie, ale android: singleLine = "true" jest przestarzałe. –

9

Najlepszym sposobem jest użycie jednej z opcji dla inputType, na przykład: android:inputType="textPersonName" Pozwoli to osiągnąć pożądany efekt. Sprawdź także inne opcje, zaoszczędzi ci to trochę czasu w przyszłości :)

Nie powinieneś używać android: singleLine = "true", ponieważ jest przestarzały. Oto co mówi o niej dokumentacje:

Ten atrybut jest przestarzała i zastąpiona flagą textMultiLine w atrybucie InputType. Zachowaj ostrożność podczas zmiany istniejących układów, ponieważ domyślna wartość singeLine jest fałszywa (tryb multi-line ), ale jeśli określisz dowolną wartość dla parametru inputType, domyślnym trybem jest tryb pojedynczej linii . (Jeśli znalezione zostaną zarówno atrybuty singleLine, jak i inputType, , flagi inputType zastąpią wartość singleLine.).

6

Rozważmy IME opcje, dobry Opis http://androidcookbook.com/Recipe.seam;jsessionid=C824437B48F346E23FBE5828969029B4?recipeId=422 i dokumentację tutaj http://developer.android.com/reference/android/widget/TextView.html#attr_android:imeOptions.

Jedyne czego potrzebujesz to atrybut add android: imeOptions = "actionNext" na każdym EditText. Klawiatura pojawia się z klawiszem Dalej, gdzie wcześniej był klawisz Enter i pozwala przejść do następnego EditText.

Ale kolejność "actionNext" jest od góry do dołu. Na przykład, jeśli masz poziomy układ:

<LinearLayout android:orientation="horizontal" > 
     <EditText android:id="@+id/et1" android:imeOptions="actionNext" /> 
     <EditText android:id="@+id/et2" android:imeOptions="actionNext" /> 
</LinearLayout> 

et2 nigdy się nie skupi. Trzeba naprawić go w kodzie:

et1.setOnEditorActionListener(new OnEditorActionListener() 
{ 
    @Override 
    public boolean onEditorAction(TextView v, int actionId, 
      KeyEvent event) 
    { 
     switch (actionId) 
     { 
     case EditorInfo.IME_ACTION_NEXT: 
      boolean result = false; 
      TextView v1 = (TextView) v.focusSearch(View.FOCUS_RIGHT); 
      if (v1 != null) 
       result = v1.requestFocus(View.FOCUS_RIGHT); 
      else if (!result) 
      { 
       v1 = (TextView) v.focusSearch(View.FOCUS_DOWN); 
       if (v1 != null) 
        result = v1.requestFocus(View.FOCUS_DOWN); 
      } 
      if (!result) 
       v.onEditorAction(actionId); 
      break; 

     default: 
      v.onEditorAction(actionId); 
      break; 
     } 
     return true; 
    } 
}); 

oryginalny link: https://groups.google.com/forum/?fromgroups=#!topic/android-developers/OykOG6XtE8w

1

Wystarczy ustawić maksymalną liczbę linii na pole w pliku XML szablonu EditText: android:maxLength="1"