2015-06-02 46 views
5

Chcę utworzyć układ, w którym użytkownik wpisuje nazwę wykonawcy, a po naciśnięciu przycisku wyszukiwania na wirtualnej klawiaturze wyświetlana jest lista artystów.setOnEditorActionListener nie jest wywoływany w lollipop

View rootView = (View) inflater.inflate(R.layout.fragment_search, container, false); 
EditText searchArtist = (EditText) rootView.findViewById(R.id.searchArtist); 
searchArtist.setOnEditorActionListener(new TextView.OnEditorActionListener() { 
    @Override 
    public boolean onEditorAction(TextView v, int actionId, KeyEvent event) { 
     if (actionId == EditorInfo.IME_ACTION_SEARCH) { 
      makeToast(); 
      return true; 
     } 
     return false; 
    } 
}); 

Oto mój xml

<EditText 
    android:id="@+id/searchArtist" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:hint="@string/search_artist" 
    android:imeOptions="actionSearch" 
    android:inputType="text"> 
    <requestFocus /> 

Szukałem dużo w innych stackoverflow dotyczących tego postu, ale żaden z roztworów wydają się działać.

MinSDK 21, testowanie na węźle 6, kompilacjaSdkVersion 22, buildToolsVersion '22 .0.1 '.

Należy również zauważyć, że searchArtist (edittext) znajduje się wewnątrz fragmentu.

Więcej kontekstu: kod detektora znajduje się w metodzie onCreateView.

Odpowiedz

1

Po wypróbowaniu wszystkich rozwiązań, w tym setOnKeyListener i textChangeListener. Ostatecznym rozwiązaniem było usunięcie projektu i rozpoczęcie od zera. Sądzę, że był problem z otoczeniem.

Bardzo lubię Android Studio, ale czasami te błędy mnie ustawiają.

0

Zgodnie z sugestią here, spróbuj wsłuchać się w kluczowe wydarzenie akcji edytora.

Docs można znaleźć here

+0

Próbowałem już tego. Niestety to nie działa. Ponadto, ponieważ miękkie metody wprowadzania mogą wykorzystywać wiele i pomysłowe sposoby wprowadzania tekstu, nie ma gwarancji, że naciśnięcie dowolnego klawisza na klawiaturze wygeneruje kluczowe zdarzenie: pozostawia to decyzję IME, a w rzeczywistości wysyłanie takich zdarzeń jest zniechęcane. . Nigdy nie należy polegać na odbiorze KeyEvents dla dowolnego klawisza metodą miękkiego wprowadzania danych. Src -> http://developer.android.com/reference/android/view/KeyEvent.html – GauravPandey

2

testowałem podobny kod na Androidzie 5.1.1. To działa. Zaproponowałem, aby wstawić komunikat dziennika, aby sprawdzić, czy onEditorAction jest nazywany:

public boolean onEditorAction(TextView v, int actionId, KeyEvent event) { 
    Log.v("TAG", "onEditorAction(): " + actionId); 
    if (actionId == EditorInfo.IME_ACTION_SEARCH) { 
     Log.v("TAG", "onEditorAction(): entered"); 
    ... 

W ten sposób można zapewnić, metoda jest naprawdę miano. EditorInfo.IME_ACTION_SEARCH jest stała: 3

Zakładam, że makeToast(); to jest metoda, którą tworzysz, prawda?

Aby dodać więcej informacji, przetestowałem twój kod w Fragmentie. Tak naprawdę nie sądzę, że problem polega na tym, gdzie wstawiono twój kod. Musisz tylko upewnić się, że detektor został ustawiony przed użyciem. nadzieję, że może pomóc

public class MainFragment extends Fragment { 
.... 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
     Bundle savedInstanceState) { 

     // view is a reference to whole fragment layout (where searchArtist is inserted) 
     View view = inflater.inflate(R.layout.fragment, null); 

     // Find searchArtist (There's only one @id/searchArtist inside View) 
     EditText searchArtist = (EditText)view.findViewById(R.id.searchArtist); 

     searchArtist.setOnEditorActionListener(new TextView.OnEditorActionListener() { 
     @Override 
     public boolean onEditorAction(TextView v, int actionId, KeyEvent event) { 
      if (actionId == EditorInfo.IME_ACTION_SEARCH) { 
       Log.v("TEMP", "I'm being clicked " + actionId); 
       return true; 
      } 
      return false; 
     } 
    }); 
    return view; 
    }// End of onCreateView 
} // End of Fragment 

Moje xml:

<EditText android:id="@+id/searchArtist" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content"  
    android:hint="@string/search_artist"  
    android:imeOptions="actionSearch" 
    android:inputType="text" /> 
+0

Tak, makeToast() to metoda używana do pseudo Debugging. Próbowałem dodać zalecany pełny dziennik. Słuchacz nie jest wywoływany. Czy próbowałeś tego wewnątrz fragmentu lub działania? – GauravPandey

+0

Przetestowałem w działaniu. Ale mam bardzo podobny kod w części mojej aplikacji ... działa również. Sprawdźmy więcej ... – W0rmH0le

+0

Tak, moje też. Mam inne metody słuchania, które działają doskonale dobrze, tylko to nie działa. Aby uzyskać więcej kontekstu, mam ten kod w moim onCreateView. Czy to coś zmienia? – GauravPandey

0

Miałem ten sam problem: ani OnEditorActionListener, ani onKeyListener nie działały.

Ale rozwiązanie TextChangeListener załatwiło sprawę. Dla mnie.

urywek:

protected void onCreate(Bundle savedInstanceState){ 
    ... 
    someField = (EditText) this.findViewById(R.id.some_field); 
    someField.addTextChangeListener(someListener); 
    ... 
}