Bàn phím bật lên tự động khi bắt đầu Hoạt động


97

Tôi có một câu hỏi tương đối đơn giản. Tôi có một hoạt động với rất nhiều EditText trong đó. Khi tôi mở hoạt động, nó sẽ tự động tập trung vào EditText đầu tiên và hiển thị bàn phím ảo.

Làm thế nào tôi có thể ngăn chặn điều này?


Kiểm tra câu trả lời của tôi về câu hỏi này stackoverflow.com/questions/39593324/...
Android Trợ giúp

Khi Ứng dụng của tôi được Khởi chạy (mở) và nếu chế độ xem văn bản chỉnh sửa Khả dụng, bàn phím sẽ được bật Tự động (hiển thị). Làm thế nào để duy nhất vấn đề này bấm vào đây easycomacademy.com/...
AhmadUllah Ahmad

Câu trả lời:


209

Sử dụng các thuộc tính này trong thẻ bố cục của bạn trong tệp XML:

android:focusable="true"
android:focusableInTouchMode="true"

Theo báo cáo của các thành viên khác trong nhận xét, nó không hoạt động, ScrollViewdo đó bạn cần thêm các thuộc tính này vào con chính của ScrollView.


3
Điều này cũng đã khắc phục sự cố của tôi. Tôi đã thêm cái này vào thẻ RelativeLayout cho hoạt động của mình. Cảm ơn bạn!
Luke

21
Điều thú vị là đủ, nó không hoạt động khi tôi thêm ở trên để một scrollview, nhưng nó đã làm việc cho một LinearLayout
Jerry Brady

1
Tôi nghĩ rằng bạn cần phải đặt nó trên bố trí trên cùng
Utsav Gupta

Vì vậy, tôi đoán điều này hoạt động bởi vì bạn đang nói với chính bố cục rằng nó có thể có tiêu điểm? Nếu không, nó giả định rằng nó cần phải tập trung vào điều khiển đầu tiên trên biểu mẫu? Thật kỳ lạ, tôi đã nhận được bàn phím ngay cả khi tất cả các điều khiển trên biểu mẫu của tôi đã bị vô hiệu hóa. Đã sửa ngay. Cảm ơn bạn!
crowmagnumb

1
Điều quan trọng cần lưu ý là giải pháp này tạo ra các vấn đề về khả năng tiếp cận (một chế độ xem không thể lấy tiêu điểm được đánh dấu là có tiêu điểm) và có thể gây ra những hậu quả không mong muốn.
Renato

96

Bạn có thể thêm cái này vào hoạt động trên Android Manifest của mình:

android:windowSoftInputMode="stateHidden|adjustResize"

Điều này hoạt động, tuy nhiên nếu bạn có nền hình ảnh và lo lắng về việc Bàn phím mềm của mình sẽ thu nhỏ nền hình ảnh như vậy, hãy sử dụngandroid:windowSoftInputMode="stateHidden|adjustPan"
ArtiomLK

31

Tôi có một số triển khai được mô tả ở đây, nhưng bây giờ tôi đã thêm vào thuộc tính AndroidManifest.xmlcủa mình Activity:

android:windowSoftInputMode="stateAlwaysHidden"

Tôi nghĩ rằng đây là cách dễ dàng ngay cả khi bạn đang sử dụng fragments.

" stateAlwaysHidden " Bàn phím mềm luôn bị ẩn khi cửa sổ chính của hoạt động có tiêu điểm nhập liệu.


điều này làm việc cho tôi với cả ScrollView và RelativeLayout.
iversoncru

Nó không tuyệt vời như vậy đối với các phân đoạn, vì bạn đang liên kết "trạng thái ẩn" với hoạt động sẽ chứa tất cả các phân đoạn của bạn, có nghĩa là bất kỳ phân đoạn nào bạn muốn hiển thị trong hoạt động sẽ bị ảnh hưởng bởi thuộc tính (không phải trên "mỗi phân đoạn " nền tảng).
Pelpotronic

11

Nếu bạn có quan điểm khác về hoạt động của mình như a ListView, bạn cũng có thể làm:

ListView.requestFocus(); 

trong onResume () của bạn để lấy tiêu điểm từ editText.

Tôi biết câu hỏi này đã được trả lời nhưng chỉ cung cấp một giải pháp thay thế phù hợp với tôi :)


5

https://stackoverflow.com/a/11627976/5217837 Điều này gần như chính xác:

@Override
public void onCreate(Bundle savedInstanceState) {

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

}

Nhưng nó phải là SOFT_INPUT_STATE_HIDDEN thay vì SOFT_INPUT_STATE_ALWAYS_VISIBLE


