Android:EditTextにフォーカスがあるときにソフトキーボードを自動的に表示する


340

を使用して入力ボックスを表示していAlertDialogます。EditTextダイアログ自体の内部に私が呼び出すと自動的にフォーカスされますAlertDialog.show()、が、ソフトキーボードは自動的には表示されません。

ダイアログが表示されたときにソフトキーボードを自動的に表示させるにはどうすればよいですか?(そして物理的/ハードウェアキーボードはありません)。[検索]ボタンを押してグローバル検索を呼び出す方法と同様に、ソフトキーボードが自動的に表示されます。


1
以下のテッドのコメントに従って、これは自動的に行われるはずです。最初に確認してください!
Cheezmeister 2012

この答えは、最も簡単で、正常に動作します:stackoverflow.com/a/8018630/89818
CAW


1
私は何年にもわたってこの答えに何度か戻ってきました。私がこの問題を抱えているのは常にダイアログ内です。フラグメントやアクティビティはありません。
tir38、2016年

回答:


304

あなたは上のフォーカスリスナーを作成することができるEditTextAlertDialog、その取得AlertDialogのをWindow。そこから、を呼び出してソフトキーボードを表示できますsetSoftInputMode

final AlertDialog dialog = ...;

editText.setOnFocusChangeListener(new View.OnFocusChangeListener() {
    @Override
    public void onFocusChange(View v, boolean hasFocus) {
        if (hasFocus) {
            dialog.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
        }
    }
});

5
AlertDialog.Builderを使用してどうすればよいですか?...最終的なAlertDialog.Builder alert = new AlertDialog.Builder(Main.this);
Stephen

6
あなたは使ってビルダーからダイアログを取得することができます@Stephen final AlertDialog dialog = builder.create()、その後、show代わりにビルダーのダイアログに。
tidbeck、2011年

30
上記のコメントを取り消します。フォーカスを正しく設定できない場合は、XMLを確認してください。そこにタグ<requestFocus> </ requestFocus>が表示されている場合は、削除してください。タグがEditTextにフォーカスを与えるようですが、EditTextにはすでにフォーカスがあるため、リスナーは呼び出されません。
テッド

11
デバイスにハードウェアキーボードがある場合、これをどのように行わないのですか?これらのユーザーにとって、これは迷惑なようです。
mxcl 2012年

8
これがSDKのデフォルトの動作ではない理由が本当にわかりません。テキスト入力が必要なビューでカーソルが点滅している場合、テキストを入力するためにキーボードを表示したくないのはなぜですか。それは私にとってUXのあまりに間違っていると感じています
クリスチャン・ガルシア

240

キーボードの使用を示すには:

InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
imm.toggleSoftInput(InputMethodManager.SHOW_FORCED,0);

キーボードの使用を非表示にする場合:

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

3
これは、レイアウトのビューの可視性をVISIBLEとGONEの間で切り替えることに基づいてソフトキーボードを表示/非表示にする場合に特に効果的です。
PacificSky

38
SHOW_IMPLICITフラグを使用することをお勧めします。これは、アクティビティまたはアプリケーションを変更すると、キーボードが期待どおりに自動的に非表示になるためです。
drspaceboo 2013

6
@drspaceboo SHOW_IMPLICITを使用してもまったく機能しません。SHOW_FORCEDを使用する必要があります。理由はわかりません...
Yoann Hercouet

1
上記のコードはいつ実行する必要がありますか?レイアウトを親に追加した直後にそれを試みました。それはうまくいきませんでした。しかし、レイアウトがしばらく続いた後でそれを実行した場合、それは機能しました。それで、「今すぐキーボードを表示しようとすると、実際に機能する」というコールバックはありますか?
William Jockusch

1
toggleSoftInput(InputMethodManager.SHOW_FORCED、0)は、ソフトキーボードを切り替えます。キーボードが表示されることを確認する場合は、代わりにimm.showSoftInput(view、InputMethodManager.SHOW_IMPLICIT)を使用できます。ここで、viewは入力を取得するビューです。
PJ_Finnegan

