Android: tự động hiển thị bàn phím mềm khi lấy nét trên EditText


340

Tôi đang hiển thị một hộp đầu vào bằng cách sử dụng AlertDialog. Bản EditTextthân hộp thoại được tự động lấy nét khi tôi gọi AlertDialog.show(), nhưng bàn phím mềm không tự động hiển thị.

Làm cách nào để làm cho bàn phím mềm tự động hiển thị khi hộp thoại được hiển thị? (và không có bàn phím vật lý / phần cứng). Tương tự như cách tôi nhấn nút Tìm kiếm để gọi tìm kiếm toàn cầu, bàn phím mềm sẽ tự động hiển thị.


1
Điều này sẽ tự động xảy ra, theo nhận xét của Ted dưới đây. Kiểm tra trước!
Cheezmeister

Câu trả lời này là đơn giản nhất và hoạt động tốt: stackoverflow.com/a/8018630/89818
caw


1
Tôi đã trở lại câu trả lời này nhiều lần trong nhiều năm. Nó luôn nằm trong Hộp thoại mà tôi gặp rắc rối này, không bao giờ là Mảnh vỡ hay Hoạt động.
tir38

Câu trả lời:


304

Bạn có thể tạo một người nghe tập trung vào EditTexttrên AlertDialog, sau đó nhận được AlertDialog's Window. Từ đó bạn có thể làm cho bàn phím mềm hiển thị bằng cách gọi 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
Làm thế nào tôi có thể làm điều đó bằng AlertDialog.Builder? ... AlertDialog.Builder alert = new AlertDialog.Builder (Main.this);
Stephen

6
@Stephen bạn có thể lấy hộp thoại từ trình xây dựng bằng cách sử dụng final AlertDialog dialog = builder.create()và sau đó showtrên hộp thoại thay vì trình tạo.
tidbeck

30
TÔI TRẢ LỜI NHẬN XÉT CỦA TÔI TRÊN Tôi phát hiện ra rằng nếu bạn không thể tập trung đúng, hãy xem XML của bạn! Nếu bạn thấy thẻ <requestF Focus> </ requestF Focus> trong đó - hãy xóa nó. Có vẻ như thẻ sẽ tập trung vào EditText, và sau đó trình nghe của bạn sẽ không được kích hoạt vì EditText đã có tiêu điểm.
Ted

11
Làm thế nào để bạn không làm điều này nếu thiết bị có bàn phím phần cứng? Có vẻ như điều này gây khó chịu cho những người dùng.
mxcl

8
Tôi thực sự không hiểu tại sao đây không phải là hành vi mặc định trong SDK. Nếu chế độ xem cần nhập văn bản hiển thị con trỏ nhấp nháy, tại sao ai đó không muốn thấy bàn phím để nhập văn bản? Tôi cảm thấy rất sai đối với một UX
Christian García

240

Để hiển thị sử dụng bàn phím:

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

Để ẩn bàn phím sử dụng:

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

3
Điều này đặc biệt hiệu quả khi bạn muốn hiển thị / ẩn bàn phím mềm dựa trên việc chuyển đổi mức độ hiển thị của chế độ xem trong bố cục của bạn giữa VISIBLE và Gone.
PacificSky

38
Tôi sẽ đề nghị sử dụng cờ SHOW_IMPLICIT, vì điều đó có nghĩa là việc thay đổi hoạt động hoặc ứng dụng sẽ tự động ẩn bàn phím như mong đợi.
drspaceboo

6
@drspaceboo Sử dụng SHOW_IMPLICIT hoàn toàn không hoạt động đối với tôi, tôi phải sử dụng SHOW_FORCED, không biết tại sao ...
Yoann Hercouet

1
Khi nào mã trên nên được chạy? Tôi đã thử làm nó ngay sau khi thêm bố cục của tôi vào cha mẹ của nó. Điều đó đã không làm việc. Nhưng nếu tôi đã làm nó sau khi bố trí đã được một thời gian, nó đã làm việc. Vì vậy, có một cuộc gọi lại sẽ cho tôi biết "Nếu bạn cố gắng hiển thị bàn phím bây giờ, nó sẽ thực sự hoạt động"?
William Jockusch

1
toggleSoftInput (InputMethodManager.SHOW_FORCED, 0) bật tắt bàn phím mềm. Nếu bạn muốn đảm bảo rằng bàn phím xuất hiện, bạn có thể sử dụng inf.showSoftInput (view, InputMethodManager.SHOW_IMPLICIT), trong đó view là View sẽ nhận đầu vào.
PJ_Finnegan

111

Bạn có thể yêu cầu bàn phím mềm ngay sau khi tạo hộp thoại (kiểm tra trên SDK - r20)

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

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

Đối với bất cứ ai tự hỏi, phương pháp này không mở bàn phím mềm khi bàn phím phần cứng được gắn. Tôi vừa thử nghiệm với cáp USB On-The-Go. Hoàn hảo!
13rac1

Điều này không làm gì cho tôi.
JohnyTex

