Android: tampilkan soft keyboard secara otomatis ketika fokus pada EditText

340

Saya menunjukkan kotak input menggunakan AlertDialog. Bagian EditTextdalam dialog itu sendiri secara otomatis fokus ketika saya menelepon AlertDialog.show(), tetapi keyboard lunak tidak secara otomatis ditampilkan.

Bagaimana cara membuat soft keyboard ditampilkan secara otomatis saat dialog ditampilkan? (dan tidak ada keyboard fisik / perangkat keras). Mirip dengan bagaimana ketika saya menekan tombol Cari untuk menjalankan pencarian global, keyboard lunak ditampilkan secara otomatis.

Randy Sugianto 'Yuku'
sumber
1
Ini harus terjadi secara otomatis, sesuai komentar Ted di bawah ini. Periksa dulu!
Cheezmeister
Jawaban ini paling sederhana dan berfungsi dengan baik: stackoverflow.com/a/8018630/89818
caw
1
Saya telah kembali ke jawaban ini beberapa kali selama bertahun-tahun. Selalu dalam Dialog bahwa saya mengalami masalah ini, tidak pernah Fragmen atau Kegiatan.
tir38
Kemungkinan duplikat Tutup / sembunyikan Android Soft Keyboard
Md Imran Choudhury

Jawaban:

304

Anda dapat membuat pendengar fokus pada EditTextpada AlertDialog, lalu mendapatkan AlertDialog's Window. Dari sana, Anda dapat menampilkan keyboard lunak dengan menelepon 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);
        }
    }
});
Randy Sugianto 'Yuku'
sumber
5
Bagaimana saya melakukannya dengan menggunakan AlertDialog.Builder? ... AlertDialog.Builder waspada akhir = AlertDialog.Builder baru (Main.this);
Stephen
6
@Stephen Anda bisa mendapatkan dialog dari pembangun dengan menggunakan final AlertDialog dialog = builder.create()dan kemudian showpada dialog, bukan pembangun.
tidbeck
30
SAYA MENGEMBALIKAN KOMENTAR SAYA DI ATAS Saya menemukan bahwa jika Anda tidak bisa mendapatkan fokus dengan benar, lihat XML Anda! Jika Anda melihat tag <requestFocus> </requestFocus> di sana - hapus. Sepertinya tag akan memberikan fokus pada EditText, dan kemudian pendengar Anda tidak akan dipecat karena EditText sudah memiliki fokus.
Ted
11
Bagaimana Anda tidak melakukan ini jika perangkat memiliki keyboard perangkat keras? Sepertinya ini menjengkelkan bagi para pengguna.
mxcl
8
Saya benar-benar tidak mengerti mengapa ini bukan perilaku default di SDK. Jika tampilan yang membutuhkan input teks menunjukkan kursor yang berkedip, mengapa seseorang tidak ingin melihat keyboard untuk memasukkan teks? Rasanya sangat salah dengan UX bagi saya
Christian García
240

Untuk menunjukkan penggunaan keyboard:

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

Untuk menyembunyikan penggunaan keyboard:

InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(view.getWindowToken(),0); 
horkavlna
sumber
3
Ini bekerja sangat baik ketika Anda ingin menampilkan / menyembunyikan keyboard lunak berdasarkan toggling visibilitas tampilan di tata letak Anda antara VISIBLE dan GONE.
PacificSky
38
Saya menyarankan menggunakan flag SHOW_IMPLICIT, karena itu berarti mengubah aktivitas atau aplikasi akan menyembunyikan keyboard secara otomatis seperti yang diharapkan.
drspaceboo
6
@drspaceboo Menggunakan SHOW_IMPLICIT tidak bekerja sama sekali untuk saya, saya harus menggunakan SHOW_FORCED, tidak yakin mengapa ...
Yoann Hercouet
1
Kapan kode di atas dijalankan? Saya mencoba melakukannya segera setelah menambahkan tata letak saya ke induknya. Itu tidak berhasil. Tetapi jika saya melakukannya setelah tata letak telah ada untuk sementara waktu, itu berhasil. Jadi apakah ada panggilan balik yang akan memberi tahu saya "Jika Anda mencoba menunjukkan keyboard sekarang, itu benar-benar akan berfungsi"?
William Jockusch
1
toggleSoftInput (InputMethodManager.SHOW_FORCED, 0) mengaktifkan keyboard lunak. Jika Anda ingin memastikan bahwa keyboard muncul, Anda dapat menggunakan imm.showSoftInput (tampilan, InputMethodManager.SHOW_IMPLICIT) sebagai gantinya, di mana tampilan adalah Tampilan yang akan mendapatkan input.
PJ_Finn mulai
111