4

Sử dụng mã này trong mã Hoạt động của bạn:

@Override
public void onCreate(Bundle savedInstanceState) {

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

}

Điều này không hiệu quả với tôi - bàn phím vẫn bật lên khi tôi bắt đầu hoạt động của mình.
David Doria,

Bạn có thể kiểm tra liên kết này, nó sẽ hoạt động: stackoverflow.com/questions/18977187/…
Sujeet Kumar Gupta

3

Tôi đã gặp sự cố về mô phỏng, ngay cả khi chuyển đổi các tab, bàn phím sẽ tự động bật lên và giữ nguyên, với Android 3.2.1 trên Máy tính bảng. Sử dụng phương pháp sau:

public void setEditTextFocus(EditText searchEditText, boolean isFocused)
{
    searchEditText.setCursorVisible(isFocused);
    searchEditText.setFocusable(isFocused);
    searchEditText.setFocusableInTouchMode(isFocused);
    if (isFocused) {
        searchEditText.requestFocus();
    } else {
        InputMethodManager inputManager = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); 
        inputManager.hideSoftInputFromWindow(searchEditText.getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS );
    }
}   

Trong onCreate () và trong onPause () của hoạt động cho mỗi EditText:

setEditTextFocus (myEditText, false);

Đối với mỗi EditText một OnTouchListener:

    myEditText.setOnTouchListener(new EditText.OnTouchListener() {
        @Override
        public boolean onTouch(View v, MotionEvent event) {
            setEditTextFocus(myEditText, true); 
            return false;
        }
    });

Đối với mỗi EditTexttrong số OnEditorActionListener:

    myEditText.setOnEditorActionListener(new EditText.OnEditorActionListener() {
        @Override
        public boolean onEditorAction(TextView arg0, int arg1, KeyEvent arg2) {
                            .......
            setEditTextFocus(myEditText, false); 
            return false;
        }
    });

Và cho mỗi EditTexttrong số layout xml:

            android:imeOptions="actionDone"
            android:inputType="numberDecimal|numberSigned" // Or something else

Có thể có nhiều mã tối ưu hóa hơn có thể.


3
((InputMethodManager)getActivity().getSystemService("input_method")).hideSoftInputFromWindow(this.edittxt.getWindowToken(), 0);

sử dụng mảnh ..this việc mã để ẩn bàn phím ... khi tránh đoạn mở tập trung vào bàn phím lĩnh vực EditText ...
Sreelal S

2

Tôi đã tìm thấy giải pháp đơn giản này phù hợp với tôi. Đặt các thuộc tính này trong bố cục mẹ của bạn:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/mainLayout"
android:descendantFocusability="beforeDescendants"
android:focusableInTouchMode="true" >

Và bây giờ, khi hoạt động bắt đầu, bố cục chính này sẽ được lấy tiêu điểm theo mặc định.

Ngoài ra, chúng tôi có thể xóa tiêu điểm khỏi các chế độ xem con trong thời gian chạy bằng cách đưa tiêu điểm trở lại bố cục chính, như sau:

findViewById(R.id.mainLayout).requestFocus();

Hy vọng nó sẽ làm việc cho bạn.


1

đây là giải pháp tôi đang sử dụng, không phải là giải pháp tốt nhất nhưng nó hoạt động tốt đối với tôi

 editComment.setFocusableInTouchMode(false);
 editComment.setOnTouchListener(new OnTouchListener(){

                @Override
                public boolean onTouch(View v, MotionEvent event)
                {
                    // TODO Auto-generated method stub
                    editComment.setFocusableInTouchMode(true);
                     editComment.requestFocus() ;
                    return false;
                }});

1

Thật thú vị, tài liệu này https://developer.android.com/training/keyboard-input/visibility.html nói rằng khi một hoạt động bắt đầu và tiêu điểm được cấp cho trường văn bản, bàn phím mềm sẽ không được hiển thị (và sau đó tiếp tục chỉ cho bạn cách hiển thị bàn phím nếu bạn muốn với một số mã).

Trên Samsung Galaxy S5 của tôi, đây là cách ứng dụng của tôi (không có mục nhập tệp kê khai hoặc mã cụ thể) hoạt động - không có bàn phím mềm. Tuy nhiên, trên Lollipop AVD, một bàn phím mềm được hiển thị - trái ngược với tài liệu được đưa ra ở trên.

Nếu bạn nhận được hành vi này khi kiểm tra trong AVD, bạn có thể muốn kiểm tra trên một thiết bị thực để xem điều gì sẽ xảy ra.


1

