Buka keyboard lunak secara terprogram

116

Saya memiliki aktivitas tanpa widget anak untuk itu dan file xml yang sesuai adalah,

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

dan saya ingin membuka keyboard lunak secara terprogram saat aktivitas dimulai. dan yang saya coba hingga sekarang adalah,

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

Beri aku petunjuk.

Vignesh
sumber
hi vignesh tetapi apa perlunya membuka keyboard lunak tanpa textView?
Milind
Sebenarnya saya mencoba menggunakan key listener dalam aktivitas itu, untuk itu saya perlu melakukannya.
Vignesh
Apa yang Anda lakukan itu benar. Saya tidak yakin mengapa Anda tidak melihat keyboard tersebut. Saya menggunakan kode ini sekali untuk meluncurkan keyboard tanpa tindakan pengguna pada editText dan berhasil.
Vinoth
Halo Vinoth, saya telah mengubah kode saya persis seperti postingan DSouza dan pertanyaan saya juga telah diperbarui, jadi periksa apakah ada yang harus saya ubah.
Vignesh

Jawaban:

145

Saya telah menggunakan baris berikut untuk menampilkan keyboard lunak secara manual di dalam acara onclick, dan keyboard terlihat.

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

Tapi saya masih belum bisa membuka ini saat aktivitas dibuka, jadi apakah ada solusi untuk ini?

Vignesh
sumber
@YosiTaguri, jauh lebih elegan jika berurusan dengan aktivitas. Dan bagaimana dengan fragmen ?! +1 untuk kedua jawaban
S.Thiongane
dan bagaimana jika Anda harus membuka keyboard pada dialog yang memiliki teks edit? Bagaimana cara melakukannya?
seema
5
@Vignesh: Anda perlu memberikan penundaan seperti 500 milidetik saat membuka keyboard jika Anda ingin mengimplementasikan kode ini pada saat meluncurkan aktivitas.
Vinit Saxena
@vinitsaxena Terima kasih atas komentar berharga Anda
Vignesh
saya tidak yakin tetapi saya mencoba mendapatkan tampilan apa pun misalnya TextView dan menambahkan pendengar seperti ini myTextView.post (Runnable baru () {public void run () {// di sini metode Anda}}); dan ketika tampilan ini akan membuat itu berarti bahwa semua layar terlihat sekarang Anda dapat memanggil apa pun yang Anda inginkan
Aleksey Timoshchenko
121

Dalam file manifes Anda, coba tambahkan berikut ini ke <activity>yang ingin Anda perlihatkan keyboard saat aktivitas dimulai:

android:windowSoftInputMode="stateVisible"

Ini harus menyebabkan keyboard menjadi terlihat saat aktivitas dimulai.

Untuk opsi lainnya, lihat dokumentasi .

jemerick
sumber
3
Seandainya saya dapat memberi suara positif lebih sering untuk jawaban ini hanya untuk mendapatkan semua peretasan kotor itu ke bagian bawah halaman;)
fjdumont
Bagaimana Anda melakukan ini secara terprogram? Saya hanya ingin keyboard ditampilkan secara otomatis dalam situasi tertentu.
phreakhead
1
Saya memiliki dialog masukan seperti tautan tautan ini bagaimana cara menampilkan keyboard bukan pada aktivitas tetapi pada prompt? ini berhasil, terima kasih <code> InputMethodManager inputMethodManager = (InputMethodManager) getSystemService (Context.INPUT_METHOD_SERVICE); if (inputMethodManager! = null) {inputMethodManager.toggleSoftInput (InputMethodManager.SHOW_FORCED, 0); } <code>
shareef
7
Dia mengatakan "secara terprogram".
Mert Akcakaya
2
Itu tidak berhasil untuk saya. Sebagai gantinya, ini berfungsi: android: windowSoftInputMode = "stateAlwaysVisible"
Rendicahya
34

Silakan ikuti kode di bawah ini. Saya yakin masalah Anda akan terpecahkan.

if (imm != null){
        imm.toggleSoftInput(InputMethodManager.SHOW_FORCED,0);
   } 
AndroidDanger
sumber
Hai, saya baru saja menempelkan kode Anda di dalam fungsi onCreate tetapi masih tidak ada perubahan dalam aktivitas saya, jika Anda ingin saya menempelkan kode, saya akan menempelkannya di komentar.
Vignesh
Jika Anda ingin mengakses softkeyboard tolong beri tahu saya agar saya dapat menyelesaikan masalah Anda. Kirimkan saya kode .... jika memungkinkan
AndroidDanger
Saya ingin menyetel onKeyboardActionListener untuk aktivitas saya yang tidak memiliki apa-apa selain linear layout.
Vignesh
Lihat saja pertanyaan saya di atas di mana saya telah mengedit kode dengan apa yang telah Anda berikan untuk saya.
Vignesh
Aktivitas ini hanya untuk tindakan keyboard, saya ingin mendengarkan setiap tombol yang ditekan (menggunakan onKeyboardActionListener) dan saya akan meneruskannya ke server lokal secara bersamaan
Vignesh
25

Ini berhasil

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

atau

getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE);
ahtartam
sumber
2
Terima kasih atas cara programatik untuk menyetel ini - ini berfungsi, sedangkan peretasan InputMethodManager tidak.
Martin Vysny
17

Yang saya butuhkan hanyalah mengekspos keyboard, pada saat yang sangat tepat. Ini berhasil untuk saya! Terima kasih Benites.

    private Handler mHandler= new Handler();

Dan di saat yang sangat tepat:

    mHandler.post(
    new Runnable() {
        public void run() {
            InputMethodManager inputMethodManager =  (InputMethodManager)getSystemService(INPUT_METHOD_SERVICE);
            inputMethodManager.toggleSoftInputFromWindow(yourEditText.getApplicationWindowToken(), InputMethodManager.SHOW_FORCED, 0);
            yourEditText.requestFocus();
        }
    }); 
DiegoSoto
sumber
Solusi ini bekerja untuk saya di dalam onResume () dengan sedikit modifikasi pada penundaan tindakan posting: postDelayed( runnable, 500 /* msec */ );
AVIDeveloper
1
Saya akan merekomendasikan untuk meletakkannya dalam callback ViewTreeObserver sehingga dipanggil pada tata letak pertama untuk menghindari harus menunggu dalam jumlah waktu yang sewenang-wenang. Ini harus lebih aman / lebih responsif.
Gabriel
Hanya solusi ini yang berhasil untuk saya. Saya memiliki metode sebelumnya sebelumnya yang berfungsi tetapi sayangnya untuk OS terbaru, Penangan adalah solusi yang bisa diterapkan.
MD. Shafiul Alam Biplob
12

Saya telah menggunakan baris berikut untuk menampilkan keyboard lunak secara manual di dalam acara 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);
        }
