비교적 간단한 질문이 있습니다. EditText가 많은 활동이 있습니다. 활동을 열면 자동으로 첫 번째 EditText에 초점을 맞추고 가상 키보드를 표시합니다.
어떻게 방지 할 수 있습니까?
비교적 간단한 질문이 있습니다. EditText가 많은 활동이 있습니다. 활동을 열면 자동으로 첫 번째 EditText에 초점을 맞추고 가상 키보드를 표시합니다.
어떻게 방지 할 수 있습니까?
답변:
XML 파일의 레이아웃 태그에 다음 속성을 사용하십시오.
android:focusable="true"
android:focusableInTouchMode="true"
댓글에서 다른 회원이보고 한대로 작동하지 않으므로 ScrollView
이러한 속성을의 기본 하위 항목에 추가해야합니다 ScrollView
.
이를 Android Manifest 활동에 추가 할 수 있습니다.
android:windowSoftInputMode="stateHidden|adjustResize"
android:windowSoftInputMode="stateHidden|adjustPan"
여기에 몇 가지 구현이 설명되어 있지만 이제 속성에 AndroidManifest.xml
대해에 추가 Activity
했습니다.
android:windowSoftInputMode="stateAlwaysHidden"
fragments
." stateAlwaysHidden "활동의 기본 창에 입력 포커스가있을 때 소프트 키보드는 항상 숨겨집니다.
https://stackoverflow.com/a/11627976/5217837 거의 맞습니다.
@Override
public void onCreate(Bundle savedInstanceState) {
getWindow().setSoftInputMode(
WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
}
그러나 SOFT_INPUT_STATE_ALWAYS_VISIBLE이 아니라 SOFT_INPUT_STATE_HIDDEN이어야합니다.
활동 코드에서 다음을 사용하십시오.
@Override
public void onCreate(Bundle savedInstanceState) {
getWindow().setSoftInputMode(
WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
}
태블릿에서 Android 3.2.1을 사용하면 탭을 전환 할 때도 키보드가 자동으로 표시되고 계속 표시되는 유사한 문제가 발생했습니다. 다음 방법을 사용하십시오.
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 );
}
}
각 EditText에 대한 활동의 onCreate () 및 onPause ()에서 :
setEditTextFocus (myEditText, false);
각 EditText에 대해 OnTouchListener :
myEditText.setOnTouchListener(new EditText.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
setEditTextFocus(myEditText, true);
return false;
}
});
의 각각 EditText
에 대해 OnEditorActionListener
:
myEditText.setOnEditorActionListener(new EditText.OnEditorActionListener() {
@Override
public boolean onEditorAction(TextView arg0, int arg1, KeyEvent arg2) {
.......
setEditTextFocus(myEditText, false);
return false;
}
});
그리고 각각 EditText
에 대해 layout xml
:
android:imeOptions="actionDone"
android:inputType="numberDecimal|numberSigned" // Or something else
아마도 더 많은 코드 최적화가 가능할 것입니다.
이 간단한 솔루션을 찾았습니다. 부모 레이아웃에서 다음 속성을 설정하십시오.
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/mainLayout"
android:descendantFocusability="beforeDescendants"
android:focusableInTouchMode="true" >
이제 활동이 시작되면이 기본 레이아웃이 기본적으로 포커스를받습니다.
또한 다음과 같이 주 레이아웃에 다시 포커스를 두어 런타임에 자식 뷰에서 포커스를 제거 할 수 있습니다.
findViewById(R.id.mainLayout).requestFocus();
그것이 당신을 위해 작동하기를 바랍니다.
이것이 제가 사용하고있는 솔루션입니다. 최상의 솔루션은 아니지만 저에게 잘 맞습니다.
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;
}});
흥미롭게도이 문서 https://developer.android.com/training/keyboard-input/visibility.html 은 활동이 시작되고 텍스트 필드에 포커스가 주어지면 소프트 키보드가 표시되지 않는다고 설명합니다. 일부 코드로 원하는 경우 키보드를 표시하는 방법을 보여줍니다.)
내 Samsung Galaxy S5에서 이것은 내 앱 (매니페스트 항목이나 특정 코드 없음)이 작동하는 방식이며 소프트 키보드도 없습니다. 그러나 Lollipop AVD에서는 위에 제공된 문서에 위배되는 소프트 키보드가 표시됩니다.
AVD에서 테스트 할 때이 동작이 발생하면 실제 장치에서 테스트하여 어떤 일이 발생하는지 확인할 수 있습니다.
이것은 다음 게시물에서 몇 가지 좋은 답변이 있습니다 . 활동 시작에서 EditText에 초점을 맞추지 못하도록 합니다. 내가 정기적으로 사용하는 것은 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"/>
참고 : 더미 항목은 초점을 맞출 수있는 요소 바로 앞에 배치되어야합니다.
그리고 ScrollView에서도 완벽하게 작동해야한다고 생각하며 이것에 대한 접근성 문제도 없었습니다.
수락 된 답변이 저에게 효과가 없습니다. 그래서 답변을 제공하는 것이 도움이 될 수 있습니다!
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));
이제 키보드가 열려 있습니다. :)
android : windowSoftInputMode = "stateHidden | adjustResize"
잘 작동
android:focusableInTouchMode="true"
위의 줄을 xml EditText
또는 TextInputLayout
포커스가 있고softInputKeyboard
팝업을 .
이것은 우리의 문제를 해결했으며 이제 키보드가 팝업되지 않습니다.
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));
이것은 나를 위해 작동합니다 조각은 약간 다른 구문을 가질 수 있습니다. 이것은 활동을 위해 작동합니다
보기에 EditText 및 Listview가있는 경우 키보드가 기본적으로 열립니다. 기본적으로 키보드 팝업을 숨기려면 다음을 수행하십시오.
this.listView.requestFocus();
editText에 대한보기를 가져온 후 목록보기에 초점을 요청하고 있는지 확인하십시오.
예를 들어
this.listView = (ListView) this.findViewById(R.id.list);
this.editTextSearch = (EditText) this.findViewById(R.id.editTextSearch);
this.listView.requestFocus();
그렇게하면 editText가 포커스를 받고 키보드가 나타납니다.