질문자 :Mark
두 가지 요소가 있는 Android Activity
-
EditText
-
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 SomewheresetSelected(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 Sheleglayout
TextView
에서 "focusable" 및 "focusable in touch mode" 를 true 값으로 설정할 수 있습니다. 이런 식으로 활동이 시작될 때 TextView
초점이 맞춰지지만 , 그 특성으로 인해 화면에 초점이 맞춰진 것이 아무것도 표시되지 않으며 물론 키보드도 표시되지 않습니다...
ZeusManifest
에서 저에게 효과적이었습니다. 쓰다 ,
<activity android:name=".MyActivity" android:windowSoftInputMode="stateAlwaysHidden"/>
Babar Sanah프로그래밍 방식으로 모든 분야에서 초점을 제거해야 했습니다. 메인 레이아웃 정의에 다음 두 문장을 추가했습니다.
myLayout.setDescendantFocusability(ViewGroup.FOCUS_BEFORE_DESCENDANTS); myLayout.setFocusableInTouchMode(true);
그게 다야 내 문제를 즉시 해결했습니다. 올바른 방향으로 나를 가르쳐 주셔서 감사합니다, Silver.
jakeneffManifest.xml
파일의 활동 태그에 android:windowSoftInputMode="stateAlwaysHidden"
을 추가합니다.
원천
prgmrDevListView
와 같은 활동에 대한 다른 보기가 있는 경우 다음을 수행할 수도 있습니다.
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 SlateronCreate
메소드에 다음을 추가하십시오.
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 RayonCreate
에서 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