Anda dapat meminta keyboard lunak tepat setelah membuat dialog (tes pada SDK - r20)

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

// request keyboard   
dialog.getWindow().setSoftInputMode (WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
Bao Le
sumber
Bagi yang bertanya-tanya, metode ini tidak membuka keyboard lunak saat keyboard perangkat keras terpasang. Saya baru saja menguji dengan kabel USB On-The-Go. Sempurna!
13rac1
Ini tidak melakukan apa pun untuk saya.
JohnyTex
Saya tidak memiliki keyboard perangkat keras. Mungkin konfigurasi (?)
JohnyTex
25

Saya memiliki masalah yang sama dan menyelesaikannya dengan kode berikut. Saya tidak yakin bagaimana kelakuannya pada ponsel dengan keyboard perangkat keras.

// 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();
tidbeck
sumber
Ada di API level Dialog level 8.
tidbeck
harus sudah dihapus nanti: /
Jacek Kwiecień
@Xylian itu masih ada di dokumentasi Dialog.setOnShowListener ()
tidbeck
18
<activity
    ...
    android:windowSoftInputMode="stateVisible" >
</activity>

atau

getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE);
ahtartam
sumber
Terima kasih banyak teman, ini luar biasa, sebenarnya saya menggunakan keduanya untuk memecahkan masalah saya, saya punya situasi di mana jika pengguna berada dalam mode add, maka perlu menampilkan keyboard pada awal aktivitas, dan untuk mode pembaruan, keyboard tidak diperlukan secara default. Jadi dalam manifes untuk aktivitas yang saya atur stateHiddendan ketika saya mendeteksi pengguna membuat item baru maka saya menampilkan keyboard menggunakan baris kode yang telah Anda sebutkan. :) Sekali lagi terima kasih.
PHP Avenger
Saya mendapatkan pesan 'tidak bisa menyelesaikan getWindow ()'. Saya sudah mencoba meletakkan 'ini.' dan hal-hal lain sebelum itu. saya ingin mendapatkan keyboard tanpa menggunakan edittext, hanya dengan mengklik di bagian tertentu layar.
Androidcoder
1
@Androidcoder, ini adalah bagian dari Activity, jadi tambahkan sesuatu seperti ((Activity) context).getWindow().....
CoolMind
15

Potongan kode dari jawaban lain berfungsi, tetapi tidak selalu jelas di mana menempatkannya dalam kode, terutama jika Anda menggunakan AlertDialog.Builderdan mengikuti tutorial dialog resmi karena tidak menggunakan final AlertDialog ...atau alertDialog.show().

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

Lebih disukai

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

Karena SOFT_INPUT_STATE_ALWAYS_VISIBLE akan menyembunyikan keyboard jika fokus beralih dari EditText, di mana SHOW_FORCED akan menjaga keyboard tetap ditampilkan sampai diberhentikan secara eksplisit, bahkan jika pengguna kembali ke layar beranda atau menampilkan aplikasi terbaru.

