etc./StackOverFlow

Android에서 활동 시작 시 EditText가 포커스를 얻지 못하도록 하는 방법

청렴결백한 만능 재주꾼 2021. 10. 26. 04:49
반응형

질문자 :Mark


두 가지 요소가 있는 Android Activity

  1. EditText
  2. ListView

Activity 시작되면 EditText 즉시 입력 포커스가 있습니다(커서 깜박임). 시작할 때 컨트롤에 입력 포커스가 있는 것을 원하지 않습니다. 나는 시도했다:

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

불운. Activity 가 시작될 EditText 가 스스로를 선택하지 않도록 어떻게 설득할 수 있습니까?



Luc와 Mark의 훌륭한 답변. 그러나 좋은 코드 샘플이 없습니다. 다음 예제와 같이 부모 레이아웃(예: LinearLayout 또는 ConstraintLayout android:focusableInTouchMode="true"android:focusable="true" 태그를 추가하면 문제가 해결됩니다.

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

Morgan Christiansson

초점을 전혀 두지 않으려는 것이 실제 문제입니까? EditText 에 초점을 맞춘 결과 가상 키보드를 표시하고 싶지 않습니까? EditText 가 시작에 초점을 맞추는 데 문제가 있는 것은 아니지만 사용자가 명시적으로 EditText 에 초점을 맞추도록 요청하지 않았을 때 softInput 창을 여는 것은 확실히 문제입니다(결과적으로 키보드 열기) .

가상 키보드의 문제라면 AndroidManifest.xml <activity> 요소 문서를 참고하세요.

android:windowSoftInputMode="stateHidden" - 활동에 들어갈 때 항상 숨깁니다.

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


Joe

더 간단한 솔루션이 있습니다. 상위 레이아웃에서 다음 속성을 설정합니다.

 <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();

Guillaume Perrot의 좋은 의견 :

android:descendantFocusability="beforeDescendants" 가 기본값인 것 같습니다(정수 값은 0). android:focusableInTouchMode="true" 를 추가하기만 하면 작동합니다.

ViewGroup.initViewGroup() 메서드(Android 2.2.2) beforeDescendants 가 기본값으로 설정되어 있는 것을 볼 수 있습니다. 그러나 0과 같지 않습니다 ViewGroup.FOCUS_BEFORE_DESCENDANTS = 0x20000;

기욤 덕분에.


Silver

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

  • LinearLayout 생성(다른 종류의 레이아웃이 작동하는지 모르겠습니다)
  • android:focusable="true"android:focusableInTouchMode="true" 속성 설정

그리고 EditText 는 활동을 시작한 후 포커스를 얻지 못합니다.


Luc

레이아웃 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>

floydaddict

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

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

Someone Somewhere

setSelected(false) 대신 clearFocus() 를 시도하십시오. Android의 모든 뷰는 포커스 가능성과 선택 가능성을 모두 가지고 있으며 포커스를 그냥 지우고 싶다고 생각합니다.


Eric Mill

다음은 편집 텍스트가 생성될 때 포커스를 받는 것을 중지하지만 터치할 때 잡습니다.

 <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; } });

이벤트를 소비하지 않는 false를 반환하기 때문에 포커싱 동작은 정상적으로 진행됩니다.


MinceMan

여러 답변을 개별적으로 시도했지만 초점은 여전히 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 />

에디트텍스트에서

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


Lee Yi Hong

늦었지만 가장 간단한 대답은 XML의 부모 레이아웃에 추가하면 됩니다.

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

도움이 되셨다면 좋아요! 행복한 코딩 :)


Rishabh Saxena

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

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

rallat

간단한 솔루션: AndroidManifest 에서 Activity 태그 사용

 android:windowSoftInputMode="stateAlwaysHidden"

Sergey Sheleg

layout TextView 에서 "focusable""focusable in touch mode" 를 true 값으로 설정할 수 있습니다. 이런 식으로 활동이 시작될 때 TextView 초점이 맞춰지지만 , 그 특성으로 인해 화면에 초점이 맞춰진 것이 아무것도 표시되지 않으며 물론 키보드도 표시되지 않습니다...


Zeus

Manifest 에서 저에게 효과적이었습니다. 쓰다 ,

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

Babar Sanah

프로그래밍 방식으로 모든 분야에서 초점을 제거해야 했습니다. 메인 레이아웃 정의에 다음 두 문장을 추가했습니다.

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

그게 다야 내 문제를 즉시 해결했습니다. 올바른 방향으로 나를 가르쳐 주셔서 감사합니다, Silver.


jakeneff

Manifest.xml 파일의 활동 태그에 android:windowSoftInputMode="stateAlwaysHidden" 을 추가합니다.

원천


prgmrDev

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

 ListView.requestFocus();

onResume() editText 에서 포커스를 잡습니다.

이 질문에 대한 답변을 받았지만 저에게 적합한 대안 솔루션을 제공한다는 것을 알고 있습니다. :)


Sid

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

 <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();

Jack Slater

onCreate 메소드에 다음을 추가하십시오.

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

Vishal Raj

기능과 관련된 것으로 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; }

Takhion

부모 레이아웃에 이 줄을 작성하십시오...

 android:focusableInTouchMode="true"

Vishal Vaishnav

늦었지만 도움이 될 수 있습니다. 레이아웃 상단에 더미 EditText를 만든 다음 onCreate() 에서 myDummyEditText.requestFocus()

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

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


Jim

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

 <LinearLayout 'dummy'> <EditText et> dummy.setNextFocusDownId(et.getId()); dummy.setNextFocusUpId(et.getId()); et.setNextFocusUpId(et.getId());

보기에 대한 초점을 없애기 위해 많은 작업..

감사 해요


mark

나를 위해 모든 장치에서 작동한 것은 다음과 같습니다.

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

문제가 있는 초점 보기 앞에 이것을 보기로 지정하면 됩니다.


android developer

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

atul

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

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

이렇게 하면 소프트 키보드가 표시되지 않고 EditText에 커서가 깜박이지 않았습니다.


Lumis

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

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

user4728480

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

 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>

Tarit Ray

onCreate 에서 EditText 요소에 clearFocus() 를 추가하기만 하면 됩니다. 예를 들어,

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

포커스를 다른 요소로 돌리려면 해당 요소에 requestFocus() 를 사용하십시오. 예를 들어,

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

Compaq LE2202x

키보드를 숨기는 가장 쉬운 방법은 setSoftInputMode를 사용하는 것입니다.

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

또는 InputMethodManager를 사용하고 이와 같이 키보드를 숨길 수 있습니다.

 InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); imm.hideSoftInputFromWindow(myEditText.getWindowToken(), 0);

Sharath kumar

출처 : http:www.stackoverflow.com/questions/1555109/how-to-stop-edittext-from-gaining-focus-at-activity-startup-in-android

반응형