111

ダイアログの作成直後にソフトキーボードをリクエストできます(SDK-r20でテスト)

// create dialog
final AlertDialog dialog = ...; 

// request keyboard   
dialog.getWindow().setSoftInputMode (WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);

不思議に思う人のために、このメソッドはハードウェアキーボードが接続されているときにソフトキーボードを開きません。USB On-The-Goケーブルでテストしました。パーフェクト!
13rac1 2016年

これは私には何もしません。
JohnyTex 2016年

ハードウェアキーボードがありません。たぶん設定(?)
JohnyTex 2016年

25

同じ問題があり、次のコードで解決しました。ハードウェアキーボードを備えた電話でどのように動作するのかわかりません。

// TextEdit
final EditText textEdit = new EditText(this);

// Builder
AlertDialog.Builder alert = new AlertDialog.Builder(this);
alert.setTitle("Enter text");
alert.setView(textEdit);

alert.setPositiveButton("Ok", new DialogInterface.OnClickListener() {
    @Override
    public void onClick(DialogInterface dialog, int which) {
        String text = textEdit.getText().toString();
        finish();
    }
});

alert.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
    @Override
    public void onClick(DialogInterface dialog, int which) {
        finish();
    }
});

// Dialog
AlertDialog dialog = alert.create();
dialog.setOnShowListener(new OnShowListener() {

    @Override
    public void onShow(DialogInterface dialog) {
        InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
        imm.showSoftInput(textEdit, InputMethodManager.SHOW_IMPLICIT);
    }
});

dialog.show();

それは中だダイアログクラスの APIレベル8
tidbeck


@XylianそれはまだドキュメントにありますDialog.setOnShowListener()
tidbeck 2012年


18
<activity
    ...
    android:windowSoftInputMode="stateVisible" >
</activity>

または

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

たくさんの人に感謝します、これは素晴らしかったです、実際私は私の問題を解決するために両方を使用しました、私がユーザーが追加モードの場合、アクティビティの開始時にキーボードを表示する必要があり、更新モードではキーボードは必要ありませんでしたデフォルトでは。だから私が設定したアクティビティのマニフェストで、stateHiddenユーザーが新しいアイテムを作成していることを検出すると、あなたが言及したコード行を使用してキーボードを表示しました。:)もう一度感謝します。
PHPアベンジャー

「getWindow()を解決できません」というメッセージが表示されます。これを入れてみました。その前に他のもの。画面の特定の部分をクリックするだけで、edittextを使用せずにキーボードを取得したい。
-Androidcoder、

1
@Androidcoder、これはアクティビティの一部なので、のようなものを追加します((Activity) context).getWindow()....
CoolMind 2018年

15

他の回答のコードのスニペットは機能しますが、特にを使用してAlertDialog.Builderおり、公式ダイアログチュートリアルに従っている場合は、それを使用しないため、コード内のどこに配置するかが常に明確であるとは限りませんfinal AlertDialog ...またはをalertDialog.show()

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

より好ましい

InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
imm.toggleSoftInput(InputMethodManager.SHOW_FORCED,0);

フォーカスがEditTextから離れると、SOFT_INPUT_STATE_ALWAYS_VISIBLEはキーボードを非表示にするため、ユーザーがホーム画面に戻ったり、最近のアプリを表示したりしても、SHOW_FORCEDはキーボードが明示的に非表示になるまでキーボードを表示し続けます。

以下は、XMLで定義されたEditTextでカスタムレイアウトを使用して作成されたAlertDialogの作業コードです。また、キーボードに「移動」キーを設定し、正のボタンをトリガーできるようにします。

alert_dialog.xml:

