2010-11-03 5 views
24

angerufen Auf nur einem Telefon, auf dem ich teste (HTC Incredible, Android 2.2, Software 3.21.605.1), tritt das folgende Verhalten auf.OnEditorActionListener zweimal mit self eventTime auf der SenseUI-Tastatur

Der Ereignisbehandler onEditorAction wird zweimal (sofort) aufgerufen, wenn die Eingabetaste auf der Sense UI-Tastatur gedrückt wird.

Die KeyEvent.getEventTime() ist für beide gleich mal das Ereignis aufgerufen wird, führt mich zu dieser Behelfslösung:

protected void onCreate(Bundle savedInstanceState) { 
    [...] 

    EditText text = (EditText)findViewById(R.id.txtBox); 
    text.setOnEditorActionListener(new OnEditorActionListener() { 
     private long lastCalled = -1; 

     public boolean onEditorAction(TextView v, int actionId, KeyEvent event) { 
      if (event.getEventTime() == lastCalled) { 
       return false; 
      } else { 
       lastCalled = event.getEventTime(); 
       handleNextButton(v); 
       return true; 
      } 
     } 
    }); 

    [...] 
} 

EditText ist definiert als:

<EditText 
    android:layout_width="150sp" 
    android:layout_height="wrap_content" 
    android:id="@+id/txtBox" 
    android:imeOptions="actionNext" 
    android:capitalize="characters" 
    android:singleLine="true" 
    android:inputType="textVisiblePassword|textCapCharacters|textNoSuggestions" 
    android:autoText="false" 
    android:editable="true" 
    android:maxLength="6" 
/> 

On Bei allen anderen Geräten, die ich getestet habe, ist die Aktionstaste ordnungsgemäß mit "Next" gekennzeichnet und das Ereignis wird nur einmal aufgerufen, wenn diese Taste gedrückt wird.

Ist das ein Fehler in der Tastatur von Sense UI, oder mache ich etwas falsch?

Vielen Dank für Ihre Hilfe.


Aktualisiert - dank der Antworten, die ich gegeben habe, habe ich mich auf die folgenden als meine Schecks festgelegt. Dies funktioniert gut auf beide der Telefone I-Test zur Verfügung haben (Sense UI und CyanogenMod CM7)

  if (event != null && event.getAction() != KeyEvent.ACTION_DOWN) { 
       return false; 
      } 

      if (actionId != EditorInfo.IME_ACTION_NEXT && actionId != EditorInfo.IME_NULL) { 
       return false; 
      } 
+2

Keine Antwort für Sie Ich habe Angst, ich wollte nur sagen, dass ich heute von diesem Problem getroffen wurde. Ich habe die HTC Sense-Tastatur noch nie zuvor gesehen ... ugh!Und wie sind sie damit davongekommen, die textNoSuggestions-Flagge zu ignorieren? Macht meine Benutzeroberfläche ein bisschen sucky, verrotten sie. –

+0

Ich habe festgestellt, dass viele Apps nicht richtig funktionieren, da ihre Tastatur die Standardschaltfläche nicht implementiert (es ist immer "Enter"). Dies schließt von Google bereitgestellte Anwendungen ein (einschließlich der ersten Registrierung). Es scheint eine ziemlich große Sache für HTC zu übersehen. Es ist eine Schande, weil ich eigentlich SenseUI mehr als Motoblur mag. Danke für die Bestätigung. – mbafford

Antwort

26

Wie mitch sagte, haben Sie die Ereignisaktion zu überprüfen:

public boolean onEditorAction(TextView v, int actionId, KeyEvent event) { 
    if (event.getAction() != KeyEvent.ACTION_DOWN) 
     return false; 

    // do your stuff 

    return true; 
} 

Dieser Code-Schnipsel funktioniert sowohl auf der Sense UI und dem Emulator.

+2

Dies scheint fast die Antwort zu sein, obwohl auf meinem anderen Telefon (mit CyanogenMod CM7), "Ereignis" null ist, wenn ich "Weiter" auf der Tastatur drücke, also muss ich auch dafür überprüfen. – mbafford