Ram
sumber
9

Masukkan itu ke dalam metode 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();
    }
});

runnable diperlukan karena ketika OS mengaktifkan metode onResume, Anda tidak dapat memastikan bahwa semua tampilan berada di tempat draw, sehingga metode posting yang dipanggil dari tata letak root Anda membuatnya menunggu hingga setiap tampilan siap.

Marcelo Benites
sumber
1
Saya memiliki SearchView di DialogFragment dan pertama kali Dialog muncul, SearchView memiliki fokus ... tetapi keyboard TIDAK aktif kecuali pengguna menyentuhnya. Kami telah mencoba hanya menggunakan showSoftInput dan juga toggleSoftInputFromWindow dari OnResume ALONE ... atau bahkan di OnFocusChangeListener untuk SearchView ... tetapi tidak ada yang berfungsi karena tampaknya menyala sebelum jendela dibuka dan ditarik ..... . menggunakan acara posting ini di OnResume akhirnya menyelesaikannya.
lepert
8

sepertinya ini berhasil

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

tampaknya ini bekerja lebih baik: dalam bentuk nyata:

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

Tampaknya manifes bekerja di Android 4.2.2 tetapi tidak berfungsi di Android 4.0.3

Shimon Doodkin
sumber
8

dalam metode aktivitas onCreate atau onActivityCreated dari sebuah fragmen

....
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;
        }
    });
Alex
sumber
6

Saya telah menggunakan seperti ini untuk menampilkan keyboard lunak secara terprogram dan ini berfungsi untuk saya mencegah pengubahan ukuran otomatis layar saat meluncurkan keyboard.

Dalam manifes:

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

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

Saya berasumsi ini akan menghemat waktu orang lain untuk mencari masalah ini.

Noundla Sandeep
sumber
Berfungsi, tetapi keyboard tetap terlihat bahkan jika Anda keluar dari aplikasi, dan setelah Anda menutup keyboard jika Anda membuka lagi aplikasi, keyboard tidak muncul
nulll
Saya tidak menghadapi masalah ini sampai sekarang. Saya berasumsi bahwa ini adalah masalah perangkat.
Noundla Sandeep
Mengapa pengatur waktu dibutuhkan? Bisakah Anda menambahkan tautan untuk lebih dalam?
nulll
6

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
3
InputMethodManager inputMethodManager=(InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
            inputMethodManager.toggleSoftInput(InputMethodManager.SHOW_FORCED,0);
Kai Wang
sumber
3

Saya menggunakannya sebagai tunggal seperti:

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

Gunakan dalam aktivitas Anda seperti:

showSoftKeyboard(this, yourEditTextToFocus);
Shylendra Madda
sumber
Terima kasih banyak telah menyertakan potongan singkat tentang cara menggunakan fungsi serta fungsi itu sendiri. Ini bekerja persis seperti yang saya butuhkan!
Chad Wilson
3

Ini bekerja:

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

Dan Anda menyebut metode ini seperti ini:

showKeyboard(NameOfActivity.this);
Thiago Silva
sumber
2

InputMethodManager.SHOW_FORCED bukanlah pilihan yang baik. Jika Anda menggunakan pengaturan ini, Anda harus mengelola status keyboard tersembunyi. Saran saya seperti ini;

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

Juga, Anda dapat fokus pada tampilan (biasanya EditText) mengambil parameternya. Ini membuatnya menjadi fungsi yang lebih berguna

untuk info lebih lanjut tentang InputMethodManager.SHOW_IMPLICIT dan SHOW_FORCED; InputMethodManager

Cafer Mert Ceyhan
sumber
1

Ini adalah kode sumber yang diperlukan:

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

Untuk detailnya, silakan buka tautan ini. Ini membantu saya. https://github.com/Nikhillosalka/Keyboard/blob/master/README.md

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

Gunakan kode di atas di onResume () untuk membuka Keyboard lunak

Sanket Parchande
sumber
1

Mirip dengan jawaban @ShimonDoodkin, ini yang saya lakukan dalam sebuah fragmen.

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

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

dimana ShowKeyboardadalah

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

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

Sudah terlalu banyak jawaban tetapi tidak ada yang berhasil bagi saya selain dari ini

inputMethodManager.showSoftInput(emailET,InputMethodManager.SHOW_FORCED);

Saya dulu showSoftInputdenganSHOW_FORCED

Dan aktivitas saya telah

 android:windowSoftInputMode="stateVisible|adjustResize"

semoga ini membantu seseorang

spaceMonkey
sumber
0

Posting metode ini di aktivitas dasar Anda dan gunakan aktivitas lain seperti pesona

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