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


2871

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

  1. EditText
  2. ListView

내 경우에는 Activity시작이 (가) EditText즉시 입력 포커스가 (커서 깜박임). 시작시 컨트롤에 입력 포커스를두기를 원하지 않습니다. 나는 시도했다 :

EditText.setSelected(false);
EditText.setFocusable(false);

불운. 시작 EditText시 스스로 선택하지 않도록 어떻게 확신 할 수 Activity있습니까?

답변:


2591

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"/>

711
부모 레이아웃을 android:focusableInTouchMode="true"!로 설정하는 것은 어떻습니까 ?
Muhammad Babar

28
완전한! 고마워요 ... 주목할 점은, 포커스 가능한 요소보다 먼저 더미 아이템을 배치해야한다는 것입니다 !!! 내 더미와 EditText 사이에 TextView가 있었고 메소드가 작동하지 않았습니다!
maddob

25
설정은 안드로이드 : focusableIn TouchMode를 = 부모 레이아웃을 "true"는 좋은 접근 방식 덕분 @Muhammad 바바이었다
sujith의

7
좋은 코드, 나에게 많은 도움이되었습니다 :) 그것을 개선하려고, android:focusableInTouchMode="true"덮개 android:focusable="true"+ 좀 더, 그래서이 경우 android:focusable="true"불필요하며 제거 할 수 있습니다. 또한 더미보기는 LinearLayout 대신보기 일 수 있습니다. 이렇게하면 처리 능력이 절약되고 일부 경고가 발생하지 않습니다. 따라서, 내 권고와 더미보기를 대체<View android:focusableInTouchMode="true" android:layout_width="0px" android:layout_height="0px"/>
야곱 R

20
@PietroRea Android에는 앱 구조의 핵심 동작에 내장 된 성가신 자동 초점 동작이 있습니다. 편집 텍스트가 포커스를 해제하거나 잃어 버렸다고 말하면 포커스가 어디로 가는지 자동으로 결정합니다. 포커스를 전송할 새 객체가 없으면 해당 요소가 포커스를 해제 한 요소 인 경우에도 레이아웃에서 첫 번째 포커스 가능한 요소를 선택합니다! 다소 불편하고 실망 스럽지만 이러한 유형의 행동에 대한 정당한 이유가있을 수 있습니다.
Weston Wedding

1675

당신이 원하지 않는 실제 문제가 전혀 초점을 맞추기를 원하지 않습니까? 또는 EditText? 에 초점을 맞춘 결과 가상 키보드를 표시하지 않으려면 ? EditText시작에 초점을 맞추는 데 실제로 문제가있는 것은 아니지만 사용자가 명시 적으로 초점을 요구하지 않았을 때 softInput 창을 열어 두어야합니다 EditText(결과적으로 키보드를 열어야 함).

가상 키보드의 문제인 경우 AndroidManifest.xml <activity> 요소 설명서를 참조하십시오 .

android:windowSoftInputMode="stateHidden" -활동에 들어갈 때 항상 숨기십시오.

또는 android:windowSoftInputMode="stateUnchanged"-변경하지 마십시오 (예 : 아직 표시되지 않은 경우 표시 하지 않지만 활동에 들어갈 때 열린 경우 열어 두십시오).


24
그러나 아직도 커서는 레이아웃의 첫 번째 글고 치기에 - 키보드가 표시되지 않은 경우에도
martyglaubitz

39
@ 앤더슨 : 대답에 대해 아무것도 EditText초점을 얻지 못했음을 암시하지 않았습니다 . 실제로 소프트웨어 키보드 IME 가 포커스에서 자동으로 열리지 않도록하는 방법입니다 . 더 큰 문제는 포커스 자체가 아닌 소프트 키보드가 예기치 않게 나타나는 것입니다. 문제가 EditText실제로 초점을 맞추고 있다면 다른 사람의 대답을 사용하십시오.
Joe

