2014-11-19 10 views
18

Sto cercando di ottenere una schermata di login per un app Android e finora questo è il mio codice:imeOptions Android = "actionDone" non funziona

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent"> 


    <LinearLayout 
     android:id="@+id/linearLayout1" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_centerInParent="true" 
     android:orientation="vertical"> 

     <EditText 
      android:id="@+id/username" 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      android:hint="Username" 
      android:inputType="text" 
      android:singleLine="true" 
      android:imeOptions="actionNext"> 

      <requestFocus /> 
     </EditText> 

     <EditText 
      android:id="@+id/password" 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      android:hint="Password" 
      android:inputType="textPassword" 
      android:singleLine="true" 
      android:imeOptions="actionDone" /> 

     <Button 
      android:id="@+id/buttonLaunchTriage" 
      android:layout_width="match_parent" 
      android:layout_height="0dp" 
      android:layout_weight="1" 
      android:text="@string/login" /> 
    </LinearLayout> 



</RelativeLayout> 

Quando provo a farlo funzionare, la tastiera mostra la destra le chiavi ma quando provo a premere dopo aver inserito la password, non succede nulla. Sto usando questo per gestire il pulsante:

private void setupLoginButton() { 
    Button launchButton = (Button) findViewById(R.id.buttonLaunchTriage); 
    launchButton.setOnClickListener(new View.OnClickListener() { 

     @Override 
     public void onClick(View v) { 
      EditText username = (EditText) findViewById(R.id.patient_start_userName_value); 
      EditText password = (EditText) findViewById(R.id.patient_start_password_value); 

      try { 
       if(TriageApplicationMain.validateUser(username.getText().toString(),password.getText().toString(),getApplicationContext())) 
       { 
       Toast.makeText(StartActivity.this, 
         "Launching Triage Application", Toast.LENGTH_SHORT) 
         .show(); 
       startActivity(new Intent(StartActivity.this, MainActivity.class)); 
       } 

       else 
        { 
        AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(
          StartActivity.this); 


         // set dialog message 
         alertDialogBuilder 
          .setMessage("Incorrect Credentials") 
          .setCancelable(false) 
          .setPositiveButton("OK",new DialogInterface.OnClickListener() { 
           public void onClick(DialogInterface dialog,int id) { 
            // if this button is clicked, close 
            // current activity 
           dialog.cancel();  
           } 
           }); 


          // create alert dialog 
          AlertDialog alertDialog = alertDialogBuilder.create(); 

          // show it 
          alertDialog.show(); 

        } 
       } 


      catch (IOException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 
     } 
    }); 

} 

So che questo è un sacco di codice, ma se qualcuno mi potrebbe aiutare qui sarebbe bello. Questo è per un progetto scolastico.

PS: Ho cercato tramite Google per un'ora solida prima di postare questo quindi per favore non criticare per non farlo. Se trovi un link che è utile, per favore condividi.

+0

Che cosa ti aspetti da "fatto" in tastiera soft-input? nascondere la tastiera stessa o procedere all'accesso? – waqaslam

+0

ho dovuto affrontare lo stesso problema, si dovrà aggiungere: Android: imeActionLabel = "Fatto" android: SingleLine = "true" ecco la risposta http://stackoverflow.com/questions/5578991/actiondone -imeoption-doesnt-work-on-edittext-in-android-2-3/5579944 # 5579944 –

risposta

29

È necessario impostare OnEditorActionListener per EditText per implementare l'azione che si desidera eseguire quando l'utente fa clic su "Fine" nella tastiera.

Pertanto, è necessario scrivere del codice come:

password.setOnEditorActionListener(new OnEditorActionListener() { 
    @Override 
    public boolean onEditorAction(TextView v, int actionId, KeyEvent event) { 
     if (actionId == EditorInfo.IME_ACTION_DONE) { 
      // Do whatever you want here 
      return true; 
     } 
     return false; 
    } 
}); 

vedere l'esercitazione in android developer site

+0

grazie per la risposta. Sono un po 'sceso dallo stackoverflow per un po'.indietro ora :) – Mak

19

Qianqian è corretta. Il tuo codice ascolta solo l'evento clic sul pulsante, non per l'evento EditorAction.

Desidero aggiungere che alcuni fornitori di telefoni potrebbero non implementare correttamente l'azione FATTO. Ho testato questo con un A889 di Lenovo per esempio, e che il telefono non invia mai EditorInfo.IME_ACTION_DONE quando si preme fatto, invia sempre EditorInfo.IME_ACTION_UNSPECIFIED così ho effettivamente finire con qualcosa di simile

myEditText.setOnEditorActionListener(new EditText.OnEditorActionListener() { 
    @Override 
    public boolean onEditorAction(final TextView v, final int actionId, final KeyEvent event) 
    { 
    boolean handled=false; 

    // Some phones disregard the IME setting option in the xml, instead 
    // they send IME_ACTION_UNSPECIFIED so we need to catch that 
    if(EditorInfo.IME_ACTION_DONE==actionId || EditorInfo.IME_ACTION_UNSPECIFIED==actionId) 
    { 
     // do things here 

     handled=true; 
    } 

    return handled; 
    } 
}); 

notare il flag "gestito" anche (Qianqian non ha spiegato quella parte). Potrebbe essere che altri OnEditorActionListeners più in alto stiano ascoltando eventi di un tipo diverso. Se il tuo metodo restituisce false, significa che non hai gestito questo evento e verrà trasmesso ad altri. Se restituisci true significa che lo hai gestito/consumato e non sarà trasmesso ad altri.

+2

Grazie stavo esattamente ricevendo questo IME_ACTION_UNSPECIFIED invece del previsto IME_ACTION_SEND – flaviodesousa

+1

Questa dovrebbe essere la risposta corretta – HendraWD

24

Basta aggiungere android:inputType="..." al tuo EditText. Funzionerà!! :)

4

Usa android:inputType="Yours" poi

android:lines="1" 
android:imeOptions="actionDone" 
0

Si dovrebbe impostare OnEditorActionListener per l'EditText per realizzare l'azione che si desidera eseguire quando l'utente fa clic sul "Fatto" in tastiera.

0

Dopo aver provato molte cose, questo è ciò che ha funzionato per me:

android:maxLines="1" 
    android:inputType="text" 
    android:imeOptions="actionDone" 
+0

Questo non fornisce una risposta alla domanda. Una volta che hai [reputazione] sufficiente (https://stackoverflow.com/help/whats-reputation) sarai in grado di [commentare qualsiasi post] (https://stackoverflow.com/help/privileges/comment); invece [fornisci risposte che non richiedono chiarimenti da parte del richiedente] (https://meta.stackexchange.com/questions/214173/why-do-i-need-50-reputation-to-comment-what-can- i-do-, invece). - [Dalla recensione] (/ recensione/post di bassa qualità/18007334) –