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?
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?
Câu trả lời:
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, ScrollView
do đó bạn cần thêm các thuộc tính này vào con chính của ScrollView
.
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"
android:windowSoftInputMode="stateHidden|adjustPan"
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.xml
của mình Activity
:
android:windowSoftInputMode="stateAlwaysHidden"
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.
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
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);
}
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 EditText
trong 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 EditText
trong 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ể.
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.
đâ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;
}});
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.
Đ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.
Đ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ã ..
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 :)
android: windowSoftInputMode = "stateHidden | AdjustResize"
Làm việc tốt
android:focusableInTouchMode="true"
Thêm dòng trên vào xml của EditText
hoặc dòng TextInputLayout
có 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
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
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.