web-dev-qa-db-ja.com

Android showSoftInputでソフトキーボードを表示できない

次の機能をテストする簡単なアプリケーションを作成しました。私のアクティビティが起動したら、ソフトキーボードを開いた状態で起動する必要があります。

コードが機能しませんか?!

マニフェストのさまざまな「状態」設定とコードのさまざまなフラグをInputMethodManager(imm)に試しました。

AndroidManifest.xmlに設定を含め、唯一のアクティビティのonCreateで明示的に呼び出しました。

<?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>

...メインレイアウト(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>

...そしてコード...

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);
    }
}
27
mobibob

これは非常に微妙で、犯罪者です。これは[〜#〜] not [〜#〜]がハードなスライドアウトキーボードを備えている電話で機能します。ハードキーボードを備えた電話は、この通話では自動的に開きません。私のLGと古いNexus Oneにはキーボードがありません-したがって、アクティビティが起動するとソフトキーボードが開きます(それが私が望んでいるものです)が、MyTouchとHTC G2にはスライドキーボードでは、ハードキーボードを閉じた状態で編集フィールドにタッチするまで、ソフトキーボードは開きません。

17
mobibob

アクティビティが起動したとき次のように機能するため、キーボードは最初は表示されていますが、何かによって非表示になっているようです(ただし、実際にはダーティな回避策です)。

最初の方法

InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
editText.postDelayed(new Runnable()
{
    @Override
    public void run()
    {
        editText.requestFocus();
        imm.showSoftInput(editText, 0);
    }
}, 100);

2番目の方法

onCreateで、アクティビティの作成時に起動します

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);

番目の方法マニフェストのアクティビティタグに特定のコードを追加します。起動時にキーボードが表示され、最初のフォーカスが目的のビューに設定されます。

Android:windowSoftInputMode="stateVisible"
33
Xar E Ahmer

私のコードをテストしたときに見つけたので、あなたがまだ答えを探しているといいのですが。ここにコードがあります:

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

imm.toggleSoftInput(0, 0);

これが答えられた私の質問です: Android-オンデマンドでソフトキーボードを表示

19
dropsOfJupiter

これは、ハードキーボードを備えた電話で私と一緒に機能しました。

editText1.requestFocus();
InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
          imm.toggleSoftInput(InputMethodManager.SHOW_FORCED,0);
18
Maherenstein

この答えは多分遅くなりますが、私にとっては完全に機能します。多分それは誰かを助ける:)

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);
    }
}

必要に応じて、他のフラグを使用できます

InputMethodManager.SHOW_FORCED
WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
9
Anh-Tuan Mai

以下は私のために働きました:

    mEditTextStudy.requestFocus();
    mEditTextStudy.post(
            new Runnable() {
                @Override
                public void run() {
                    InputMethodManager imm =
                            (InputMethodManager)
                                    getActivity()
                                            .getSystemService(Context.INPUT_METHOD_SERVICE);
                    if (imm != null) {
                        imm.showSoftInput(mEditTextStudy, SHOW_FORCED);
                    }
                }
            });
3
Sagar

ソフトキーボードの表示は大きな問題です。私は多くのことを検索して、最終的な結論に至りました。いくつかの手がかりを与えたこの回答のおかげで: https://stackoverflow.com/a/16882749/5903344

問題:

通常、ビューを初期化するとすぐにshowSoftInputを呼び出します。アクティビティでは、これは主にonCreate、Fragments onCreateViewにあります。キーボードを表示するには、IMMでfocsedViewをアクティブにする必要があります。これは、IMMのisActive(view)メソッドを使用して確認できます。ビューの作成中にshowSoftInputを呼び出すと、ビューがIMMに対してアクティブにならない可能性があります。これが、50〜100ミリ秒遅れたshowSoftInputが役立つ場合がある理由です。ただし、100ミリ秒後にビューがアクティブになることは保証されていません。だから私の理解では、これもハックです。

ソリューション:

以下のクラスを使用しています。これは、キーボードが正常に表示されるまで100ミリ秒ごとに実行され続けます。各反復でさまざまなチェックを実行します。一部のチェックでは実行可能ファイルを停止できますが、100ミリ秒後にポストするものもあります。

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);
    }
}