+1

Ich habe auch eine hinzugefügt "if (actionId == EditorInfo.IME_ACTION_UNSPECIFIED) Rückgabe false;" zu der Methode. – AlexVogel

0

stattdessen eine ime Aktion und Null als ein Ereignis zu senden, sendet er ein Berührungsereignis also, wenn Ihr nicht immer richtige Aktion Sie das Ereignis für action_up überprüfen oder action_down

+1

Ich verstehe nicht, was Sie hier sagen. Gibt es ein Ereignis, das sowohl auf der Sense-Benutzeroberfläche von HTC als auch auf anderen Tastaturen ordnungsgemäß funktioniert, die die Standardaktion ordnungsgemäß implementieren? – mbafford

3
(EditText) passwordView = (EditText) findViewById(R.id.password); 
passwordView.setImeOptions(EditorInfo.IME_ACTION_DONE); 
    passwordView.setOnEditorActionListener(new OnEditorActionListener() 
     { 
      @Override 
      public boolean onEditorAction(TextView v, int actionId, KeyEvent event) 
      { 
       String input; 
       if(actionId == EditorInfo.IME_ACTION_DONE) 
       { 
        input= v.getText().toString(); 
        Toast toast= Toast.makeText(LogIn.this,input, 
          Toast.LENGTH_LONG); 
        toast.setGravity(Gravity.CENTER, 0, 0); 
        toast.show(); 
        return true; 
       } 
       return false; 
      } 
     }); 
0

Zurück wahr; nach ur Fall der Handhabung und es wird nicht wieder

public boolean onEditorAction(TextView v, int actionId, KeyEvent event) { 

       if (actionId == EditorInfo.IME_NULL) 
       { 
        Log.i("here","Add product "); 
        return true; //this does the trick 
       } 
       return false; 
      }  
1

Ich denke, genannt werden, wenn Sie true zurück, bedeutet es, dass Sie in den Rest der Ereignisse interessiert sind, bis sie IME_ACTION_DONE erreicht. Wenn Sie also false zurückgeben, bedeutet das, dass Sie an den Ereignissen nicht interessiert sind und dass andere Ansichten dann die Möglichkeit haben, damit umzugehen. Da Sie nur eine Ansicht haben, schlage ich vor, dass Sie die Aktion actionId einfach ignorieren und jedes Mal nur false zurückgeben.

etMovieName = (EditText) view.findViewById(R.id.et_movie_name); 
etMovieName.setOnEditorActionListener(new TextView.OnEditorActionListener() { 
    @Override 
    public boolean onEditorAction(TextView tv, int actionId, KeyEvent event) { 
     System.out.println("actionId= "+ actionId); 
     performSearch(); 
     return false; 
    } 
}); 

Andere Situation ist, wenn man sich überlappenden Ansichten oder eine Geschwister Ansicht hat, dann können Sie ActionID verwenden, um Informationen rund um einen Pass zu spielen. Wenn Sie in diesem Fall true zurückgeben, können Sie Informationen an die andere Ansicht weiterleiten. Wenn Sie wirklich für den Fall interessiert sind/ActionID (zum Beispiel, wenn Sie einen anderen Geschwister Blick), dann können Sie dies tun:

etMovieName = (EditText) view.findViewById(R.id.et_movie_name); 

etMovieName.setImeOptions(EditorInfo.IME_ACTION_DONE); 
etMovieName.setSingleLine(); 

etMovieName.setOnEditorActionListener(new TextView.OnEditorActionListener() { 
    @Override 
    public boolean onEditorAction(TextView tv, int actionId, KeyEvent event) { 
     System.out.println("actionId= "+ actionId); 
     return performSearch();  } 
}); 

Hinweis der ActionID Wert hat sich geändert bis 6, sobald ich hinzugefügt:

etMovieName.setImeOptions(EditorInfo.IME_ACTION_DONE); 
etMovieName.setSingleLine(); 
+1

Sehr seltsames Verhalten, aber es scheint, dass Sie genau richtig sind. –