Mở bàn phím mềm theo lập trình


115

Tôi có một hoạt động không có tiện ích con nào cho nó và tệp xml tương ứng là,

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

và tôi muốn mở bàn phím mềm theo lập trình trong khi hoạt động bắt đầu. và những gì tôi đã cố gắng cho đến bây giờ là,

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

Hãy cho tôi một số hướng dẫn.


chào vignesh nhưng mở soft keyboard mà không có textView thì cần gì?
milind

Trên thực tế, tôi đang cố gắng sử dụng trình lắng nghe chính trong hoạt động đó, vì vậy tôi cần phải làm như vậy.
Canh thức

Những gì bạn đã làm là chính xác. Tôi không chắc tại sao bạn không nhìn thấy bàn phím. Tôi đã sử dụng mã này một lần để khởi chạy bàn phím mà không cần bất kỳ thao tác nào của người dùng trên một editText và nó đã thành công.
Vinoth

Xin chào Vinoth, tôi đã thay đổi mã của mình chính xác như các bài đăng trên DSouza và tôi cũng đã cập nhật câu hỏi của mình, vì vậy hãy kiểm tra xem tôi có điều gì cần thay đổi không.
Vignesh

Câu trả lời:


145

Tôi đã sử dụng các dòng sau để hiển thị bàn phím mềm theo cách thủ công bên trong sự kiện onclick và bàn phím hiển thị.

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

Nhưng tôi vẫn không thể mở nó trong khi hoạt động được mở, vậy có giải pháp nào cho việc này không?


@YosiTaguri, thanh lịch hơn nhiều nếu bạn đang xử lý các hoạt động. Và những mảnh vỡ thì sao ?! +1 cho cả hai câu trả lời
S.Thiongane 19/02

và điều gì sẽ xảy ra nếu bạn phải mở bàn phím trên hộp thoại có văn bản chỉnh sửa? Làm thế nào để làm điều đó?
dường như

5
@Vignesh: bạn cần đưa ra một số độ trễ như 500 mili giây trong khi mở bàn phím nếu bạn muốn triển khai mã này tại thời điểm khởi chạy hoạt động.
Vinit Saxena

@vinitsaxena Cảm ơn bạn đã bình luận giá trị của bạn
Vignesh

