Come mostrare la tastiera virtuale quando è focalizzato l'edittext


461

Voglio mostrare automaticamente la tastiera virtuale quando EditTextè focalizzata (se il dispositivo non ha una tastiera fisica) e ho due problemi:

  1. Quando Activityviene visualizzato my, my EditTextè focalizzato ma la tastiera non è visualizzata, è necessario fare di nuovo clic su di essa per mostrare la tastiera (dovrebbe essere visualizzata quando Activityviene visualizzata my ).

  2. E quando faccio clic su Fine sulla tastiera, la tastiera viene ignorata, ma EditTextrimane focalizzata e non voglio (perché la mia modifica è terminata ).

Per riprendere, il mio problema è avere qualcosa di più simile all'iPhone: che mantiene la tastiera sincronizzata con il mio EditTextstato (focalizzato / non focalizzato) e ovviamente non presenta una tastiera soft se ce n'è una fisica.


Ho solo un EditText di base come: <EditText android: id = "@ + id / myEditText" android: layout_width = "fill_parent" android: layout_height = "wrap_content" android: imeOptions = "actionDone" /> E sulla mia attività ho questo: EditText editTxt = (EditText) findViewById (R.id.myEditText); editTxt.requestFocus ();
Ludovic Landry,

2
Questo mi ha aiutato meglio di qualsiasi risposta in questo post: stackoverflow.com/a/2418314/1491212
Armel Larcier,

Risposte:


629

Per forzare la visualizzazione della tastiera virtuale, è possibile utilizzare

EditText yourEditText= (EditText) findViewById(R.id.yourEditText);
yourEditText.requestFocus();
InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
imm.showSoftInput(yourEditText, InputMethodManager.SHOW_IMPLICIT);

E per rimuovere la messa a fuoco EditText, purtroppo devi avere un manichino Viewper afferrare la messa a fuoco.

spero che questo possa essere d'aiuto


Per chiuderlo puoi usare

InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(yourEditText.getWindowToken(), 0);

Funziona per usarlo in una finestra di dialogo

public void showKeyboard(){
    InputMethodManager inputMethodManager = (InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE);
    inputMethodManager.toggleSoftInput(InputMethodManager.SHOW_FORCED, 0);
}

public void closeKeyboard(){
    InputMethodManager inputMethodManager = (InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE);
    inputMethodManager.toggleSoftInput(InputMethodManager.HIDE_IMPLICIT_ONLY, 0);
}

2
Se lo faccio, la soft-tastiera viene mostrata quando appare l'attività (va bene) ma quando la mia attenzione lascia il EditText e vado ad un pulsante, ad esempio, la tastiera rimane (va male).
Ludovic Landry,

157
Per me non funziona con un EditText in una finestra di dialogo che è già attiva. Non so perché.
Matthias,

10
@AbdellahBenhammou, forse eseguendo una richiesta La messa a fuoco sul testo di modifica prima di mostrare l'input software potrebbe risolvere il problema. Lo ha fatto per me.
r1k0,

18
@AbdellahBenhammou, fallo nel tuo onCreate () di DialogFragment (): getDialog (). GetWindow (). SetSoftInputMode (WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE);
Phillip

22
Ha funzionato solo insieme a yourEditText.requestFocus()come descritto qui: stackoverflow.com/questions/8991522/…
Vivek Pandey

231

Ho avuto lo stesso problema. Immediatamente dopo editText, la VISIBILITÀ cambia da GONE a VISIBLE, ho dovuto impostare la messa a fuoco e visualizzare la tastiera software. Ho raggiunto questo usando il seguente codice:

new Handler().postDelayed(new Runnable() {

    public void run() {
//        ((EditText) findViewById(R.id.et_find)).requestFocus();
//              
        EditText yourEditText= (EditText) findViewById(R.id.et_find);
//        InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
//        imm.showSoftInput(yourEditText, InputMethodManager.SHOW_IMPLICIT);

        yourEditText.dispatchTouchEvent(MotionEvent.obtain(SystemClock.uptimeMillis(), SystemClock.uptimeMillis(), MotionEvent.ACTION_DOWN , 0, 0, 0));
        yourEditText.dispatchTouchEvent(MotionEvent.obtain(SystemClock.uptimeMillis(), SystemClock.uptimeMillis(), MotionEvent.ACTION_UP , 0, 0, 0));                           
    }
}, 200);