<RelativeLayout
android:id="@+id/dialogRelativeLayout"
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content" >

    <!-- android:imeOptions="actionGo" sets the keyboard to have a "go" key instead of a "new line" key. -->
    <!-- android:inputType="textUri" disables spell check in the EditText and changes the "go" key from a check mark to an arrow. -->
    <EditText
        android:id="@+id/editText"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="16dp"
        android:layout_marginLeft="4dp"
        android:layout_marginRight="4dp"
        android:layout_marginBottom="16dp"
        android:imeOptions="actionGo"
        android:inputType="textUri"/>

</RelativeLayout>

AlertDialog.java:

import android.app.Activity;
import android.app.Dialog;
import android.content.DialogInterface;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.v4.app.DialogFragment;
import android.support.v7.app.AlertDialog;
import android.support.v7.app.AppCompatDialogFragment;
import android.view.KeyEvent;
import android.view.LayoutInflater;
import android.view.View;
import android.view.WindowManager;
import android.widget.EditText;

public class CreateDialog extends AppCompatDialogFragment {
    // The public interface is used to send information back to the activity that called CreateDialog.
    public interface CreateDialogListener {
        void onCreateDialogCancel(DialogFragment dialog);    
        void onCreateDialogOK(DialogFragment dialog);
    }

    CreateDialogListener mListener;

    // Check to make sure that the activity that called CreateDialog implements both listeners.
    public void onAttach(Activity activity) {
        super.onAttach(activity);
        try {
            mListener = (CreateDialogListener) activity;
        } catch (ClassCastException e) {
            throw new ClassCastException(activity.toString() + " must implement CreateDialogListener.");
        }
    }

    // onCreateDialog requires @NonNull.
    @Override
    @NonNull
    public Dialog onCreateDialog(Bundle savedInstanceState) {
        AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(getActivity());
        LayoutInflater customDialogInflater = getActivity().getLayoutInflater();

        // Setup dialogBuilder.
        alertDialogBuilder.setTitle(R.string.title);
        alertDialogBuilder.setView(customDialogInflater.inflate(R.layout.alert_dialog, null));
        alertDialogBuilder.setNegativeButton(R.string.cancel, new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                mListener.onCreateDialogCancel(CreateDialog.this);
            }
        });
        alertDialogBuilder.setPositiveButton(R.string.ok, new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                mListener.onCreateDialogOK(CreateDialog.this);
            }
        });

        // Assign the resulting built dialog to an AlertDialog.
        final AlertDialog alertDialog = alertDialogBuilder.create();

        // Show the keyboard when the dialog is displayed on the screen.
        alertDialog.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);

        // We need to show alertDialog before we can setOnKeyListener below.
        alertDialog.show();

        EditText editText = (EditText) alertDialog.findViewById(R.id.editText);

        // Allow the "enter" key on the keyboard to execute "OK".
        editText.setOnKeyListener(new View.OnKeyListener() {
            public boolean onKey(View v, int keyCode, KeyEvent event) {
                // If the event is a key-down event on the "enter" button, select the PositiveButton "OK".
                if ((event.getAction() == KeyEvent.ACTION_DOWN) && (keyCode == KeyEvent.KEYCODE_ENTER)) {
                    // Trigger the create listener.
                    mListener.onCreateDialogOK(CreateDialog.this);

                    // Manually dismiss alertDialog.
                    alertDialog.dismiss();

                    // Consume the event.
                    return true;
                } else {
                    // If any other key was pressed, do not consume the event.
                    return false;
                }
            }
        });

        // onCreateDialog requires the return of an AlertDialog.
        return alertDialog;
    }
}

11

まあ、これはかなり古い投稿ですが、まだ何か追加することがあります。
これらは、キーボードを制御し続けるのに役立つ2つの簡単な方法で、完璧に機能します。

キーボードを表示

public void showKeyboard() {
    InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
    View v = getCurrentFocus();
    if (v != null)
        imm.showSoftInput(v, 0);
}

キーボードを非表示

public void hideKeyboard() {
    InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
    View v = getCurrentFocus();
    if (v != null)
        imm.hideSoftInputFromWindow(v.getWindowToken(), 0);
}

