2012-07-01 16 views
11

Un sacco di tempo è stato speso per risolvere il problema, e sembra facile, ma sono davvero stanco e non sono riuscito a trovare la soluzione. Ho un'attività, l'attività ha 4 componenti di EditText, 2 di loro ha un menu popup (AlertDialog) che contiene l'elenco, il successivo - è disabilitato per la modifica e l'ultimo - è modificabile e dovrebbe mostrare la tastiera virtuale, quando l'utente sta toccando su di esso.requestFocus non funziona correttamente per EditText

Inoltre, la mia radice LinearLayout ha LinearLayout che contiene all'interno RelativeLayout. L'ultimo è necessario per AdvBanner. Last LinearLayout (RelativeLayout) è allineato alla parte inferiore del layout di root.

La parte di XML che descrive:

<LinearLayout 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent" 
     android:layout_gravity="bottom" 
     android:focusable="false" 
     android:focusableInTouchMode="false" 
     android:gravity="bottom"> 
    <RelativeLayout 
     android:id="@+id/AdvLayoutReserveArea" 
     android:layout_width="fill_parent" 
     android:layout_height="50dp" 
     android:background="#FFFFFF" 
     android:focusable="false" 
     android:focusableInTouchMode="false" 
     android:gravity="bottom" /> 
    </LinearLayout> 

Quando l'attività è avvia, modificabile EditText è messa a fuoco con GREEN confine e il cursore lampeggia. Dopo pochi secondi rimasti, AdvBanner viene caricato e visualizzato. Quando succede, EditText modificabile perde il focus ... da questo momento, la mia vita sarà come un incubo.

Guardiamo passo dopo passo.

problema 1. Se in QUESTO MOMENTO (quando Adv caricata e appare) utente sta modificando un campo EditText tramite la tastiera software, messa a fuoco è perso, confine prendere un grigio colore , e se l'utente continua digitare un testo non ha alcun risultato - i simboli non vengono stampati (CURSOR in EditText è troppo perso).

PENSO che qualsiasi utente sarà annoiato - quando si digita il testo, e il cursore è inattivo, perché in background alcuni caricatori sono caricati e si concentrano su se stessi.

Per risolvere questo, nel metodo quando è caricato Adv (viene mostrato) provo a spostare manualmente la messa a fuoco su EditText tramite il metodo requestFocus.

public void onAdLoaded() 
    { 
// TODO Auto-generated method stub 
// add app specific code for this event here... 
// called when an ad is successfully displayed on device    
    CountEdit1.requestFocus(); 
} 

Sì, il cursore viene restituito al campo EditText, e se tastiera virtuale è attiva, l'utente può ancora scrivendo il testo, ma di confine di campo EditText rimanere GREY ...

NOTA: in realtà io Non sono sicuro della differenza tra il bordo VERDE e GRIGIO di EditText focalizzato .. VERDE di solito quando l'utente lo sta toccando, e GRIGIO, probabilmente, quando vogliamo richiedere un focus manualmente (usando requestFocus() ecc.)

Problema 2. (Come risultato della solvatazione Probl em # 1). Dopo aver chiuso la tastiera morbida, se l'utente tocca il campo EditText modificabile, mette a fuoco e il cursore appare all'interno, ma nessuna reazione per mostrare di nuovo la tastiera morbida! Toccando su di esso non viene mostrata la tastiera software, ma appare come il campo di modifica in modalità copia - quando l'utente può selezionare un testo e tagliarlo/copiarlo negli appunti.

Il mio obiettivo è facile per un primo sguardo. Voglio solo SALVARE il cursore e mettere a fuoco il campo EditText modificabile (CountEdit1) mentre viene mostrata la tastiera morbida e l'utente che digita del testo. E reazione normale quando l'utente tocca EditText - come di solito, mostrami solo la tastiera virtuale!

Ho letto tutti i problemi qui, ho combinato diversi metodi (clearFocus, requestFocusFromTouch ecc.), Non abbastanza tempo e spazio per descrivere tutto ciò che ho cercato di fare per risolvere questo problema.I problemi principali sono descritti sopra.

speranza di aiuto e risolvere il problema ... Grazie in anticipo ..

risposta

13

L'obiettivo è risolto, la soluzione è più facile di quanto pensassi. Il problema n. 2 viene risolto utilizzando il metodo onClick(). Condizione sufficiente per la visualizzazione di una tastiera virtuale che utilizza entrambi i metodi clearFocus() e requestFocus().

CountEdit1.setOnClickListener(new OnClickListener() { 

     @Override 
     public void onClick(View v) 
     { 
       CountEdit1.clearFocus(); 
     CountEdit1.requestFocus(); 
     } 
    }); 

La tastiera virtuale appare quando l'utente è toccando sul campo EditText. Risolto.

4
userInput.post(new Runnable() { 
      public void run() { 
       userIdInput.requestFocus(); 

      } 
     }); 

avere un andare a questo e dire se il problema è ancora irrisolto.

+0

Grazie, ma questo codice non risolvere il problema. Ho anche giocato prima con lo stesso codice. Lo inserisco nella mia lezione di attività, ma non ho ancora progressi. In aggiunta alla descrizione principale ho 2 modi con half-solving: 1) se rimuovo CountEdit1.requestFocus(); da public void onAdLoaded(), quindi appare Soft Keyboard se l'utente tocca EditText anche dopo che Adv è stato caricato, BUT .. se Adv caricato mentre softkeyboard è stato mostrato, l'utente ha perso un cursore nel campo EditText e non può continuare a immettere testo. – Dimon

+0

2) con CountEdit1.requestFocus(); in onAdLoaded(), l'utente può continuare il campo di modifica dopo che è stato caricato Adv, ma dopo che il softkeyboard è stato chiuso, toccando successivamente con EditText non si visualizza più la tastiera software! Questa situazione mi ha stancato così tanto ... – Dimon

+0

Anche tu non stai visualizzando la tastiera virtuale manualmente se non si presenta da sola ..? – Swayam

7

funziona per me:

InputMethodManager mgr = (InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE); 
editField.requestFocus(); 
mgr.showSoftInput(editField, InputMethodManager.SHOW_IMPLICIT); 
0

Si dovrebbe richiedere l'attivazione quando vista viene creata nel frammento o attività:

@Override 
public void onViewCreated(View view, Bundle savedInstanceState) { 
    CountEdit1.requestFocus(); 
} 
0

provare questo:

public void onAdLoaded() 
    { 
    final Handler handler = new Handler(); 
      handler.postDelayed(new Runnable() { 
       @Override 
       public void run() { 
        CountEdit1.requestFocus(); 
        InputMethodManager mgr = (InputMethodManager) base.getActivity().getSystemService(Context.INPUT_METHOD_SERVICE); 
        mgr.showSoftInput(CountEdit1, InputMethodManager.SHOW_IMPLICIT); 
        CountEdit1.setSelection(CountEdit1.getText().length()); 
       } 
      },0); 
} 
Problemi correlati