Di bawah ini adalah kode kerja untuk AlertDialog yang dibuat menggunakan tata letak khusus dengan EditText yang didefinisikan dalam XML. Ini juga mengatur keyboard untuk memiliki tombol "pergi" dan memungkinkannya untuk memicu tombol positif.

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;
    }
}
Soren Stoutner
sumber
11

Nah, ini postingan yang lumayan lama, masih ada sesuatu untuk ditambahkan.
Ini adalah 2 metode sederhana yang membantu saya mengendalikan keyboard dan berfungsi dengan sempurna:

Tampilkan keyboard

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

Sembunyikan keyboard

public void hideKeyboard() {
    InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
    View v = getCurrentFocus();
    if (v != null)
        imm.hideSoftInputFromWindow(v.getWindowToken(), 0);
}
sberezin
sumber
Apa getCurrentFocus()?
CoolMind
Begitu ya, itu metode sebuah Activity.
CoolMind
10

Izinkan saya menunjukkan beberapa info tambahan ke solusi yuku, karena saya merasa sulit untuk mengaktifkannya! Bagaimana saya mendapatkan objek AlertDialog dari AlertDialog.Builder saya? Ya, ini hasil dari alert.show()eksekusi saya :

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);
      }
   }
});
pengguna1344313
sumber
Ini harus menjadi jawaban yang diterima.
Cristiano Coelho
7

Lihatlah diskusi ini yang menangani penyembunyian secara manual dan menunjukkan IME. Namun, perasaan saya adalah bahwa jika fokus EditTexttidak membawa IME naik itu karena Anda memanggil AlertDialog.show()Anda OnCreate()atau metode lain yang ditimbulkan sebelum layar benar-benar disajikan. Memindahkannya ke OnPostResume()harus memperbaikinya dalam kasus itu saya percaya.

jqpubliq
sumber
6

Ya, Anda bisa melakukannya dengan setOnFocusChangeListeneritu akan membantu Anda.

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);
        }
    }
});
Sachin Surjan
sumber
4

Saya tahu pertanyaan ini sudah tua karena saya pikir menggunakan fungsi ekstensi adalah cara yang lebih cantik untuk menampilkan keyboard untuk teks edit

di sini adalah metode yang saya gunakan untuk menunjukkan keyboard untuk edittext.

kode kotlin: hanya perlu meneleponedittext.showKeyboard()

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

kode 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);
      }
    });
  }
A. easazadeh
sumber
3

Jika ada yang mendapatkan:

Tidak dapat membuat referensi statis ke metode non-statis getSystemService (String) dari tipe Activity

Coba tambahkan konteks untuk panggilan getSystemService.

Begitu

InputMethodManager imm = 
(InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE);
imm.toggleSoftInput(InputMethodManager.SHOW_FORCED,0);
Ryan Wittenburg
sumber
1

Pertanyaan aslinya menyangkut Dialog dan EditTeks saya ada di tampilan reguler. Bagaimanapun, saya curiga ini seharusnya bekerja untuk sebagian besar dari Anda juga. Jadi, inilah yang bekerja untuk saya (metode nilai tertinggi yang disarankan di atas tidak membantu saya) Berikut EditView kustom yang melakukan ini (subklasifikasi tidak perlu, tapi saya merasa nyaman untuk keperluan saya karena saya ingin juga mengambil fokus ketika tampilan menjadi terlihat).

Ini sebenarnya sebagian besar sama dengan jawaban tidbeck. Saya sebenarnya tidak memperhatikan jawabannya sama sekali karena itu nol suara. Kemudian saya akan hanya mengomentari posnya, tetapi itu akan terlalu lama, jadi saya akhirnya melakukan posting ini. tidbeck menunjukkan bahwa dia tidak yakin cara kerjanya dengan perangkat yang memiliki keyboard. Saya dapat mengkonfirmasi bahwa perilaku tersebut tampaknya persis sama dalam kedua kasus tersebut. Karena itu pada mode potret keyboard perangkat lunak akan muncul dan pada landscape tidak. Memiliki keyboard fisik meluncur keluar atau tidak ada bedanya di ponsel saya.