tôi không chắc nhưng tôi đã thử lấy bất kỳ chế độ xem nào, ví dụ TextView và thêm trình nghe như sau myTextView.post (new Runnable () {public void run () {// here your method}}); và khi quan điểm này sẽ tạo ra nó có nghĩa là tất cả các màn hình hiển thị bây giờ bạn có thể gọi bất cứ điều gì bạn muốn
Aleksey Timoshchenko

121

Trong tệp kê khai của bạn, hãy thử thêm phần sau vào phần <activity>mà bạn muốn hiển thị bàn phím khi hoạt động bắt đầu:

android:windowSoftInputMode="stateVisible"

Điều này sẽ làm cho bàn phím hiển thị khi hoạt động bắt đầu.

Để có thêm tùy chọn, hãy xem tài liệu .


3
Ước gì tôi có thể ủng hộ thường xuyên hơn cho câu trả lời này chỉ để đưa tất cả những bản hack bẩn thỉu đó xuống cuối trang;)
fjdumont

Làm thế nào để bạn làm điều này theo chương trình? Tôi chỉ muốn bàn phím tự động hiển thị trong một số trường hợp nhất định.
phreakhead

1
tôi có hộp thoại đầu vào như liên kết liên kết này làm thế nào để hiển thị bàn phím không hoạt động nhưng trên lời nhắc? điều này đã hoạt động, cảm ơn <code> InputMethodManager inputMethodManager = (InputMethodManager) getSystemService (Context.INPUT_METHOD_SERVICE); if (inputMethodManager! = null) {inputMethodManager.toggleSoftInput (InputMethodManager.SHOW_FORCED, 0); } <code>
shareef

7
Anh ấy nói "có lập trình".
Mert Akcakaya

2
Nó không hiệu quả với tôi. Thay vào đó, điều này không: android: windowSoftInputMode = "stateAlwaysVisible"
Rendicahya

33

Vui lòng làm theo mã dưới đây. Tôi chắc chắn vấn đề của bạn sẽ được giải quyết.

if (imm != null){
        imm.toggleSoftInput(InputMethodManager.SHOW_FORCED,0);
   } 

Xin chào, tôi vừa dán mã của bạn vào bên trong hàm onCreate nhưng vẫn không có thay đổi trong hoạt động của tôi, nếu bạn muốn tôi dán mã, tôi sẽ dán vào bình luận.
Vignesh

Khi bạn muốn truy cập bàn phím chức năng, vui lòng cho tôi biết để tôi giải quyết vấn đề của bạn. Vui lòng gửi cho tôi mã .... nếu có thể
AndroidDanger

Tôi muốn đặt onKeyboardActionListener cho hoạt động của mình, không có gì khác ngoài bố cục tuyến tính.
Vignesh

Chỉ cần xem câu hỏi của tôi ở trên, trong đó tôi đã chỉnh sửa mã với những gì bạn đã cung cấp cho tôi.
Vignesh

Hoạt động này chỉ dành cho thao tác trên bàn phím, tôi muốn nghe từng phím được nhấn (sử dụng onKeyboardActionListener) và tôi sẽ chuyển nó đến máy chủ cục bộ đồng thời
Vignesh

25

Đây là công trình

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

hoặc là

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

2
Cảm ơn vì cách lập trình để thiết lập điều này - điều này hoạt động, trong khi các bản hack InputMethodManager thì không.
Martin Vysny

17

Tất cả những gì tôi cần là để lộ bàn phím, trong một thời điểm rất chính xác. Điều này đã làm việc cho tôi! Cảm ơn Benites.

    private Handler mHandler= new Handler();

Và trong thời điểm rất chính xác:

    mHandler.post(
    new Runnable() {
        public void run() {
            InputMethodManager inputMethodManager =  (InputMethodManager)getSystemService(INPUT_METHOD_SERVICE);
            inputMethodManager.toggleSoftInputFromWindow(yourEditText.getApplicationWindowToken(), InputMethodManager.SHOW_FORCED, 0);
            yourEditText.requestFocus();
        }
    }); 

Giải pháp này làm việc cho tôi trong onResume () với một sửa đổi nhỏ về việc trì hoãn hành động bài: postDelayed( runnable, 500 /* msec */ );
AVIDeveloper

1
Tôi khuyên bạn nên đặt nó trong lệnh gọi lại ViewTreeObserver để nó được gọi trên bố cục đầu tiên để tránh phải đợi một khoảng thời gian tùy ý. Nó sẽ an toàn hơn / phản hồi nhanh hơn.
Gabriel

Chỉ có giải pháp này làm việc cho tôi. Tôi đã có các phương pháp trước đó hoạt động nhưng không may đối với hệ điều hành mới nhất, Trình xử lý là giải pháp khả thi.
MD. Shafiul Alam Biplob

12

Tôi đã sử dụng các dòng sau để hiển thị bàn phím mềm theo cách thủ công bên trong sự kiện 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);
        }

9

Đặt điều đó trong phương thức 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 là cần thiết vì khi HĐH kích hoạt phương thức onResume, bạn không thể chắc chắn rằng tất cả các chế độ xem sẽ vẽ, vì vậy phương thức đăng được gọi từ bố cục gốc của bạn khiến nó phải đợi cho đến khi mọi chế độ xem sẵn sàng.


1
Tôi có một SearchView trong DialogFragment và lần đầu tiên Hộp thoại xuất hiện, SearchView có tiêu điểm ... nhưng bàn phím KHÔNG hoạt động trừ khi người dùng chạm vào nó. Chúng tôi đã cố gắng chỉ sử dụng showSoftInput và cả toggleSoftInputFromWindow từ OnResume ALONE ... hoặc thậm chí trong OnFocusChangeListener cho SearchView ... nhưng không có cái nào hoạt động vì chúng dường như bị kích hoạt trước khi cửa sổ được dựng lên và được vẽ ..... . Sử dụng sự kiện bài đăng này trong OnResume cuối cùng đã giải quyết được nó.
cùi

