[android] Android에서 활동을 시작할 때 EditText가 포커스를 얻지 못하게하는 방법

나는이 Activity두 가지 요소, 안드로이드 :

  1. EditText
  2. 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는 레이아웃 에서만 볼 수있는 속성에서 비롯된 것 같습니다 .

EditTextXML 태그 내에서 선언 끝에서이 행을 제거하십시오 .

<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). 안드로이드의 모든 관점은 초점과 선택성을 모두 가지고 있으며 초점을 지우고 싶다고 생각합니다.