1
프로그래밍 방식으로 설정합니다 stackoverflow.com/questions/6138330/...
닉 Franceschina

3
카메라를 사용하여 활동을하지 마십시오. 플래시의 타이밍을 why습니다 (이유를 묻지 마십시오)
Daniel Wilson

1
@Joe이 질문은 시작할 때 키보드를 숨기는 것이 아닙니다. 이러한 질문이 여기에 요청되었습니다. stackoverflow.com/questions/18977187/…
user924

1140

더 간단한 해결책이 있습니다. 부모 레이아웃에서 다음 속성을 설정하십시오.

<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에게 감사합니다.


1
이러한 속성을 활동의 작성에 중점을 두는보기 의 직접적인 상위 로 설정하는 것이 중요합니다 . 그렇지 않으면 작동하지 않습니다.
tomrozb

4
완벽한 솔루션입니다. 1. 자동 초점 비활성화 및 2. 소프트 키보드의 자동 열기 비활성화
만나십시오.

좋은. 직접적인 부모 일 필요는 없습니다. 레이아웃의 루트 수준으로 설정했는데 제대로 작동하는 것 같습니다.
Kurotsuki

@DanielWilson 언제 스크롤 텍스트를 편집 텍스트의 부모로 원하십니까?
Mark Buikema


426

내가 찾은 유일한 해결책은 다음과 같습니다.

  • LinearLayout 만들기 (다른 종류의 레이아웃이 작동하면 몰라요)
  • 속성을 설정 android:focusable="true"하고android:focusableInTouchMode="true"

그리고 EditText활동을 시작한 후에 초점을 얻지 못할 것입니다.


단순한!! 처음에 이러한 속성을 부모 뷰에 추가했는데 실패했는데 다른 레이아웃으로 설정하고 제대로 작동했습니다. 감사!!
리노

ConstraintLayout 과도 작동합니다.
Hawklike

85

문제 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>

77

다른 포스터에서 제공 한 정보를 사용하여 다음 솔루션을 사용했습니다.

레이아웃 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();
}

73

대신 clearFocus () 를 사용해보십시오 setSelected(false). 안드로이드의 모든 관점은 초점과 선택성을 모두 가지고 있으며 초점을 지우고 싶다고 생각합니다.


유망한 것처럼 들리지만 활동 라이프 사이클의 어느 시점에서 호출해야합니까? onCreate ()에서 호출하면 EditText에 여전히 포커스가 있습니다. onResume () 또는 다른 위치에서 호출해야합니까? 감사!
Mark

8
수락 된 답변을이 답변과 결합했습니다. 나는 활동 myEditText.clearFocus(); myDummyLinearLayout.requestFocus();onResume에 전화 했다 . 이렇게하면 전화기를 회전 할 때 EditText가 포커스를 유지하지 못합니다.
teedyay

71

다음은 편집 할 때 편집 텍스트가 초점을 맞추는 것을 중지 시키지만 터치하면 편집 텍스트를 가져옵니다.

<EditText
    android:id="@+id/et_bonus_custom"
    android:focusable="false" />

따라서 XML에서 focusable을 false로 설정했지만 키는 java에 있으며 다음 리스너를 추가합니다.

etBonus.setOnTouchListener(new View.OnTouchListener() {
    @Override
    public boolean onTouch(View v, MotionEvent event) {
        v.setFocusable(true);
        v.setFocusableInTouchMode(true);
        return false;
    }
});

이벤트를 소비하지 않고 거짓을 반환하므로 초점 동작이 정상적으로 진행됩니다.


6
그러나 이것은 앞으로 초점을 얻지 못할 것입니다. 초기 (활동 시작)에 대해서만 초점을 멈추는 방법 ??
Jayesh

1
다른 터치 동작 전에 onTouchListener가 호출됩니다. 따라서 터치 식으로 초점을 맞출 수있게하면 첫 번째 터치에서 표준 초점이 발생합니다. 키보드와 모든 것이 나타납니다.
MinceMan

