Android showtkeyboard avec showSoftInput ne fonctionne pas?
j'ai créé une application standard pour tester les fonctionnalités suivantes. Lorsque mon activité commence, elle doit être lancée avec le softkeyboard open.
mon code ne fonctionne pas?!
j'ai essayé divers paramètres" d'état " dans le manifeste et différents drapeaux dans le code à L'InputMethodManager (imm).
j'ai inclus le réglage dans le AndroidManifest.xml et explicitement invoqué dans l'onCreate du seul activité.
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.mycompany.android.studyIme"
android:versionCode="1"
android:versionName="1.0">
<uses-sdk android:minSdkVersion="7" />
<application android:icon="@drawable/icon" android:label="@string/app_name">
<activity android:name=".StudyImeActivity"
android:label="@string/app_name"
android:windowSoftInputMode="stateAlwaysVisible">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
... la disposition principale (main.XML. )..
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/hello"
/>
<EditText
android:id="@+id/edit_sample_text"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:hint="@string/hello"
android:inputType="textShortMessage"
/>
</LinearLayout>
... et le code ...
public class StudyImeActivity extends Activity {
private EditText mEditTextStudy;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
mEditTextStudy = (EditText) findViewById(R.id.edit_study);
InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
imm.showSoftInput(mEditTextStudy, InputMethodManager.SHOW_FORCED);
}
}
9 réponses
lorsque l'activité se lance, il semble que le clavier soit initialement affiché mais caché par quelque chose d'autre, parce que les travaux suivants (mais est en fait un sale tour):
Première Méthode
InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
editText.postDelayed(new Runnable()
{
@Override
public void run()
{
editText.requestFocus();
imm.showSoftInput(editText, 0);
}
}, 100);
deuxième méthode
dans le onCreate de la lancer sur l'activité de créer des
new Handler().postDelayed(new Runnable() {
@Override
public void run()
{
// InputMethodManager inputMethodManager=(InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
// inputMethodManager.toggleSoftInputFromWindow(EnterYourViewHere.getApplicationWindowToken(), InputMethodManager.SHOW_FORCED, 0);
if (inputMethodManager != null)
{
inputMethodManager.toggleSoftInput(InputMethodManager.SHOW_FORCED,0);
}
}
}, 200);
Troisième Méthode AJOUTER donné code à étiquette d'activité dans le Manifeste. Il affichera le clavier au lancement, et définira le premier focus à votre vue de désir.
android:windowSoftInputMode="stateVisible"
Hey j'espère que vous êtes toujours à la recherche de la réponse comme je l'ai trouvé en testant mon code. voici le code:
InputMethodManager imm = (InputMethodManager)_context.getSystemService(Context.INPUT_METHOD_SERVICE);
imm.toggleSoftInput(0, 0);
voici ma question à laquelle on a répondu: android - show clavier souple à la demande
C'est si subtil, qu'il est criminel. Cela fonctionne sur les téléphones qui ne pas ont un clavier dur, glisser-sur. Les téléphones avec un clavier s'ouvre pas automatiquement avec cet appel. Mon LG et le Vieux Nexus One n'ont pas de clavier -- donc, le clavier doux s'ouvre quand l'activité commence( c'est ce que je veux), mais les téléphones MyTouch et HTC G2 qui ont des claviers slide-out n'ouvrent pas le clavier doux jusqu'à ce que je touche le champ edit avec le dur clavier fermé.
cela a fonctionné avec moi sur un téléphone avec clavier dur:
editText1.requestFocus();
InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
imm.toggleSoftInput(InputMethodManager.SHOW_FORCED,0);
cette réponse peut-être tardive mais elle fonctionne parfaitement pour moi. Peut-être que ça aide quelqu'un :)
public void showSoftKeyboard(View view) {
if (view.requestFocus()) {
InputMethodManager imm = (InputMethodManager)
getSystemService(Context.INPUT_METHOD_SERVICE);
boolean isShowing = imm.showSoftInput(view, InputMethodManager.SHOW_IMPLICIT);
if (!isShowing)
getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE);
}
}
dépend de vos besoins, vous pouvez utiliser d'autres drapeaux
InputMethodManager.SHOW_FORCED
WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
affichage du clavier souple est un gros problème. J'ai cherché beaucoup pour en arriver à une conclusion finale. Grâce à cette réponse qui a donné un certain nombre d'indices: https://stackoverflow.com/a/16882749/5903344
problème:
Normalement nous appelons showSoftInput dès que nous initialisons les vues. Dans les activités, il s'agit le plus souvent en oncréation, en Fragments ou en visionnage. Pour afficher le clavier, IMM doit: avoir la vue focsedView active. Ceci peut être vérifié en utilisant la méthode isActive(view) de IMM. Si nous appelons showSoftInput pendant que les vues sont créées, il y a de bonnes chances que la vue ne soit pas active pour IMM. C'est la raison pour laquelle parfois un showSoftInput différé de 50-100 ms est utile. Cependant, cela ne garantit pas encore qu'après 100 ms la vue deviendra active. Donc, dans ma compréhension, c'est encore un hack.
Solution:
j'utilise la classe suivante. Cela continue à fonctionner tous les 100 ms jusqu'à ce que le clavier ait été montré avec succès. Il effectue divers contrôles à chaque itération. Certaines vérifications peuvent arrêter le runnable, d'autres le postent après 100 ms.
public class KeyboardRunnable extends Runnable
{
// ----------------------- Constants ----------------------- //
private static final String TAG = "KEYBOARD_RUNNABLE";
// Runnable Interval
private static final int INTERVAL_MS = 100;
// ----------------------- Classes ---------------------------//
// ----------------------- Interfaces ----------------------- //
// ----------------------- Globals ----------------------- //
private Activity parentActivity = null;
private View targetView = null;
// ----------------------- Constructor ----------------------- //
public KeyboardRunnable(Activity parentActivity, View targetView)
{
this.parentActivity = parentActivity;
this.targetView = targetView;
}
// ----------------------- Overrides ----------------------- //
@Override
public void run()
{
// Validate Params
if ((parentActivity == null) || (targetView == null))
{
Dbg.error(TAG, "Invalid Params");
return;
}
// Get Input Method Manager
InputMethodManager imm = (InputMethodManager) parentActivity.getSystemService(Context.INPUT_METHOD_SERVICE);
// Check view is focusable
if (!(targetView.isFocusable() && targetView.isFocusableInTouchMode()))
{
Dbg.error(TAG, "Non focusable view");
return;
}
// Try focusing
else if (!targetView.requestFocus())
{
Dbg.error(TAG, "Cannot focus on view");
Post();
}
// Check if Imm is active with this view
else if (!imm.isActive(targetView))
{
Dbg.error(TAG, "IMM is not active");
Post();
}
// Show Keyboard
else if (!imm.showSoftInput(targetView, InputMethodManager.SHOW_IMPLICIT))
{
Dbg.error(TAG, "Unable to show keyboard");
Post();
}
}
// ----------------------- Public APIs ----------------------- //
public static void Hide(Activity parentActivity)
{
if (parentActivity != null)
{
InputMethodManager imm = (InputMethodManager) parentActivity.getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(parentActivity.findViewById(android.R.id.content).getWindowToken(), 0);
}
else
{
Dbg.error(TAG, "Invalid params to hide keyboard");
}
}
// ----------------------- Private APIs ----------------------- //
protected void Post()
{
// Post this aftr 100 ms
handler.postDelayed(this, INTERVAL_MS);
}
}
pour utiliser ceci, créez simplement une instance de cette classe. Transmettez-lui l'activité mère et targetView qui auraient ensuite une entrée clavier et une mise au point. Ensuite, postez l'instance en utilisant un Handler.
mon code contenait la bascule, mais pas postDelayed. J'avais essayé postDelayed pour les showSoftInput sans succès et j'ai depuis essayé votre solution suggérée. J'étais sur le point de le rejeter comme une autre solution potentielle ratée jusqu'à ce que je décide d'augmenter le délai. Il fonctionne pour moi jusqu'à 200 ms à quel point ça ne fonctionne pas, du moins pas sur les téléphones physiques. Donc, avant que vous pauvres Développeurs android jeter cette réponse, essayer d'augmenter le délai pour un succès solution. Il peut payer pour ajouter un peu pour les anciens ralentissement de téléphones. Grâce tas, a été de travailler sur celui-ci pendant des heures.
ça marche pour moi:
public void requestFocusAndShowSoftInput(View view){
view.requestFocus();
InputMethodManager inputMethodManager = (InputMethodManager) getSystemService(INPUT_METHOD_SERVICE);
inputMethodManager.showSoftInput(view, InputMethodManager.SHOW_IMPLICIT);
}
Solution pour les développeurs Xamarin (_digit1 == EditText):
var focussed = _digit1.RequestFocus();
if (focussed)
{
Window.SetSoftInputMode(SoftInput.StateAlwaysVisible);
var imm = (InputMethodManager)GetSystemService(InputMethodService);
imm.ToggleSoftInput(ShowFlags.Forced, 0);
}