Karena, saya pribadi menemukan perilaku sedikit canggung saya memilih untuk menggunakan: InputMethodManager.SHOW_FORCED. Ini berfungsi seperti yang saya inginkan. Keyboard menjadi terlihat terlepas dari orientasinya, namun, setidaknya pada perangkat saya itu tidak muncul jika keyboard perangkat keras telah meluncur keluar.

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

}
Timo
sumber
1

Masalahnya adalah karena tempat di mana Anda memasukkan teks awalnya disembunyikan (atau bersarang atau sesuatu), AlertDialog secara otomatis mengatur bendera WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IMatau WindowManager.LayoutParams.FLAG_NOT_FOCUSABLEsehingga hal-hal tidak memicu input lunak untuk muncul.

Cara untuk memperbaikinya adalah dengan menambahkan yang berikut:

(...)
// 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);
Allan Veloso
sumber
1

coba dan gunakan:

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

Untuk menunjukkan keyboard, bagi saya, saya harus melakukan hal berikut

Android TextField: mengatur fokus + input lunak secara terprogram

Intinya solusinya adalah sebagai berikut

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

dimana ShowKeyboardadalah

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

Setelah input berhasil, saya juga memastikan saya menyembunyikan keyboard

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

Masukkan metode ini di kelas Util Anda dan gunakan di mana saja.

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

Jawa

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);
}
Khemraj
sumber
1

Saya membuat fungsi ekstensi kotlin-esqe yang bagus kalau ada yang tertarik

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)
}
saya adalah E
sumber
0

Ini adalah contoh yang baik untuk Anda:

<?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>
A A
sumber
0

Mengapa jawaban ini - Karena solusi di atas akan menampilkan keyboard Anda tetapi itu tidak akan hilang jika Anda mengklik di tempat lain itu EditText. Jadi, Anda perlu melakukan sesuatu untuk membuat keybaord hilang ketika EditTextkehilangan fokus.

Anda dapat mencapai ini dengan melakukan langkah-langkah berikut:

  1. Jadikan tampilan induk (tampilan konten aktivitas Anda) dapat diklik dan fokus dengan menambahkan atribut berikut

        android:clickable="true" 
        android:focusableInTouchMode="true" 
  2. Terapkan metode hideKeyboard ()

        public void hideKeyboard(View view) {
            InputMethodManager inputMethodManager =(InputMethodManager)getSystemService(Activity.INPUT_METHOD_SERVICE);
            inputMethodManager.hideSoftInputFromWindow(view.getWindowToken(),InputMethodManager.HIDE_IMPLICIT_ONLY );
        }
  3. Terakhir, atur onFocusChangeListener dari edittext Anda.

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

Ini agak sulit. Saya melakukannya dengan cara ini dan itu berhasil.

1.Pada panggilan pertama untuk menyembunyikan Input lunak dari jendela. Ini akan menyembunyikan input lunak jika keyboard lunak terlihat atau tidak melakukan apa-apa jika tidak.

2. Tampilkan dialog Anda

3.Lalu panggil untuk beralih input lunak.

kode:

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);
FRR
sumber
0

Coba ini

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);
}
GameBug
sumber
0

Sudah banyak yang mencoba tetapi inilah yang bekerja untuk saya (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()
Lorenzo
sumber
0

Melihat https://stackoverflow.com/a/39144104/2914140 Saya sedikit menyederhanakan:

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

Itu lebih baik daripada https://stackoverflow.com/a/11155404/2914140 :

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

karena ketika Anda menekan tombol Rumah dan pindah ke layar beranda, keyboard akan tetap terbuka.

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

Saya menyebutnya di onCreate () untuk menampilkan keyboard secara otomatis, ketika saya datang di Activity.

Raul Yang
sumber