Tôi không có bàn phím phần cứng. Có lẽ cấu hình (?)
JohnyTex

25

Tôi đã có cùng một vấn đề và giải quyết nó với đoạn mã sau. Tôi không chắc nó sẽ hoạt động như thế nào trên điện thoại có bàn phím phần cứng.

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

Nó nằm trong API lớp Dialog cấp 8.
tidbeck

phải được gỡ bỏ sau này vào: /
Jacek Kwiecień

@Xylian nó vẫn còn trong tài liệu Dialog.setOnShowListener ()
tidbeck


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

hoặc là

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

Cảm ơn rất nhiều người bạn, điều này thật tuyệt vời, thực tế tôi đã sử dụng cả hai để giải quyết vấn đề của mình, tôi đã gặp tình huống nếu người dùng ở chế độ thêm, sau đó cần hiển thị bàn phím khi bắt đầu hoạt động và đối với chế độ cập nhật thì không cần bàn phím theo mặc định Vì vậy, trong bảng kê khai cho hoạt động tôi đã đặt stateHiddenvà khi tôi phát hiện người dùng đang tạo mục mới thì tôi đã hiển thị bàn phím bằng dòng mã bạn đã đề cập. :) Một lần nữa cảm ơn.
PHP Avenger

Tôi nhận được thông báo 'không thể giải quyết getWindow ()'. tôi đã thử đặt 'cái này.' và những thứ khác trước nó. tôi muốn lấy bàn phím mà không cần sử dụng edittext, chỉ bằng cách nhấp vào một phần nhất định của màn hình.
Androidcoder

1
@Androidcoder, nó là một phần của Activity, vì vậy hãy thêm một cái gì đó như ((Activity) context).getWindow().....
CoolMind

15

Đoạn mã từ các câu trả lời khác hoạt động, nhưng không phải lúc nào cũng rõ ràng để đặt chúng vào mã, đặc biệt nếu bạn đang sử dụng AlertDialog.Buildervà làm theo hướng dẫn hộp thoại chính thức vì nó không sử dụng final AlertDialog ...hoặc alertDialog.show().

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

Thích hơn là

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

Bởi vì SOFT_INPUT_STATE_ALWAYS_VISIBLE sẽ ẩn bàn phím nếu tiêu điểm chuyển khỏi EditText, trong đó SHOW_FORCED sẽ giữ bàn phím hiển thị cho đến khi nó bị loại bỏ rõ ràng, ngay cả khi người dùng quay lại màn hình chính hoặc hiển thị các ứng dụng gần đây.

Dưới đây là mã làm việc cho AlertDialog được tạo bằng cách sử dụng bố cục tùy chỉnh với EditText được xác định trong XML. Nó cũng đặt bàn phím để có phím "go" và cho phép nó kích hoạt nút dương.

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

Vâng, đây là một bài viết khá cũ, vẫn còn một cái gì đó để thêm.
Đây là 2 phương pháp đơn giản giúp tôi kiểm soát bàn phím và chúng hoạt động hoàn hảo:

Hiển thị bàn phím

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

Ẩn bàn phím

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

getCurrentFocus()
CoolMind

Tôi thấy, đó là một phương pháp của một Activity.
CoolMind

10

Hãy để tôi chỉ một số thông tin bổ sung cho giải pháp của yuku, vì tôi thấy thật khó để làm việc này! Làm cách nào để có được đối tượng AlertDialog từ AlertDialog.Builder của tôi? Chà, đó là kết quả của việc tôi alert.show()bị xử tử:

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

Đây phải là câu trả lời được chấp nhận.
Cristiano Coelho

7

Hãy xem này thảo luận mà xử lý bằng tay ẩn và hiện IME. Tuy nhiên, cảm giác của tôi là nếu một sự tập trung EditTextkhông mang IME lên thì đó là do bạn đang gọi AlertDialog.show()bằng OnCreate()phương thức của bạn hoặc một số phương pháp khác được gợi lên trước khi màn hình thực sự được trình bày. OnPostResume()Tôi tin rằng nên chuyển nó đi trong trường hợp đó.


6

Có bạn có thể làm với setOnFocusChangeListenernó sẽ giúp bạn.

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

Tôi biết câu hỏi này đã cũ bởi tôi nghĩ sử dụng chức năng mở rộng là cách hay hơn để hiển thị bàn phím cho văn bản chỉnh sửa

đây là phương pháp tôi sử dụng để hiển thị bàn phím cho một edittext.

mã kotlin: chỉ cần gọiedittext.showKeyboard()

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

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

Nếu bất cứ ai đang nhận được:

Không thể tạo tham chiếu tĩnh cho phương thức không tĩnh getSystemService (Chuỗi) từ loại Hoạt động

Hãy thử thêm ngữ cảnh vào cuộc gọi getSystemService.

Vì thế

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

1