Điều này có một số câu trả lời tốt ở bài đăng sau: Ngăn EditText thu hút sự tập trung khi khởi động Activity . Đoạn mã mà tôi thường xuyên sử dụng là đoạn mã sau của Morgan :

<!-- Dummy item to prevent AutoCompleteTextView from receiving focus -->
<LinearLayout
    android:focusable="true" 
    android:focusableInTouchMode="true"
    android:layout_width="0px" 
    android:layout_height="0px"/>

<!-- :nextFocusUp and :nextFocusLeft have been set to the id of this component
to prevent the dummy from receiving focus again -->
<AutoCompleteTextView android:id="@+id/autotext"
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content"
    android:nextFocusUp="@id/autotext"     
    android:nextFocusLeft="@id/autotext"/>

LƯU Ý: Mục giả phải được ĐẶT ĐÚNG TRƯỚC phần tử có thể lấy tiêu điểm.

Và tôi nghĩ rằng nó sẽ hoạt động hoàn hảo ngay cả với ScrollView và không gặp bất kỳ vấn đề nào với khả năng truy cập cho việc này.


0

Điều này xảy ra khi EditText của bạn tự động được Focus như khi bạn bắt đầu hoạt động. Vì vậy, một cách dễ dàng và ổn định để khắc phục điều này, chỉ đơn giản là đặt tiêu điểm ban đầu cho bất kỳ chế độ xem nào khác, chẳng hạn như Nút, v.v.

Bạn có thể thực hiện việc này trong XML bố cục của mình, không cần mã ..


0

Câu trả lời được chấp nhận không hoạt động với tôi, đó là lý do tại sao đưa ra giải pháp làm việc cho câu trả lời, có thể nó hữu ích!

EditText edt = (EditText) findViewById(R.id.edt);
edt.requestFocus();    
edt.dispatchTouchEvent(MotionEvent.obtain(SystemClock.uptimeMillis(), SystemClock.uptimeMillis(), MotionEvent.ACTION_DOWN , 0, 0, 0));
edt.dispatchTouchEvent(MotionEvent.obtain(SystemClock.uptimeMillis(), SystemClock.uptimeMillis(), MotionEvent.ACTION_UP , 0, 0, 0));

Bây giờ bàn phím đang mở tận hưởng :)


Câu hỏi đặt ra là làm thế nào để ngăn bàn phím mở.
jk7


0

Thêm mã bên dưới vào đầu XML hoạt động của bạn và đảm bảo Chế độ xem ở trên EditText

<View 
android:layout_width="0dp"
android:layout_height="0dp"
android:focusableInTouchMode="true"/>

0

android:focusableInTouchMode="true"

Thêm dòng trên vào xml của EditTexthoặc dòng TextInputLayoutcó tiêu điểm và đang gây rasoftInputKeyboard bật lên.

Điều này đã giải quyết vấn đề cho chúng tôi và bây giờ bàn phím không bật lên


0

search_edit_text = (EditText) findViewById (R.id.search_edit_text);

    search_edit_text.requestFocus();
    search_edit_text.dispatchTouchEvent(MotionEvent.obtain(SystemClock.uptimeMillis(), SystemClock.uptimeMillis(), MotionEvent.ACTION_DOWN , 0, 0, 0));
    search_edit_text.dispatchTouchEvent(MotionEvent.obtain(SystemClock.uptimeMillis(), SystemClock.uptimeMillis(), MotionEvent.ACTION_UP , 0, 0, 0));

Điều này làm việc cho tôi, các chàng trai có thể có một số cú pháp khác nhau. NÀY LÀM VIỆC CHO HOẠT ĐỘNG


Bạn cần cung cấp bất kỳ giới hạn, giả định hoặc đơn giản hóa nào trong câu trả lời của mình. Xem thêm chi tiết về cách trả lời tại liên kết này: stackoverflow.com/help/how-to-answer
Usama Abdulrehman

-1

Nếu chế độ xem của bạn có EditText và Listview thì Bàn phím sẽ mở ra theo mặc định. Để ẩn bàn phím bật lên theo mặc định, hãy làm như sau

this.listView.requestFocus();

Đảm bảo rằng bạn đang yêu cầu tập trung vào listview sau khi có được lượt xem editText.

Ví dụ

this.listView = (ListView) this.findViewById(R.id.list);
this.editTextSearch = (EditText) this.findViewById(R.id.editTextSearch);
this.listView.requestFocus();

Nếu bạn làm điều đó, thì editText sẽ lấy tiêu điểm và bàn phím sẽ bật lên.


Tôi đã làm điều này nhưng bàn phím của họ vẫn bật lên và tiêu điểm là với editText.
David Doria
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.