なにgetCurrentFocus()
CoolMind 2018年

なるほど、それはのメソッドですActivity
CoolMind 2018年

10

これを機能させるのは難しいので、yukuの解決策にいくつかの追加情報を示します。AlertDialog.BuilderからAlertDialogオブジェクトを取得するにはどうすればよいですか?まあ、それは私のalert.show()実行の結果です:

final AlertDialog.Builder alert = new AlertDialog.Builder(getActivity());
final EditText input = new EditText(getActivity());
alert.setView(input);

// do what you need, like setting positive and negative buttons...

final AlertDialog dialog = alert.show();

input.setOnFocusChangeListener(new OnFocusChangeListener() {
   @Override
   public void onFocusChange(View v, boolean hasFocus) {
      if(hasFocus) {
         dialog.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
      }
   }
});

これは受け入れられる答えになるはずです。
クリスティアーノコエーリョ

7

IMEの手動での非表示と表示を処理するこのディスカッションを見てください。しかし、私の気持ちは、集束があればということであるEditTextIMEを持っていないあなたが呼び出しているので、それがあるまでAlertDialog.show()、あなたにOnCreate()画面が実際に提示される前に誘発されたか、他のいくつかの方法。OnPostResume()その場合、移動すると修正されるはずです。


6

はい、あなたはsetOnFocusChangeListenerそれを行うことができますあなたを助けます。

editText.setOnFocusChangeListener(new View.OnFocusChangeListener() {
    @Override
    public void onFocusChange(View v, boolean hasFocus) {
        if (hasFocus) {
            dialog.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
        }
    }
});

4

私はこの質問が古いことを知っています。拡張機能を使用すると、編集テキストのキーボードを表示するのによりきれいな方法だと思います。

これがedittextのキーボードを表示するために使用する方法です。

kotlinコード: 呼び出すだけedittext.showKeyboard()

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

Javaコード:

public static void showKeyboard(EditText editText) {
    editText.post(new Runnable() {
      @Override
      public void run() {
        editText.requestFocus();
        InputMethodManager imm = (InputMethodManager) editText.getContext()
            .getSystemService(Context.INPUT_METHOD_SERVICE);
        imm.showSoftInput(editText, InputMethodManager.SHOW_IMPLICIT);
      }
    });
  }

3

誰かが得ている場合:

タイプActivityから非静的メソッドgetSystemService(String)への静的参照を作成できません

getSystemService呼び出しにコンテキストを追加してみてください。

そう

InputMethodManager imm = 
(InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE);
imm.toggleSoftInput(InputMethodManager.SHOW_FORCED,0);

1

元の質問はダイアログに関するもので、私のEditTextは通常のビューにあります。とにかく、私はこれがあなたのほとんどにとってもうまくいくはずだと思います。だからここに私のために働くものがあります(上記の最高評価の方法は私のために何もしませんでした)。これを行うカスタムEditViewを次に示します(サブクラス化は必要ありませんが、ビューが表示されたときにフォーカスも取得したいので、目的に合わせて便利でした)。

これは実際には、tidbecksの回答とほぼ同じです。投票数がゼロだったので、私は実際には彼の答えにまったく気づきませんでした。それから私は彼の投稿にコメントしようとしていましたが、それは長すぎるので、とにかくこの投稿を終了しました。tidbeck氏は、キーボードを備えたデバイスでどのように機能するのかわからないと指摘している。どちらの場合も動作はまったく同じであるように見えます。これは、ポートレートモードではソフトウェアキーボードがポップアップし、ランドスケープモードではポップアップしないようなものです。物理的なキーボードがスライドしているかどうかは、私の電話では違いはありません。

というのも、私は個人的に、この動作を使用することを選択した場合、少し厄介だと感じましたInputMethodManager.SHOW_FORCED。これは期待通りに機能します。キーボードは向きに関係なく表示されますが、少なくとも私のデバイスでは、ハードウェアキーボードをスライドさせてもポップアップしません。

