[android] Android에서 활동을 시작할 때 EditText가 포커스를 얻지 못하게하는 방법
나는이 Activity
두 가지 요소, 안드로이드 :
EditText
ListView
내 경우에는 Activity
시작이 (가) EditText
즉시 입력 포커스가 (커서 깜박임). 시작시 컨트롤에 입력 포커스를두기를 원하지 않습니다. 나는 시도했다 :
EditText.setSelected(false);
EditText.setFocusable(false);
불운. 시작 EditText
시 스스로 선택하지 않도록 어떻게 확신 할 수 Activity
있습니까?
답변
Luc와 Mark의 훌륭한 답변이지만 좋은 코드 샘플이 없습니다. 다음 예와 같이 태그 android:focusableInTouchMode="true"
와 android:focusable="true"
상위 레이아웃 (예 : LinearLayout
또는 ConstraintLayout
) 을 추가하면 문제가 해결됩니다.
<!-- 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"/>
답변
당신이 원하지 않는 실제 문제가 전혀 초점을 맞추기를 원하지 않습니까? 또는 EditText
? 에 초점을 맞춘 결과 가상 키보드를 표시하지 않으려면 ? EditText
시작에 초점을 맞추는 데 실제로 문제가있는 것은 아니지만 사용자가 명시 적으로 초점을 요구하지 않았을 때 softInput 창을 열어 두어야합니다 EditText
(결과적으로 키보드를 열어야 함).
가상 키보드의 문제인 경우 AndroidManifest.xml
<activity> 요소 설명서를 참조하십시오 .
android:windowSoftInputMode="stateHidden"
-활동에 들어갈 때 항상 숨기십시오.
또는 android:windowSoftInputMode="stateUnchanged"
-변경하지 마십시오 (예 : 아직 표시되지 않은 경우 표시 하지 않지만 활동에 들어갈 때 열린 경우 열어 두십시오).
답변
더 간단한 해결책이 있습니다. 부모 레이아웃에서 다음 속성을 설정하십시오.
<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();
좋은 코멘트 에서 기욤 PERROT :
android:descendantFocusability="beforeDescendants"
기본값 인 것 같습니다 (정수 값은 0 임). 추가하면
android:focusableInTouchMode="true"
됩니다.
실제로 우리는 메소드 (Android 2.2.2) beforeDescendants
에서 기본값으로 설정되어 있음을 알 수 있습니다 ViewGroup.initViewGroup()
. 그러나 0과 같지 않습니다.ViewGroup.FOCUS_BEFORE_DESCENDANTS = 0x20000;
기 illa에게 감사합니다.
답변
내가 찾은 유일한 해결책은 다음과 같습니다.
- LinearLayout 만들기 (다른 종류의 레이아웃이 작동하면 몰라요)
- 속성을 설정
android:focusable="true"
하고android:focusableInTouchMode="true"
그리고 EditText
활동을 시작한 후에 초점을 얻지 못할 것입니다.
답변
문제 XML form
는 레이아웃 에서만 볼 수있는 속성에서 비롯된 것 같습니다 .
EditText
XML 태그 내에서 선언 끝에서이 행을 제거하십시오 .
<requestFocus />
그것은 그런 것을 주어야합니다 :
<EditText
android:id="@+id/emailField"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:inputType="textEmailAddress">
//<requestFocus /> /* <-- without this line */
</EditText>
답변
다른 포스터에서 제공 한 정보를 사용하여 다음 솔루션을 사용했습니다.
레이아웃 XML에서
<!-- Dummy item to prevent AutoCompleteTextView from receiving focus -->
<LinearLayout
android:id="@+id/linearLayout_focus"
android:focusable="true"
android:focusableInTouchMode="true"
android:layout_width="0px"
android:layout_height="0px"/>
<!-- AUTOCOMPLETE -->
<AutoCompleteTextView
android:id="@+id/autocomplete"
android:layout_width="200dip"
android:layout_height="wrap_content"
android:layout_marginTop="20dip"
android:inputType="textNoSuggestions|textVisiblePassword"/>
onCreate ()에서
private AutoCompleteTextView mAutoCompleteTextView;
private LinearLayout mLinearLayout;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.mylayout);
//get references to UI components
mAutoCompleteTextView = (AutoCompleteTextView) findViewById(R.id.autocomplete);
mLinearLayout = (LinearLayout) findViewById(R.id.linearLayout_focus);
}
마지막으로 onResume ()에서
@Override
protected void onResume() {
super.onResume();
//do not give the editbox focus automatically when activity starts
mAutoCompleteTextView.clearFocus();
mLinearLayout.requestFocus();
}
답변
대신 clearFocus () 를 사용해보십시오 setSelected(false)
. 안드로이드의 모든 관점은 초점과 선택성을 모두 가지고 있으며 초점을 지우고 싶다고 생각합니다.