Funziona per me con un ritardo di 100 ms, ma non è riuscito senza alcun ritardo o con solo un ritardo di 1 ms.

La parte commentata del codice mostra un altro approccio, che funziona solo su alcuni dispositivi. Ho testato su OS versioni 2.2 (emulatore), 2.2.1 (dispositivo reale) e 1.6 (emulatore).

Questo approccio mi ha risparmiato molto dolore.


48
Non sapevo che qualcosa potesse essere così brutto e così bello allo stesso tempo. Grazie mille!
Mkerley,

15
@jellyfish simula un tocco sul EditText. Per altri che leggono questo, invece di crearne uno nuovo, Handlerpuoi anche usare il View.postDelayed()metodo sul yourEditTextwidget stesso.
Tony Chan,

5
Questo è un trucco - soluzione molto migliore di David Chandler.
Ben Bederson,

4
Se la soluzione di David Chandler funziona su tutte le versioni / dispositivi Android e nel caso in cui VISIBILITÀ fosse appena cambiata da ANDATO a VISIBILE, allora SÌ - dovresti invece usare la sua soluzione.
Mike Keskinov,

3
Concordato. Conosci una soluzione migliore che funziona su tutti i gusti Android?
Mike Keskinov,

162

Per far apparire la tastiera, usare

getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE);

Questo metodo è più affidabile rispetto al richiamo diretto di InputMethodManager.

Per chiuderlo, usa

getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN);

12
Qualcuno può spiegare perché questo è più affidabile che invocare direttamente InputMethodManager? (Per uno, non funziona, a differenza della soluzione di Raukodraug.)
Matthew Quiros,

5
Neanche per me funziona. Lavorare in Android 2.3.5. La soluzione di Raukodraug funziona per me. Ho cercato la dipendenza dalla versione ma non ne ho trovata una.
Hugo Logmans,

2
Questo ha funzionato per me in Android 4.4.2. Il metodo InputMethodManager scelto come soluzione per questo post non ha funzionato per me.
Phil

dopo aver usato il metodo nella risposta ho aggiunto questo e ha funzionato, ma senza di esso non ha funzionato. grazie
Manny265,

2
Non ha funzionato per me in Android 4.4.2. Mostra la tastiera ma non l'ha nascosta.
John J Smith,

87

Quando nient'altro funziona, forzalo ad essere mostrato :

editText.requestFocus();
InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
imm.toggleSoftInput(InputMethodManager.SHOW_FORCED, InputMethodManager.HIDE_IMPLICIT_ONLY);

E poi, se si desidera chiuderlo, ad esempio in onPause (), è possibile chiamare:

InputMethodManager imm = (InputMethodManager) getActivity().getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(editText.getWindowToken(), 0);

4
Avevi ragione, @Bolling! Quando nient'altro ha funzionato, il tuo codice mi ha salvato. Grazie!
Willian Paixao,

3
Il tuo codice è stato l'unico che ha funzionato per me e ho provato tutte le soluzioni in questa pagina! Molte grazie!
Mattia Ruggiero,

4
non forzarlo. in alcuni casi quando passi dal primo piano allo sfondo la tastiera rimarrà lì perché l'hai forzata. è un problema di frammentazione ma l'ho visto su Samsung Duos.
j2emanue,

Di solito ho sempre il codice per chiudere la tastiera onPause () poiché l'ho visto bloccato anche se non lo hai forzato.
Bolling

Ha funzionato, ma quando si sposta sugli altri schermi, rimane ancora aperto
Sithu, il

75

Il seguente codice viene rubato dal codice sorgente 4.1 di Google per SearchView. Sembra funzionare, anche su versioni minori di Android.

private Runnable mShowImeRunnable = new Runnable() {
    public void run() {
        InputMethodManager imm = (InputMethodManager) getContext()
                .getSystemService(Context.INPUT_METHOD_SERVICE);

        if (imm != null) {
            imm.showSoftInput(editText, 0);
        }
    }
};