import android.app.Service;
import android.content.Context;
import android.util.AttributeSet;
import android.view.View;
import android.view.inputmethod.InputMethodManager;
import android.widget.EditText;

public class BringOutTheSoftInputOnFocusEditTextView extends EditText {

    protected InputMethodManager inputMethodManager;

    public BringOutTheSoftInputOnFocusEditTextView(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        init();
    }

    public BringOutTheSoftInputOnFocusEditTextView(Context context, AttributeSet attrs) {
        super(context, attrs);
        init();
    }

    public BringOutTheSoftInputOnFocusEditTextView(Context context) {
        super(context);
        init();
    }

    private void init() {
        this.inputMethodManager = (InputMethodManager)getContext().getSystemService(Service.INPUT_METHOD_SERVICE);
        this.setOnFocusChangeListener(new View.OnFocusChangeListener() {
            @Override
            public void onFocusChange(View v, boolean hasFocus) {
                if (hasFocus) {
                    BringOutTheSoftInputOnFocusEditTextView.this.inputMethodManager.showSoftInput(BringOutTheSoftInputOnFocusEditTextView.this, InputMethodManager.SHOW_FORCED);
                }
            }
        });
    }

    @Override
    protected void onVisibilityChanged(View changedView, int visibility) {
        super.onVisibilityChanged(changedView, visibility);
        if (visibility == View.VISIBLE) {
            BringOutTheSoftInputOnFocusEditTextView.this.requestFocus();
        }
    }

}

1

問題は、テキストを入力する場所が最初は非表示になっている(またはネストされているなど)ため、AlertDialogが自動的にフラグを設定するWindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IMWindowManager.LayoutParams.FLAG_NOT_FOCUSABLE、ソフト入力がトリガーされて表示されないことです。

これを修正する方法は、以下を追加することです:

(...)
// Create the dialog and show it
Dialog dialog = builder.create()
dialog.show();

// After show (this is important specially if you have a list, a pager or other view that uses a adapter), clear the flags and set the soft input mode
dialog.getWindow().clearFlags(WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE|WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM);
dialog.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);

1

試して使用してください:

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

1

キーボードを表示するために、私は次のことを行わなければなりませんでした

Android TextField:プログラムでフォーカス+ソフト入力を設定する

基本的に解決策は次のとおりです

@Override
public void onResume() {
    super.onResume();
    //passwordInput.requestFocus(); <-- that doesn't work
    passwordInput.postDelayed(new ShowKeyboard(), 325); //250 sometimes doesn't run if returning from LockScreen
}

どこShowKeyboard

private class ShowKeyboard implements Runnable {
    @Override
    public void run() {
        passwordInput.setFocusableInTouchMode(true);
        //passwordInput.requestFocusFromTouch(); //this gives touch event to launcher in background -_-
        passwordInput.requestFocus();
        getActivity().getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
        ((InputMethodManager) getActivity().getSystemService(Context.INPUT_METHOD_SERVICE)).showSoftInput(passwordInput, 0);
    }
}

入力が成功したら、キーボードも非表示にします

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

1

これらのメソッドをUtilクラスに配置して、どこでも使用できます。

コトリン

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

ジャワ

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

1

誰かが興味を持っている場合に備えて、素晴らしいkotlin-esqe拡張関数を作成しました

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

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

0

これはあなたにとって良いサンプルです:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <ScrollView
        android:id="@+id/scrollID"
        android:layout_width="fill_parent"
        android:layout_height="0dip"
        android:layout_weight="1" >

        <LinearLayout
            android:id="@+id/test"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="vertical" >
        </LinearLayout>
    </ScrollView>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:baselineAligned="true"
        android:orientation="horizontal"
        android:paddingBottom="5dp"
        android:paddingLeft="5dp"
        android:paddingRight="5dp"
        android:weightSum="1" >

        <EditText
            android:id="@+id/txtInpuConversation"
            android:layout_width="0dip"
            android:layout_height="wrap_content"
            android:layout_weight="0.5"
            android:hint="@string/edt_Conversation" >

            <requestFocus />
        </EditText>

        <Button
            android:id="@+id/btnSend"
            android:layout_width="0dip"
            android:layout_height="wrap_content"
            android:layout_weight="0.5"
            android:text="@string/btn_Conversation" />
    </LinearLayout>