1
나는 이것이 최선의 방법이라고 생각합니다. 또한 위의 mumbo-jumbo xml magic dummy 코드는 복잡한 편집 텍스트 세트에서 작동하지 않았습니다 ...이 작동하면 명확하게 투표합니다.
Radu

그러나 여러 개의 편집 텍스트가있는 경우 다음 편집 텍스트에 초점을 맞추고 키보드를 열므로 특정 활동에 대해 매니페스트에 android : windowSoftInputMode = "stateAlwaysHidden" 을 추가하는 것이 좋습니다 .
Karan sharma

참고 : Android P에서 시스템은 더 이상 기본 초점을 갖지 않습니다. 이 해킹 P.에 필요한 시작 아니라고이 수단
MinceMan

65

몇 가지 답변을 개별적으로 시도했지만 여전히 EditText에 중점을 둡니다. 아래 솔루션 중 두 가지를 함께 사용하여 문제를 해결했습니다.

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

(실버 https://stackoverflow.com/a/8639921/15695 참조 )

제거

 <requestFocus />

EditText에서

(floydaddict https://stackoverflow.com/a/9681809 참조 )


1
위와 더불어 edittext.clearFocus ()를 추가해야 작동했습니다. :)
Nav

57

늦었지만 가장 간단한 대답은 XML의 부모 레이아웃에 이것을 추가하십시오.

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

그것이 당신을 도우면 공감하십시오! 행복한 코딩 :)


2
나를 위해 완벽하게 일했습니다. 한 가지 더 주목해야 할 점은 스크롤을 위해이 줄을 추가하지 마십시오. 스크롤보기에서는 작동하지 않습니다. 그러나 선형 레이아웃으로 완벽하게 작동했습니다.
Karthic Srinivasan

46

이 솔루션 중 어느 것도 나를 위해 일하지 않았습니다. 자동 초점을 수정하는 방법은 다음과 같습니다.

<activity android:name=".android.InviteFriendsActivity" android:windowSoftInputMode="adjustPan">
    <intent-filter >
    </intent-filter>
</activity>

2
Android Manifest의 활동에 대한 android : windowSoftInputMode = "adjustPan"
rallat

43

간단한 해결책 :에서 AndroidManifestActivity태그 사용

android:windowSoftInputMode="stateAlwaysHidden"

6
엄밀히 말하면 문제가 해결되지 않습니다. OP는 다음과 같이 말했다. "시작할 때 어떤 컨트롤도 입력 포커스를 갖기를 원하지 않습니다." 솔루션은 키보드 만 숨기고 미묘한 차이가 있습니다.
katzenhut

@ katzenhut yep, 이것이이 답변에 대한 나의 문제입니다. 내 편집 텍스트에 집중하면 PlaceAutoComplete 활동이 열리므로이 답변은 불완전합니다
Zach

질문에 다음과 같은 경우이 답변이 완료됩니다. 항상 내 활동에 키보드가 표시되지 않도록하려면 어떻게해야합니까? 그렇지 않습니다.
Martin Marconcini

37

당신은 설정할 수 있습니다 "포커스""터치 모드에서 포커스" 처음에 진정한 가치를 TextViewlayout. 이런 식으로 활동이 시작되면 TextView의지에 초점이 맞춰 지지만, 그 특성으로 인해 화면에 아무것도 표시 되지 않고 키보드가 표시 되지 않습니다 ...


나를 위해 완벽하게 작동합니다. 첫 번째 텍스트 뷰가 아닌 내 활동의 가장 바깥 쪽 레이아웃에 값을 설정했습니다.
Maverick1st

36

다음은에서 나를 위해 일했습니다 Manifest. 쓰기

<activity
android:name=".MyActivity"
android:windowSoftInputMode="stateAlwaysHidden"/>

1
텍스트 필드에 초점을 맞추지 않고 키보드 만 숨 깁니다. 여전히 필드 밖으로 밀린 힌트를 얻을 수 있으며 모든 색상 상태 선택기는 "focused = true"상태를 표시합니다.
A. Rager