private void setImeVisibility(final boolean visible) {
    if (visible) {
        post(mShowImeRunnable);
    } else {
        removeCallbacks(mShowImeRunnable);
        InputMethodManager imm = (InputMethodManager) getContext()
                .getSystemService(Context.INPUT_METHOD_SERVICE);

        if (imm != null) {
            imm.hideSoftInputFromWindow(getWindowToken(), 0);
        }
    }
}

Inoltre, è necessario aggiungere il seguente codice quando viene creato il controllo / attività. (Nel mio caso è un controllo composito, piuttosto che un'attività).

this.editText.setOnFocusChangeListener(new View.OnFocusChangeListener() {
    public void onFocusChange(View v, boolean hasFocus) {
        setImeVisibility(hasFocus);
    }
});

Grazie! Funziona incredibilmente bene. Ed è la soluzione con cui mi sento più a mio agio da tutte le risposte e gli argomenti che ho letto su questo problema.
Rui,

37
MrGreen setImeVisibility(hasFocus)?
Matthias,

Ho provato questo metodo poiché stavo "rotolando la mia vista di ricerca" (non volevo farlo ma c'erano dei motivi). Questo ha funzionato per me, tranne per l'avvio dell'attività. Ho aggiunto android: windowSoftInputMode = "alwaysVisible" all'attività e avevo già requestFocus () chiamato sul testo di modifica. Funziona come un campione.
javahead76

Qualche idea sulla necessità di removeCallbacks (mShowImeRunnable)? Ho pensato che una volta che il runnable è stato scelto per essere eseguito dalla coda, verrà rimosso anche dalla coda allo stesso tempo?
Cheok Yan Cheng

1
Dopo aver provato diverse varianti, questa è stata l'unica che ha funzionato costantemente per me (Android 4.42). Grazie
John J Smith il

34

android:windowSoftInputMode="stateAlwaysVisible" -> nel file manifest.

edittext.requestFocus(); -> nel codice.

Si aprirà la tastiera virtuale su cui il testo di modifica ha lo stato attivo richiesto mentre viene visualizzata l'attività.


2
Questo apre la tastiera durante la creazione di attività.
XX

non risponde alla domanda, ma mi ha aiutato :)
S.Thiongane il

apre la chiave senza requestfocus in api 22
David

Funziona bene per il mio caso. Mi chiedo perché anche l'attributo focus focus solo dall'xml abbia bisogno di essere menzionato manifest!
sud007,

30

Ho avuto un po 'di fortuna in alcuni casi semplici con il codice qui sotto. Non ho finito tutti i test ma ...

EditText input = (EditText) findViewById(R.id.Input);
input.requestFocus();    
input.dispatchTouchEvent(MotionEvent.obtain(SystemClock.uptimeMillis(), SystemClock.uptimeMillis(), MotionEvent.ACTION_DOWN , 0, 0, 0));
input.dispatchTouchEvent(MotionEvent.obtain(SystemClock.uptimeMillis(), SystemClock.uptimeMillis(), MotionEvent.ACTION_UP , 0, 0, 0));

E presto la tastiera si presenta.


Nel mio caso avevo un pulsante per aggiungere alcune informazioni opzionali. Nel gestore button.onClick è stato aggiunto il codice sopra per forzare la tastiera virtuale ad apparire per l'input delle informazioni opzionali. Droid 2.2.2
Dent

questa è una buona soluzione, ma non dimenticare che è necessario creare un oggetto MotionEvent e chiamare recycle () su di essi dopo l'uso, per essere riutilizzato da un chiamante successivo.
Jimbob,

Hai solo bisogno di un dispatchTouchEvent () con ACTION_UP come argomento ..
Mohammed Junaid

15

Puoi provare a forzare la visualizzazione della tastiera virtuale, funziona per me:

...
dialog.show();
input.requestFocus();
InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
imm.toggleSoftInput(InputMethodManager.SHOW_FORCED, 0);

1
Questo funziona per me ... Avevo provato questi InputMethodManager imm = (InputMethodManager) getSystemService (Context.INPUT_METHOD_SERVICE); imm.showSoftInput (nome, inputMethodManager.SHOW_IMPLICIT); oppure getWindow (). setSoftInputMode (WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE); ma nessuno di loro funzionava.
Günay Gültekin,

10

A volte la risposta di raukodraug non funziona. L'ho fatto in questo modo con alcune prove ed errori:

public static void showKeyboard(Activity activity) {
    if (activity != null) {
        activity.getWindow()
                .setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
    }
}

public static void hideKeyboard(Activity activity) {
    if (activity != null) {
        activity.getWindow()
                .setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);
    }
}