</LinearLayout>

0

この回答の理由-上記の解決策はキーボードを表示しますが、それ以外の場所をクリックしても消えないためですEditText。だからあなたはキーボードを消すために何かをする必要がありますEditTextフォーカスを失っます。

これは、次の手順を実行することで実現できます。

  1. 次の属性を追加して、親ビュー(アクティビティのコンテンツビュー)をクリックしてフォーカス可能にします。

        android:clickable="true" 
        android:focusableInTouchMode="true" 
  2. hideKeyboard()メソッドを実装する

        public void hideKeyboard(View view) {
            InputMethodManager inputMethodManager =(InputMethodManager)getSystemService(Activity.INPUT_METHOD_SERVICE);
            inputMethodManager.hideSoftInputFromWindow(view.getWindowToken(),InputMethodManager.HIDE_IMPLICIT_ONLY );
        }
  3. 最後に、edittextのonFocusChangeListenerを設定します。

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

0

これは少しトリッキーです。私はこのようにして、うまくいきました。

1.最初に呼び出して、ウィンドウからソフト入力を非表示にします。これにより、ソフトキーボードが表示されている場合はソフト入力が非表示になり、表示されていない場合は何も行われません。

2.ダイアログを表示する

3.次に、呼び出してソフト入力を切り替えます。

コード:

InputMethodManager inputManager = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE); 
//hiding soft input
inputManager.hideSoftInputFromWindow(findViewById(android.R.id.content).getWind‌​owToken(), 0);
//show dialog
yourDialog.show();
//toggle soft input
inputManager.toggleSoftInput(InputMethodManager.SHOW_FORCED,InputMethodManager.SHOW_IMPLICIT);

0

これを試して

SomeUtils.java

public static void showKeyboard(Activity activity, boolean show) {
    InputMethodManager inputMethodManager = (InputMethodManager) activity.getSystemService(Context.INPUT_METHOD_SERVICE);

    if(show)
        inputMethodManager.toggleSoftInput(InputMethodManager.SHOW_FORCED,0);
    else
        inputMethodManager.toggleSoftInput(InputMethodManager.HIDE_IMPLICIT_ONLY,0);
}

0

多くを試しましたが、これは私のために働いたものです(kotlin):

        val dialog = builder.create()
        dialog.setOnShowListener {
            nameEditText.requestFocus()
            val s = ContextCompat.getSystemService(requireContext(), InputMethodManager::class.java)
            s?.toggleSoftInput(InputMethodManager.SHOW_FORCED, 0)
        }

        dialog.setOnDismissListener {
            val s = ContextCompat.getSystemService(requireContext(), InputMethodManager::class.java)
            s?.toggleSoftInput(InputMethodManager.HIDE_IMPLICIT_ONLY, 0)
        }

        dialog.show()

0

https://stackoverflow.com/a/39144104/2914140を見て、私は少し簡略化しました:

// In onCreateView():
view.edit_text.run {
    requestFocus()
    post { showKeyboard(this) }
}

fun showKeyboard(view: View) {
    val imm = view.context.getSystemService(
        Context.INPUT_METHOD_SERVICE) as InputMethodManager?
    imm?.showSoftInput(view, InputMethodManager.SHOW_IMPLICIT)
}

それは https://stackoverflow.com/a/11155404/2914140ます

InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
imm.toggleSoftInput(InputMethodManager.SHOW_FORCED, 0);

ホームボタンを押してホーム画面に移動すると、キーボードは開いたままになるためです。


-1
getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);

onCreate()でこれを呼び出して、アクティビティに入ったときにキーボードを自動的に表示します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.