これを使用するには、このクラスのインスタンスを作成するだけです。それに親アクティビティと、キーボード入力とフォーカスがあるtargetViewを渡します。次に、ハンドラーを使用してインスタンスを投稿します。

2
Siddharth Garg

Xamarin開発者向けのソリューション(_digit1 == EditText):

        var focussed = _digit1.RequestFocus();
        if (focussed)
        {
            Window.SetSoftInputMode(SoftInput.StateAlwaysVisible);
            var imm = (InputMethodManager)GetSystemService(InputMethodService);
            imm.ToggleSoftInput(ShowFlags.Forced, 0);
        }
1
Raymond Fraikin

私のコードにはトグルがありますが、postDelayedはありません。私はshowSoftInputに対してpostDelayedを試してみましたが成功しませんでしたので、提案された解決策を試しました。遅延時間を増やすことを決定するまで、もう1つの失敗した可能性のあるソリューションとしてそれを破棄しようとしていました。私にとっては200ミリ秒までは機能しますが、その時点では機能しません。少なくとも物理的な電話では機能しません。だからあなたが貧乏になる前にAndroid開発者がこの答えを捨てる前に、成功する解決策のために遅延を増やしてみてください。古い遅い電話には少し追加するのにお金がかかるかもしれません。ありがとう。

1
MooMooCodfish

これは私にとってはうまくいきます:

public void requestFocusAndShowSoftInput(View view){
    view.requestFocus();
    InputMethodManager inputMethodManager = (InputMethodManager) getSystemService(INPUT_METHOD_SERVICE);
    inputMethodManager.showSoftInput(view, InputMethodManager.SHOW_IMPLICIT);
}
0
Sagar Patel

ソフトキーボードをフラグメントで表示しようとしている場合は、アクティビティが作成されるまで待ってからshowSoftInput()を呼び出す必要があります。サンプルコード:

public class SampleFragment extends Fragment {

    private InputMethodManager mImm;
    private TextView mTextView;

    @Override
    public void onAttach(Context context) {
        super.onAttach(context);
        mImm = (InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE);
    }

    @Override
    public void onActivityCreated(@Nullable Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
        showSoftKeyboard(mTextView);
    }

    /**
     * Request the InputMethodManager show the soft keyboard.  Call this in {@link #onActivityCreated(Bundle)}.
     * @param view the View which would like to receive text input from the soft keyboard
     */
    public void showSoftKeyboard(View view) {
        if (view.requestFocus()) {
            mImm.showSoftInput(view, InputMethodManager.SHOW_IMPLICIT);
        }
    }

}
0
Jeff McKnight

これがSiddharth Gargの回答の修正版です。それは100%の時間で動作します。

import Android.content.Context;
import Android.os.Handler;
import Android.os.IBinder;
import Android.os.Looper;
import Android.util.Log;
import Android.view.View;
import Android.view.inputmethod.InputMethodManager;

public class SoftInputService implements Runnable {

    private static final String TAG = SoftInputService.class.getSimpleName();

    private static final int INTERVAL_MS = 100;

    private Context context;
    private View targetView;
    private Handler handler;

    public SoftInputService(Context context, View targetView) {
        this.context = context;
        this.targetView = targetView;
        handler = new Handler(Looper.getMainLooper());
    }

    @Override
    public void run() {
        if (context == null || targetView == null) {
            return;
        }

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

        if (!targetView.isFocusable() || !targetView.isFocusableInTouchMode()) {
            Log.d(TAG,"focusable = " + targetView.isFocusable() + ", focusableInTouchMode = " + targetView.isFocusableInTouchMode());
            return;

        } else if (!targetView.requestFocus()) {
            Log.d(TAG,"Cannot focus on view");
            post();

        } else if (!imm.showSoftInput(targetView, InputMethodManager.SHOW_IMPLICIT)) {
            Log.d(TAG,"Unable to show keyboard");
            post();
        }
    }

    public void show() {
        handler.post(this);
    }

    public static void hide(Context context, IBinder windowToekn) {
        InputMethodManager imm = (InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE);
        imm.hideSoftInputFromWindow(windowToekn, 0);
    }

    protected void post() {
        handler.postDelayed(this, INTERVAL_MS);
    }
}

使用法:

// To show the soft input
new SoftInputService(context, theEditText).show();
// To hide the soft input
SoftInputService.hide(context, theEditText.getWindowToken());
0
gopalanrc