E la parte EditText :

    editText.setOnFocusChangeListener(new View.OnFocusChangeListener() {
        @Override
        public void onFocusChange(View v, boolean hasFocus) {
            if (!hasFocus) {
                hideKeyboard(getActivity());
            } else {
                showKeyboard(getActivity());
            }
        }
    });

1
Questa è l'unica soluzione che ha funzionato per me su Android 5
user1021430

10

Per nascondere la tastiera, usa questa:

getActivity().getWindow().setSoftInputMode(
    WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);

e per mostrare la tastiera:

getActivity().getWindow().setSoftInputMode(
    WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);

Per un DialogFragment, puoi chiamarlo in un override onStart()e puoi usarlo getDialog().getWindow()come alternativa a getActivity().getWindow().
Mr-IDE,

10

E per Kotlin basta usare queste estensioni:

fun EditText.showKeyboard() {
    val imm = context.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
    imm.showSoftInput(this, InputMethodManager.SHOW_IMPLICIT)
}

fun EditText.hideKeyboard() {
    val imm = context.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
    imm.hideSoftInputFromWindow(this.windowToken, 0)
}

Proprio quello che stavo cercando.
lasec0203,

8

Per frammento, assicurati che funzioni:

 displayName = (EditText) view.findViewById(R.id.displayName);
    InputMethodManager imm = (InputMethodManager) getActivity().getSystemService(Context.INPUT_METHOD_SERVICE);
    imm.toggleSoftInput(InputMethodManager.SHOW_FORCED, 0);

7

showSoftInput non funzionava affatto per me.

Ho pensato di dover impostare la modalità di input: (qui nel componente Activity nel manifest)

android:windowSoftInputMode="stateVisible" 

6

Credere o no che il mio problema con la tastiera virtuale sia stato risolto quando ho scoperto che le animazioni delle attività possono disabilitare la tastiera virtuale. Quando chiami l'intento con il

i.setFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION);

e

overridePendingTransition(0, 0);

Può nascondere la tastiera virtuale e non esiste un modo per mostrarla.


6

Ho avuto lo stesso problema in varie situazioni diverse e le soluzioni che ho trovato funzionano in alcuni ma non funzionano in altri, quindi ecco una soluzione combinata che funziona nella maggior parte delle situazioni che ho trovato:

public static void showVirtualKeyboard(Context context, final View view) {
    if (context != null) {
        final InputMethodManager imm =  (InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE);
        view.clearFocus();

        if(view.isShown()) {
            imm.showSoftInput(view, 0);
            view.requestFocus();
        } else {
            view.addOnAttachStateChangeListener(new View.OnAttachStateChangeListener() {
                @Override
                public void onViewAttachedToWindow(View v) {
                    view.post(new Runnable() {
                        @Override
                        public void run() {
                            view.requestFocus();
                            imm.showSoftInput(view, 0);
                        }
                    });

                    view.removeOnAttachStateChangeListener(this);
                }

                @Override
                public void onViewDetachedFromWindow(View v) {
                    view.removeOnAttachStateChangeListener(this);
                }
            });
        }
    }
}

6
editText.post(new Runnable() {
    @Override
    public void run() {
        InputMethodManager imm = (InputMethodManager) getActivity().getSystemService(Context.INPUT_METHOD_SERVICE);
        imm.showSoftInput(editText, InputMethodManager.SHOW_IMPLICIT);
    }
});

6

Ho combinato tutto qui e per me funziona:

public static void showKeyboardWithFocus(View v, Activity a) {
    try {
        v.requestFocus();
        InputMethodManager imm = (InputMethodManager) a.getSystemService(Context.INPUT_METHOD_SERVICE);
        imm.showSoftInput(v, InputMethodManager.SHOW_IMPLICIT);
        a.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE);
    } catch (Exception e) {
        e.printStackTrace();
    }
}

6