31

프로그래밍 방식으로 모든 분야의 초점을 명확하게해야했습니다. 방금 기본 레이아웃 정의에 다음 두 문장을 추가했습니다.

myLayout.setDescendantFocusability(ViewGroup.FOCUS_BEFORE_DESCENDANTS);
myLayout.setFocusableInTouchMode(true);

그게 다야. 내 문제를 즉시 해결했습니다. 고마워, 실버, 올바른 방향으로 나를 가리켜 줘.


28

파일 android:windowSoftInputMode="stateAlwaysHidden"의 활동 태그에 추가 Manifest.xml하십시오.

출처


1
텍스트 필드에 초점을 맞추지 않고 키보드 만 숨 깁니다. 여전히 필드 밖으로 밀린 힌트를 얻을 수 있으며 모든 색상 상태 선택기는 "focused = true"상태를 표시합니다.
A. Rager

25

과 같은 활동에 대한 다른 견해가있는 경우 다음을 ListView수행 할 수도 있습니다.

ListView.requestFocus(); 

에서 귀하의 onResume()초점을 잡으십시오 editText.

이 질문에 대한 답변은 받았지만 나에게 도움이되는 대체 솔루션을 제공한다는 것을 알고 있습니다.


22

편집 가능한 첫 번째 필드 전에 다음을 시도하십시오.

<TextView  
        android:id="@+id/dummyfocus" 
        android:layout_width="fill_parent"
        android:layout_height="wrap_content" 
        android:text="@string/foo"
        />

----

findViewById(R.id.dummyfocus).setFocusableInTouchMode(true);
findViewById(R.id.dummyfocus).requestFocus();

21

onCreate방법에 다음을 추가하십시오 .

this.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);

1
텍스트 필드에 초점을 맞추지 않고 키보드 만 숨 깁니다. 여전히 필드 밖으로 밀린 힌트를 얻을 수 있으며 모든 색상 상태 선택기는 "focused = true"상태를 표시합니다.
A. Rager

17

기능과 관련된 것으로 XML을 오염시키고 싶지 않기 때문에이 포커스를 "투명하게"첫 번째 포커스 가능 뷰에서 훔친 다음 필요할 때 자체적으로 제거하는이 방법을 만들었습니다!

public static View preventInitialFocus(final Activity activity)
{
    final ViewGroup content = (ViewGroup)activity.findViewById(android.R.id.content);
    final View root = content.getChildAt(0);
    if (root == null) return null;
    final View focusDummy = new View(activity);
    final View.OnFocusChangeListener onFocusChangeListener = new View.OnFocusChangeListener()
    {
        @Override
        public void onFocusChange(View view, boolean b)
        {
            view.setOnFocusChangeListener(null);
            content.removeView(focusDummy);
        }
    };
    focusDummy.setFocusable(true);
    focusDummy.setFocusableInTouchMode(true);
    content.addView(focusDummy, 0, new LinearLayout.LayoutParams(0, 0));
    if (root instanceof ViewGroup)
    {
        final ViewGroup _root = (ViewGroup)root;
        for (int i = 1, children = _root.getChildCount(); i < children; i++)
        {
            final View child = _root.getChildAt(i);
            if (child.isFocusable() || child.isFocusableInTouchMode())
            {
                child.setOnFocusChangeListener(onFocusChangeListener);
                break;
            }
        }
    }
    else if (root.isFocusable() || root.isFocusableInTouchMode())
        root.setOnFocusChangeListener(onFocusChangeListener);

    return focusDummy;
}

15

늦었지만 도움이 될 수 있습니다. 다음 전화 레이아웃의 상단에 더미 글고 치기 만들기 myDummyEditText.requestFocus()onCreate()

<EditText android:id="@+id/dummyEditTextFocus" 
android:layout_width="0px"
android:layout_height="0px" />

