web-dev-qa-db-fra.com

Ouvrir le clavier logiciel par programmation

J'ai une activité sans widgets enfant et le fichier XML correspondant est,

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:id="@+id/myLayout"
Android:orientation="vertical"
Android:layout_width="fill_parent"
Android:layout_height="fill_parent"
Android:focusable="true"
>
</LinearLayout>

et je veux ouvrir un clavier logiciel par programmation pendant que l'activité commence. Et ce que j'ai déjà essayé, c'est

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    InputMethodManager inputMethodManager = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
    if (inputMethodManager != null) {
        inputMethodManager.toggleSoftInput(InputMethodManager.SHOW_FORCED, 0);
    }

Donnez-moi des conseils.

108
Vignesh

J'ai utilisé les lignes suivantes pour afficher manuellement le clavier virtuel dans l'événement onclick, et le clavier est visible.

InputMethodManager inputMethodManager =
    (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
inputMethodManager.toggleSoftInputFromWindow(
    linearLayout.getApplicationWindowToken(),
    InputMethodManager.SHOW_FORCED, 0);

Mais je ne suis toujours pas en mesure d'ouvrir ceci pendant que l'activité est ouverte, y a-t-il une solution pour cela?

142
Vignesh

Dans votre fichier manifeste, essayez d’ajouter ce qui suit au <activity> que vous souhaitez afficher au clavier lorsque l'activité commence:

Android:windowSoftInputMode="stateVisible"

Cela devrait rendre le clavier visible au début de l'activité.

Pour plus d'options, consultez le documentation .

114
jemerick

Veuillez suivre le code ci-dessous. Je suis sûr que votre problème sera résolu.

if (imm != null){
        imm.toggleSoftInput(InputMethodManager.SHOW_FORCED,0);
   } 
34
AndroidDanger

C'est des travaux

<activity
    ...
    Android:windowSoftInputMode="stateVisible" >
</activity>

ou

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

Tout ce dont j'avais besoin était d'exposer le clavier, dans un moment très précis. Cela a fonctionné pour moi! Merci Benites.

    private Handler mHandler= new Handler();

Et au moment très précis:

    mHandler.post(
    new Runnable() {
        public void run() {
            InputMethodManager inputMethodManager =  (InputMethodManager)getSystemService(INPUT_METHOD_SERVICE);
            inputMethodManager.toggleSoftInputFromWindow(yourEditText.getApplicationWindowToken(), InputMethodManager.SHOW_FORCED, 0);
            yourEditText.requestFocus();
        }
    }); 
16
DiegoSoto

J'ai utilisé les lignes suivantes pour afficher le clavier virtuel manuellement dans l'événement onclick.

public void showKeyboard(final EmojiconEditText ettext){
          ettext.requestFocus();
          ettext.postDelayed(new Runnable(){
            @Override public void run(){
              InputMethodManager keyboard=(InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
              keyboard.showSoftInput(ettext,0);
            }
          }
        ,200);
        }
12
Ram

Mettez cela dans la méthode onResume:

findViewById(R.id.root_view_of_your_activity_layout).post(
new Runnable() {
    public void run() {
        InputMethodManager inputMethodManager =  (InputMethodManager)getSystemService(INPUT_METHOD_SERVICE);
        inputMethodManager.toggleSoftInputFromWindow(yourEditText.getApplicationWindowToken(),     InputMethodManager.SHOW_FORCED, 0);
        yourEditText.requestFocus();
    }
});

le fichier exécutable est nécessaire car lorsque le système d'exploitation déclenche la méthode onResume, vous ne pouvez pas être sûr que toutes les vues sont dessinées. Par conséquent, la méthode post appelée à partir de votre présentation racine fait patienter jusqu'à ce que chaque vue soit prête.

9
Marcelo Benites

dans onCreate méthode d'activité ou onActivityCreated d'un fragment

....
view.getViewTreeObserver().addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() {
        @Override
        public boolean onPreDraw() {
            view.removeOnPreDrawListener(this);
            InputMethodManager imm = (InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE);
            imm.toggleSoftInput(InputMethodManager.SHOW_FORCED, 0);

            // !Pay attention to return `true`
            // Chet Haase told to 
            return true;
        }
    });
8
Alex

semble que cela fonctionne

 protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_patientid);

        editText = (EditText)findViewById(R.id.selectPatient);
        //editText.requestFocus(); //works without that

    }