8

có vẻ như điều này đang hoạt động

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

có vẻ như điều này hoạt động tốt hơn: trong tệp kê khai:

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

Có vẻ như tệp kê khai hoạt động trong Android 4.2.2 nhưng không hoạt động trong Android 4.0.3


8

trong phương thức hoạt động onCreate hoặc onActivityC tạo ra một đoạn

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

6

Tôi đã sử dụng như thế này để hiển thị bàn phím mềm theo chương trình và điều này phù hợp với tôi để ngăn việc tự động thay đổi kích thước của màn hình khi khởi chạy bàn phím.

Trong tệp kê khai:

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

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

Tôi cho rằng điều này sẽ giúp người khác tiết kiệm thời gian tìm kiếm vấn đề này.


Công trình, nhưng bàn phím vẫn có thể nhìn thấy ngay cả khi bạn thoát khỏi ứng dụng, và một khi bạn đóng bàn phím nếu bạn mở lại các ứng dụng, bàn phím không xuất hiện
nulll

Tôi đã không đối mặt với vấn đề này cho đến bây giờ. Tôi cho rằng đó là vấn đề thiết bị.
Noundla Sandeep

Tại sao cần hẹn giờ? Bạn có thể thêm liên kết để đi sâu hơn không?
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)
}

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

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

3

Tôi đã sử dụng nó dưới dạng singleton như:

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

Sử dụng nó trong hoạt động của bạn như:

showSoftKeyboard(this, yourEditTextToFocus);

Cảm ơn bạn rất nhiều vì đã bao gồm một đoạn ngắn về cách sử dụng hàm cũng như chính hàm. Nó hoạt động chính xác như tôi cần!
Chad Wilson

3

Những công việc này:

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

Và bạn gọi phương thức này như thế này:

showKeyboard(NameOfActivity.this);

2

InputMethodManager.SHOW_FORCED không phải là lựa chọn tốt. Nếu sử dụng cài đặt này, bạn nên quản lý trạng thái bàn phím ẩn. Đề nghị của tôi là như thế này;

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

Ngoài ra, bạn có thể tập trung vào chế độ xem (thường là EditText) lấy các tham số của nó. Điều này làm cho nó trở thành một chức năng hữu ích hơn

để biết thêm thông tin về InputMethodManager.SHOW_IMPLICIT và SHOW_FORCED; InputMethodManager


1

Đây là mã nguồn bắt buộc:

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

Để biết chi tiết, vui lòng đi qua liên kết này. Điều này đã giúp tôi. https://github.com/Nikhillosalka/Keyboard/blob/master/README.md


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

Sử dụng mã trên trong onResume () để mở Bàn phím mềm


1

Tương tự như câu trả lời của @ShimonDoodkin, đây là những gì tôi đã làm trong một đoạn.

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

    passwordInput.postDelayed(new ShowKeyboard(), 300); //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.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
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);
        }
    }
}

0

Đã có quá nhiều câu trả lời nhưng không có gì phù hợp với tôi ngoài điều này

inputMethodManager.showSoftInput(emailET,InputMethodManager.SHOW_FORCED);

Tôi đã sử dụng showSoftInput vớiSHOW_FORCED

Và hoạt động của tôi có

 android:windowSoftInputMode="stateVisible|adjustResize"

hy vọng điều này sẽ giúp ai đó


0

Đăng phương pháp này trong hoạt động cơ sở của bạn và sử dụng nó trong các hoạt động khác như một sự quyến rũ

public void openKeyboard() {
    InputMethodManager imm =
            (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
    if (imm != null) {
        imm.toggleSoftInput(InputMethodManager.SHOW_FORCED, 0);
    }
}
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.