Ha funzionato per me. Puoi provare anche con questo per mostrare la tastiera:

getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE);

5

snippet di codice. . .

public void hideKeyboard(Context activityContext){

    InputMethodManager imm = (InputMethodManager)
            activityContext.getSystemService(Context.INPUT_METHOD_SERVICE);

    //android.R.id.content ( http://stackoverflow.com/a/12887919/2077479 )
    View rootView = ((Activity) activityContext)
            .findViewById(android.R.id.content).getRootView();

    imm.hideSoftInputFromWindow(rootView.getWindowToken(), 0);
}

public void showKeyboard(Context activityContext, final EditText editText){

    final InputMethodManager imm = (InputMethodManager)
            activityContext.getSystemService(Context.INPUT_METHOD_SERVICE);

    if (!editText.hasFocus()) {
        editText.requestFocus();
    }

    editText.post(new Runnable() {
        @Override
        public void run() {
            imm.showSoftInput(editText, InputMethodManager.SHOW_FORCED);
        }
    });
}

5

Kotlin estensione per mostrare la tastiera a fuoco.

Questa è una combinazione di risposte precedenti, che erano troppo lunghe o incomplete.

Questa estensione pubblica un file eseguibile nella coda messaggi che mostra la tastiera virtuale dopo aver richiesto lo stato attivo:

fun View.showSoftKeyboard() {
    post {
        if (this.requestFocus()) {
            val imm = context.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
            imm?.showSoftInput(this, InputMethodManager.SHOW_IMPLICIT)
        }
    }
}

Chiamalo da qualsiasi vista quando necessario in seguito:

editText.showSoftKeyboard()

4

basta aggiungere android: windowSoftInputMode = "stateHidden" nel file manifest ...


4
final InputMethodManager keyboard = (InputMethodManager) ctx.getSystemService(Context.INPUT_METHOD_SERVICE);
keyboard.toggleSoftInput(InputMethodManager.SHOW_FORCED,0);

4

All'interno del tuo manifest:

android:windowSoftInputMode="stateAlwaysVisible"- tastiera inizialmente lanciata. android:windowSoftInputMode="stateAlwaysHidden" - tastiera inizialmente nascosta.

Mi piace usare anche "adjustPan"perché all'avvio della tastiera lo schermo si regola automaticamente.

 <activity
      android:name="YourActivity"
      android:windowSoftInputMode="stateAlwaysHidden|adjustPan"/>

4

Aggiungi semplicemente questa riga nella vista Modifica testo:

android:isScrollContainer="true"

e TADA - la tastiera ha iniziato ad apparire automaticamente!

Ho avuto un problema simile e ho scoperto questa soluzione semplice e strana.

Come già accennato qui da user3392439, l'aspetto della tastiera su focus in qualche modo collegato in modo stranamente con la presenza del componente di scorrimento nel file XML.

Anche la presenza di un'altra vista EditText che comprende la linea sopra menzionata nello stesso XML fa apparire la tastiera indipendentemente da quale di EditTexts sia attualmente focalizzato.

Se hai almeno una vista visibile che comprende il componente di scorrimento nel tuo file XML, la tastiera apparirà automaticamente messa a fuoco.

Se non è presente lo scorrimento, è necessario fare clic su Modifica testo per visualizzare la tastiera.


Questo è molto strano ma sicuramente funziona - stavo tentando di farlo requesFocus()all'interno di un gestore di clic e questo è l'unico modo diverso da uno show esplicitoSoftInput SHOW_FORCED
disegnato il

Santo cielo, grazie amico. Non ho idea del perché funzioni, ma l'ho testato su 8 dispositivi di diversi produttori e ha funzionato ogni volta!
Antonio Vlasic,

3