@Override
    protected void onResume() {

        findViewById(R.id.selectPatient).postDelayed(
        new Runnable() {
            public void run() {
                 editText.requestFocus();
                InputMethodManager inputMethodManager =  (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
                inputMethodManager.showSoftInput(editText,InputMethodManager.SHOW_IMPLICIT);
            }
        },100);
        super.onResume();
    }

semble que cela fonctionne mieux: dans manifest:

<application>
    <activity
        Android:name="com.doodkin.myapp.ReportActivity"
        Android:label="@string/title_activity_report"
        Android:screenOrientation="sensor" 
        Android:windowSoftInputMode="stateHidden" > // add this or stateVisible
    </activity>
</application>

semble que le manifeste fonctionne dans Android 4.2.2 mais ne fonctionne pas dans Android 4.0.3

7
Shimon Doodkin

J'ai utilisé comme ceci pour montrer le clavier logiciel par programme et cela a fonctionné pour moi pour empêcher le redimensionnement automatique de l'écran lors du lancement du clavier.

Dans manifeste:

<activity Android:name="XXXActivity" Android:windowSoftInputMode="adjustPan">
</activity>

Dans XXXActvity:

EditText et =  (EditText))findViewById(R.id.edit_text);  
  Timer timer = new Timer();
            TimerTask task = new TimerTask() {

                @Override
                public void run() {
                    InputMethodManager inputMethodManager=(InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
                    inputMethodManager.toggleSoftInputFromWindow(et.getApplicationWindowToken(), InputMethodManager.SHOW_FORCED, 0);

                }
            };
            timer.schedule(task, 200);

Je suppose que cela fera gagner du temps aux autres pour rechercher ce problème.

6
Noundla Sandeep
InputMethodManager inputMethodManager=(InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
            inputMethodManager.toggleSoftInput(InputMethodManager.SHOW_FORCED,0);
3
Kai Wang

Je l'ai utilisé comme singleton comme:

public static void showSoftKeyboard(final Context context, final EditText editText) {
        try {
            editText.requestFocus();
            editText.postDelayed(
                    new Runnable() {
                        @Override
                        public void run() {
                            InputMethodManager keyboard = (InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE);
                            keyboard.showSoftInput(editText, 0);
                        }
                    }
                    , 200);
        } catch (NullPointerException npe) {
            npe.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

Utilisez-le dans votre activité comme:

showSoftKeyboard(this, yourEditTextToFocus);
2
Shylendra Madda

Kotlin

fun hideKeyboard(activity: Activity) {
    val view = activity.currentFocus
    val methodManager = activity.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
    assert(view != null)
    methodManager.hideSoftInputFromWindow(view!!.windowToken, InputMethodManager.HIDE_NOT_ALWAYS)
}

private fun showKeyboard(activity: Activity) {
    val view = activity.currentFocus
    val methodManager = activity.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
    assert(view != null)
    methodManager.showSoftInput(view, InputMethodManager.SHOW_IMPLICIT)
}

Java

public static void hideKeyboard(Activity activity) {
    View view = activity.getCurrentFocus();
    InputMethodManager methodManager = (InputMethodManager) activity.getSystemService(Context.INPUT_METHOD_SERVICE);
    assert methodManager != null && view != null;
    methodManager.hideSoftInputFromWindow(view.getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);
}

private static void showKeyboard(Activity activity) {
    View view = activity.getCurrentFocus();
    InputMethodManager methodManager = (InputMethodManager) activity.getSystemService(Context.INPUT_METHOD_SERVICE);
    assert methodManager != null && view != null;
    methodManager.showSoftInput(view, InputMethodManager.SHOW_IMPLICIT);
}
2
Khemraj

C'est le code source requis:

public static void openKeypad(final Context context, final View v) 
 {
new Handler().postDelayed(new Runnable() 
{
    @Override
    public void run() 
    {
        InputMethodManager inputManager =   (InputMethodManager)context.getSystemService(Context.INPUT_METHOD_SERVICE); 
        inputManager.showSoftInput(v, InputMethodManager.SHOW_IMPLICIT);    
        Log.e("openKeypad", "Inside Handler");
    }
},300);}

Pour plus de détails, veuillez suivre ce lien. Cela m'a aidé. https://github.com/Nikhillosalka/Keyboard/blob/master/README.md

1
Nikhil Losalka
getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);

Utilisez le code ci-dessus dans onResume () pour ouvrir le clavier virtuel

1
Sanket Parchande

Semblable à la réponse de @ShimonDoodkin c'est ce que j'ai fait dans un fragment.

https://stackoverflow.com/a/29229865/24133

    passwordInput.postDelayed(new ShowKeyboard(), 300); //250 sometimes doesn't run if returning from LockScreen

ShowKeyboard est

private class ShowKeyboard implements Runnable {
    @Override
    public void run() {
        passwordInput.setFocusableInTouchMode(true);
        passwordInput.requestFocus();            
        getActivity().getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
        ((InputMethodManager) getActivity().getSystemService(Context.INPUT_METHOD_SERVICE)).showSoftInput(passwordInput, 0);
    }
}

Après une saisie réussie, je m'assure également de cacher le clavier

getActivity().getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN);
((InputMethodManager) getActivity().getSystemService(Context.INPUT_METHOD_SERVICE))
                    .hideSoftInputFromWindow(getView().getWindowToken(), 0);
1
EpicPandaForce

InputMethodManager.SHOW_FORCED n'est pas un bon choix. Si vous utilisez ce paramètre, vous devez gérer le masquage de l’état du clavier. Ma suggestion est comme ça;

    public void showSoftKeyboard(View view) {
    InputMethodManager inputMethodManager = (InputMethodManager) getActivity().getSystemService(Activity.INPUT_METHOD_SERVICE);
    view.requestFocus();
    inputMethodManager.toggleSoftInput(InputMethodManager.SHOW_IMPLICIT, 0);
}

En outre, vous pouvez vous concentrer sur la vue (généralement EditText) en prenant les paramètres. Cela en fait une fonction plus utile

pour plus d'informations sur InputMethodManager.SHOW_IMPLICIT et SHOW_FORCED; InputMethodManager

1
Cafer Mert Ceyhan

Cela marche:

private static void showKeyboard(Activity activity) {
    View view = activity.getCurrentFocus();
    InputMethodManager imm = (InputMethodManager) activity.getSystemService(Context.INPUT_METHOD_SERVICE);
    imm.toggleSoftInput(InputMethodManager.SHOW_FORCED, 0);
}

Et vous appelez cette méthode comme ceci:

showKeyboard(NameOfActivity.this);
1
Thiago Silva

Publiez cette méthode dans votre activité de base et utilisez-la comme un charme

public void openKeyboard() {
    InputMethodManager imm =
            (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
    if (imm != null) {
        imm.toggleSoftInput(InputMethodManager.SHOW_FORCED, 0);
    }
}
0
Ajay Chauhan
public final class AAUtilKeyboard {

public static void openKeyboard(final Activity activity, final EditText editText) {
    final InputMethodManager imm = (InputMethodManager) activity.getSystemService(Context.INPUT_METHOD_SERVICE);
    if (imm != null) {
        imm.showSoftInput(editText, InputMethodManager.SHOW_IMPLICIT);
    }
}

public static void hideKeyboard(final Activity activity) {
    final View view = activity.getCurrentFocus();
    if (view != null) {
        final InputMethodManager imm = (InputMethodManager) activity.getSystemService(Context.INPUT_METHOD_SERVICE);
        if (imm != null) {
            imm.hideSoftInputFromWindow(view.getWindowToken(), 0);
        }
    }
}
0
Arsen

Il y a déjà trop de réponses mais rien ne fonctionnait pour moi en dehors de cela

inputMethodManager.showSoftInput(emailET,InputMethodManager.SHOW_FORCED);

J'ai utilisé showSoftInput avec SHOW_FORCED

Et mon activité a

 Android:windowSoftInputMode="stateVisible|adjustResize"

espérons que cela aide quelqu'un

0
spaceMonkey