Câu hỏi ban đầu liên quan đến Hộp thoại và EditText của tôi nằm ở chế độ xem thường xuyên. Dù sao, tôi nghi ngờ điều này sẽ làm việc cho hầu hết các bạn quá. Vì vậy, đây là những gì làm việc cho tôi (phương pháp được đánh giá cao nhất ở trên đã không làm gì cho tôi). Đây là một EditView tùy chỉnh thực hiện điều này (phân lớp không cần thiết, nhưng tôi thấy nó thuận tiện cho mục đích của mình vì tôi cũng muốn lấy tiêu điểm khi chế độ xem hiển thị).

Điều này thực sự phần lớn giống như câu trả lời của tidbecks. Tôi thực sự không nhận thấy câu trả lời của anh ấy vì nó không có phiếu bầu. Sau đó tôi chuẩn bị chỉ bình luận bài viết của anh ấy, nhưng nó sẽ quá dài, vì vậy tôi đã kết thúc việc đăng bài này bằng mọi cách. tidbeck chỉ ra rằng anh ta không chắc nó hoạt động như thế nào với các thiết bị có bàn phím. Tôi có thể xác nhận rằng hành vi dường như giống hệt nhau trong cả hai trường hợp. Điều đó giống như ở chế độ dọc, bàn phím phần mềm được bật lên và ở chế độ ngang thì không. Có bàn phím vật lý trượt ra hoặc không làm cho điện thoại của tôi không có sự khác biệt.

Bởi vì, cá nhân tôi thấy hành vi hơi khó xử mà tôi đã chọn sử dụng : InputMethodManager.SHOW_FORCED. Điều này hoạt động như tôi muốn nó làm việc. Bàn phím trở nên hiển thị bất kể hướng nào, tuy nhiên, ít nhất trên thiết bị của tôi, nó không bật lên nếu bàn phím phần cứng bị trượt ra ngoài.

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

Vấn đề dường như là do nơi bạn nhập văn bản ban đầu bị ẩn (hoặc lồng hoặc một cái gì đó), AlertDialog sẽ tự động đặt cờ WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IMhoặc WindowManager.LayoutParams.FLAG_NOT_FOCUSABLEđể mọi thứ không kích hoạt đầu vào mềm để hiển thị.

Cách để khắc phục điều này là thêm vào như sau:

(...)
// 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

thử và sử dụng:

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

1

Để hiển thị bàn phím, đối với tôi, tôi phải làm như sau

Android TextField: đặt tiêu điểm + đầu vào mềm theo chương trình

Về cơ bản giải pháp là như sau

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

Trong trường hợp 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);
    }
}

Sau khi nhập thành công, tôi cũng đảm bảo rằng tôi đã ẩn bàn phím

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

1

Đặt các phương thức này trong lớp Util của bạn và sử dụng ở bất cứ đâu.

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

Java

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

Tôi đã tạo các hàm mở rộng kotlin-esqe đẹp cho bất kỳ ai quan tâm

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

Đây là mẫu tốt cho bạn:

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

Tại sao câu trả lời này - Bởi vì giải pháp trên sẽ hiển thị bàn phím của bạn nhưng nó sẽ không biến mất nếu bạn nhấp vào bất kỳ nơi nào khác EditText. Vì vậy, bạn cần phải làm một cái gì đó để làm cho keybaord biến mất khi EditTextmất tập trung.

Bạn có thể đạt được điều này bằng cách thực hiện các bước sau:

  1. Làm cho chế độ xem chính (chế độ xem nội dung của hoạt động của bạn) có thể nhấp và có thể tập trung bằng cách thêm các thuộc tính sau

        android:clickable="true" 
        android:focusableInTouchMode="true" 
  2. Thực hiện một phương thức hidePal ()

        public void hideKeyboard(View view) {
            InputMethodManager inputMethodManager =(InputMethodManager)getSystemService(Activity.INPUT_METHOD_SERVICE);
            inputMethodManager.hideSoftInputFromWindow(view.getWindowToken(),InputMethodManager.HIDE_IMPLICIT_ONLY );
        }
  3. Cuối cùng, đặt onF FocusChangeListener của edittext của bạn.

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

0

Đây là một chút khó khăn. Tôi đã làm theo cách này và nó đã làm việc.

1.Trong cuộc gọi đầu tiên để ẩn Đầu vào mềm từ cửa sổ. Điều này sẽ ẩn đầu vào mềm nếu bàn phím mềm hiển thị hoặc không làm gì nếu không.

2. Hiển thị hộp thoại của bạn

3.Sau đó chỉ cần gọi để chuyển đổi đầu vào mềm.

mã:

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

Thử cái này

Một sốUtils.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

Đã thử nhiều nhưng đây là những gì làm việc cho tôi (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

Nhìn vào https://stackoverflow.com/a/39144104/2914140 tôi đã đơn giản hóa một chút:

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

Nó tốt hơn https://stackoverflow.com/a/11155404/2914140 :

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

bởi vì khi bạn nhấn nút Home và di chuyển đến màn hình chính, bàn phím sẽ vẫn mở.


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

Tôi gọi nó trong onCreate () để hiển thị bàn phím tự động, khi tôi đến Hoạt động.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.