Tutte le soluzioni fornite sopra ( interazione InputMethodManager in OnFocusChangeListener.onFocusChange listener collegato a EditText funziona perfettamente se si dispone di una modifica singola nell'attività.

Nel mio caso ho due modifiche.

 private EditText tvX, tvY;
 protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
 tvX.setOnFocusChangeListener(this);
    tvY.setOnFocusChangeListener(this);

@Override
public void onFocusChange(View v, boolean hasFocus) {       
    InputMethodManager imm =  (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
    if(tvX.hasFocus() || tvY.hasFocus()) {            
        imm.showSoftInput(v, 0);            
    } else {
        imm.hideSoftInputFromWindow(v.getWindowToken(), 0);         
    }       
};

Ho osservato che onFocusChange è attivato per tvX con hasFocus = true (tastiera mostrata) ma poi per tvY con hasFocus = true (tastiera nascosta). Alla fine, nessuna tastiera era visibile.

La soluzione generale dovrebbe avere un'istruzione corretta se "mostra tastiera se il testo EditText ha lo stato attivo"


3

Nella sezione onResume () dell'attività puoi chiamare il metodo bringKeyboard ();

 onResume() {
     EditText yourEditText= (EditText) findViewById(R.id.yourEditText);
     bringKeyboard(yourEditText);
 }


  protected boolean bringKeyboard(EditText view) {
    if (view == null) {
        return false;
    }
    try {
      // Depending if edittext has some pre-filled values you can decide whether to bring up soft keyboard or not
        String value = view.getText().toString();
        if (value == null) {
            InputMethodManager imm = (InputMethodManager)context.getSystemService(Context.INPUT_METHOD_SERVICE);
            imm.hideSoftInputFromWindow(view.getWindowToken(), 0);
            return true;
        }
    } catch (Exception e) {
        Log.e(TAG, "decideFocus. Exception", e);
    }
    return false;
  }

Qual è il WidgetUtils.showKeyboard? Questa è la parte più importante qui.
TWiStErRob,

2

Nessuna delle risposte ha funzionato per me. Ecco un modo semplice.

searchEditText.setVisibility(View.VISIBLE);
                final Handler handler=new Handler();
                handler.postDelayed(new Runnable() {
                    @Override
                    public void run() {
                        searchEditText.requestFocus();
                    }
                }, 400);

Ho appena ritardato il metodo requestFocus () per 400ms.


Molte grazie, ha bisogno di qualche ritardo per la visualizzazione della tastiera ...
hkh114,

1

Ho scoperto un comportamento strano, dal momento che in una delle mie app, la tastiera virtuale stava mostrando automaticamente quando si entrava nell'attività (c'è un editText.requestFocus () in onCreate).

Scavando ulteriormente, ho scoperto che questo era perché c'è un ScrollView attorno al layout. Se rimuovo ScrollView, il comportamento è come descritto nella dichiarazione del problema originale: solo facendo clic sul editText già focalizzato viene visualizzata la tastiera software.

Se non funziona per te, prova a inserire uno ScrollView - è comunque innocuo.


1

Ho avuto un problema simile usando le animazioni di visualizzazione . Quindi ho messo un ascoltatore di animazioni per assicurarmi di aspettare che finisse l'animazione prima di provare a richiedere un accesso da tastiera sul edittext mostrato.

    bottomUp.setAnimationListener(new Animation.AnimationListener() {
        @Override
        public void onAnimationStart(Animation animation) {
        }

        @Override
        public void onAnimationEnd(Animation animation) {
            if (textToFocus != null) {
                // Position cursor at the end of the text
                textToFocus.setSelection(textToFocus.getText().length());
                // Show keyboard
                InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
                imm.showSoftInput(textToFocus, InputMethodManager.SHOW_IMPLICIT);
            }
        }

        @Override
        public void onAnimationRepeat(Animation animation) {
        }
    });

1

Sono d'accordo con raukodraug per l'utilizzo in uno swithview è necessario richiedere / cancellare lo stato attivo in questo modo:

    final ViewSwitcher viewSwitcher = (ViewSwitcher) findViewById(R.id.viewSwitcher);
    final View btn = viewSwitcher.findViewById(R.id.address_btn);
    final View title = viewSwitcher.findViewById(R.id.address_value);

    title.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            viewSwitcher.showPrevious();
            btn.requestFocus();
            InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
            imm.showSoftInput(btn, InputMethodManager.SHOW_IMPLICIT);
        }
    });

    // EditText affiche le titre evenement click
    btn.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            btn.clearFocus();
            viewSwitcher.showNext();
            InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
            imm.hideSoftInputFromWindow(btn.getWindowToken(), 0);
            // Enregistre l'adresse.
            addAddress(view);
        }
    });

Saluti.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.