예상대로 작동하는 것 같습니다. 구성 변경 등을 처리 할 필요가 없습니다. 긴 TextView가있는 활동에이 기능이 필요했습니다 (지침).


왜 루트 뷰 자체로 이것을하지 않습니까?
CJBS


13

예, 똑같은 일을했습니다-초기 초점을 얻는 '더미'선형 레이아웃을 만듭니다. 또한 '다음'초점 ID를 설정하여 사용자가 한 번 스크롤 한 후 더 이상 초점을 맞출 수 없습니다.

<LinearLayout 'dummy'>
<EditText et>

dummy.setNextFocusDownId(et.getId());

dummy.setNextFocusUpId(et.getId());

et.setNextFocusUpId(et.getId());

뷰에 초점을 없애기위한 많은 작업 ..

감사


12

나에게 모든 장치에서 효과가 있었던 것은 다음과 같습니다.

    <!-- fake first focusable view, to allow stealing the focus to itself when clearing the focus from others -->

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

이 문제를 문제에 초점을 맞춘보기보다 먼저보기 만하면됩니다.


10

내가 한 가장 간단한 일은 onCreate의 다른보기에 초점을 맞추는 것입니다.

    myView.setFocusableInTouchMode(true);
    myView.requestFocus();

소프트 키보드가 멈추고 EditText에 커서가 깜박이지 않았습니다.


10

이것은 완벽하고 가장 쉬운 솔루션입니다. 나는 항상 이것을 내 앱에서 사용합니다.

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

텍스트 필드에 초점을 맞추지 않고 키보드 만 숨 깁니다. 여전히 필드 밖으로 밀린 힌트를 얻을 수 있으며 모든 색상 상태 선택기는 "focused = true"상태를 표시합니다.
A. Rager

9
<TextView
    android:id="@+id/TextView01"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:layout_weight="1"
    android:singleLine="true"
    android:ellipsize="marquee"
    android:marqueeRepeatLimit="marquee_forever"
    android:focusable="true"
    android:focusableInTouchMode="true"
    style="@android:style/Widget.EditText"/>

8

키보드를 열지 않으려는 Manifest파일 에이 코드를 작성하십시오 Activity.

android:windowSoftInputMode="stateHidden"

매니페스트 파일 :

 <?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.projectt"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="8"
        android:targetSdkVersion="24" />

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
         <activity
            android:name=".Splash"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity
            android:name=".Login"
            **android:windowSoftInputMode="stateHidden"**
            android:label="@string/app_name" >
        </activity>

    </application>

</manifest>

2
텍스트 필드에 초점을 맞추지 않고 키보드 만 숨 깁니다. 여전히 필드 밖으로 밀린 힌트를 얻을 수 있으며 모든 색상 상태 선택기는 "focused = true"상태를 표시합니다.
A. Rager

7

에서 onCreate당신의 활동의 단지 사용을 추가 clearFocus()하여 글고 요소에. 예를 들어

edittext = (EditText) findViewById(R.id.edittext);
edittext.clearFocus();

초점을 다른 요소로 바꾸려면 그 요소를 사용하십시오 requestFocus(). 예를 들어

button = (Button) findViewById(R.id.button);
button.requestFocus();

6

다음 코드를 사용하여 버튼을 누를 때 EditText가 포커스를 훔치는 것을 막습니다.

addButton.setOnClickListener(new OnClickListener() {
    public void onClick(View v) {
        View focused = internalWrapper.getFocusedChild();
        focused.setVisibility(GONE);
        v.requestFocus();
        addPanel();
        focused.setVisibility(VISIBLE);
    }
});

기본적으로 편집 텍스트를 숨기고 다시 표시하십시오. 이것은 EditText가 보이지 않기 때문에 나에게 효과적 이므로 표시 여부는 중요하지 않습니다.

그것을 숨기고 연속으로 표시하여 초점을 잃는 데 도움이되는지 확인할 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.