시작 활동시 자동 팝업 키보드


97

비교적 간단한 질문이 있습니다. EditText가 많은 활동이 있습니다. 활동을 열면 자동으로 첫 번째 EditText에 초점을 맞추고 가상 키보드를 표시합니다.

어떻게 방지 할 수 있습니까?


이 질문에 대한 내 대답을 확인하십시오. stackoverflow.com/questions/39593324/…
Android Help

내 앱이 실행 (열기)이고 편집 텍스트보기가 사용 가능할 때 키보드가 자동 (표시) 활성화됩니다. 어떻게 유일한 방법이 문제는 여기를 클릭 easycomacademy.com/...
AhmadUllah 아마드

답변:


209

XML 파일의 레이아웃 태그에 다음 속성을 사용하십시오.

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

댓글에서 다른 회원이보고 한대로 작동하지 않으므로 ScrollView이러한 속성을의 기본 하위 항목에 추가해야합니다 ScrollView.


3
이것은 내 문제도 해결했습니다. 내 활동의 RelativeLayout 태그에 이것을 추가했습니다. 감사합니다!
Luke

21
흥미롭게도 위의 내용을 ScrollView에 추가했을 때는 작동하지 않았지만 LinearLayout에서는 작동했습니다
Jerry Brady

1
난 당신이 맨 위의 레이아웃에 넣어 생각
Utsav 굽타

레이아웃 자체에 초점을 맞출 수 있다고 말하고 있기 때문에 이것이 작동한다고 생각합니까? 그렇지 않으면 폼의 첫 번째 컨트롤에 포커스를 주어야한다고 가정합니까? 이상하게도 내 양식의 모든 컨트롤이 비활성화 된 경우에도 키보드를 사용할 수있었습니다. 지금 수정되었습니다. 감사합니다!
crowmagnumb

1
이 솔루션은 접근성 문제 (초점을 가지고있는 것으로 표시되어 초점을 맞출 수없는 뷰)를 만들고 의도하지 않은 결과를 초래할 수 있다는 점에 유의하는 것이 중요합니다.
Renato

96

이를 Android Manifest 활동에 추가 할 수 있습니다.

android:windowSoftInputMode="stateHidden|adjustResize"

이것은 작동하지만 이미지 배경이 있고 소프트 키보드가 이러한 이미지 배경을 축소하는 것이 걱정된다면 다음을 사용하십시오.android:windowSoftInputMode="stateHidden|adjustPan"
ArtiomLK

31

여기에 몇 가지 구현이 설명되어 있지만 이제 속성에 AndroidManifest.xml대해에 추가 Activity했습니다.

android:windowSoftInputMode="stateAlwaysHidden"

을 사용하더라도 이것이 쉬운 방법이라고 생각합니다 fragments.

" stateAlwaysHidden "활동의 기본 창에 입력 포커스가있을 때 소프트 키보드는 항상 숨겨집니다.


이것은 ScrollView와 RelativeLayout 모두에서 저에게 효과적이었습니다.
iversoncru

"숨겨진 상태"를 모든 프래그먼트를 포함 할 활동과 연결하기 때문에 프래그먼트에는 그다지 좋지 않습니다. 즉, 활동에 표시하려는 모든 프래그먼트가 속성의 영향을받습니다 ( "조각 당 " 기초).
Pelpotronic 2015

11

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

ListView.requestFocus(); 

onResume ()에서 editText.

이 질문에 대한 답변이 있지만 나를 위해 일한 대체 솔루션을 제공한다는 것을 알고 있습니다. :)


5

https://stackoverflow.com/a/11627976/5217837 거의 맞습니다.

@Override
public void onCreate(Bundle savedInstanceState) {

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

}

그러나 SOFT_INPUT_STATE_ALWAYS_VISIBLE이 아니라 SOFT_INPUT_STATE_HIDDEN이어야합니다.


4

활동 코드에서 다음을 사용하십시오.

@Override
public void onCreate(Bundle savedInstanceState) {

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

}

이것은 나를 위해 작동하지 않았습니다. 활동을 시작할 때 키보드가 여전히 팝업되었습니다.
David Doria

이 링크를 확인할 수 있습니다. 작동합니다 : stackoverflow.com/questions/18977187/…
Sujeet Kumar Gupta

3

태블릿에서 Android 3.2.1을 사용하면 탭을 전환 할 때도 키보드가 자동으로 표시되고 계속 표시되는 유사한 문제가 발생했습니다. 다음 방법을 사용하십시오.

public void setEditTextFocus(EditText searchEditText, boolean isFocused)
{
    searchEditText.setCursorVisible(isFocused);
    searchEditText.setFocusable(isFocused);
    searchEditText.setFocusableInTouchMode(isFocused);
    if (isFocused) {
        searchEditText.requestFocus();
    } else {
        InputMethodManager inputManager = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); 
        inputManager.hideSoftInputFromWindow(searchEditText.getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS );
    }
}   

각 EditText에 대한 활동의 ​​onCreate () 및 onPause ()에서 :

setEditTextFocus (myEditText, false);

각 EditText에 대해 OnTouchListener :

    myEditText.setOnTouchListener(new EditText.OnTouchListener() {
        @Override
        public boolean onTouch(View v, MotionEvent event) {
            setEditTextFocus(myEditText, true); 
            return false;
        }
    });

의 각각 EditText에 대해 OnEditorActionListener:

    myEditText.setOnEditorActionListener(new EditText.OnEditorActionListener() {
        @Override
        public boolean onEditorAction(TextView arg0, int arg1, KeyEvent arg2) {
                            .......
            setEditTextFocus(myEditText, false); 
            return false;
        }
    });

그리고 각각 EditText에 대해 layout xml:

            android:imeOptions="actionDone"
            android:inputType="numberDecimal|numberSigned" // Or something else

아마도 더 많은 코드 최적화가 가능할 것입니다.


3
((InputMethodManager)getActivity().getSystemService("input_method")).hideSoftInputFromWindow(this.edittxt.getWindowToken(), 0);

조각을 사용하여 ..이 코드는 키보드를 숨기는 데 작동합니다 ... 조각이 열리면 edittext 필드 키보드에 초점을 맞추지 마십시오 ...
Sreelal S

2

이 간단한 솔루션을 찾았습니다. 부모 레이아웃에서 다음 속성을 설정하십시오.

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

그것이 당신을 위해 작동하기를 바랍니다.


1

이것이 제가 사용하고있는 솔루션입니다. 최상의 솔루션은 아니지만 저에게 잘 맞습니다.

 editComment.setFocusableInTouchMode(false);
 editComment.setOnTouchListener(new OnTouchListener(){

                @Override
                public boolean onTouch(View v, MotionEvent event)
                {
                    // TODO Auto-generated method stub
                    editComment.setFocusableInTouchMode(true);
                     editComment.requestFocus() ;
                    return false;
                }});

1

흥미롭게도이 문서 https://developer.android.com/training/keyboard-input/visibility.html 은 활동이 시작되고 텍스트 필드에 포커스가 주어지면 소프트 키보드가 표시되지 않는다고 설명합니다. 일부 코드로 원하는 경우 키보드를 표시하는 방법을 보여줍니다.)

내 Samsung Galaxy S5에서 이것은 내 앱 (매니페스트 항목이나 특정 코드 없음)이 작동하는 방식이며 소프트 키보드도 없습니다. 그러나 Lollipop AVD에서는 위에 제공된 문서에 위배되는 소프트 키보드가 표시됩니다.

AVD에서 테스트 할 때이 동작이 발생하면 실제 장치에서 테스트하여 어떤 일이 발생하는지 확인할 수 있습니다.


1

이것은 다음 게시물에서 몇 가지 좋은 답변이 있습니다 . 활동 시작에서 EditText에 초점을 맞추지 못하도록 합니다. 내가 정기적으로 사용하는 것은 Morgan 의 다음 코드입니다 .

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

참고 : 더미 항목은 초점을 맞출 수있는 요소 바로 앞에 배치되어야합니다.

그리고 ScrollView에서도 완벽하게 작동해야한다고 생각하며 이것에 대한 접근성 문제도 없었습니다.


0

이것은 활동이 시작될 때 EditText가 자동으로 Focus를 얻을 때 발생합니다. 따라서이 문제를 해결하는 쉽고 안정적인 방법 중 하나는 초기 포커스를 Button 등과 같은 다른 뷰로 설정하는 것입니다.

레이아웃 XML에서이 작업을 수행 할 수 있으며 코드가 필요하지 않습니다.


0

수락 된 답변이 저에게 효과가 없습니다. 그래서 답변을 제공하는 것이 도움이 될 수 있습니다!

EditText edt = (EditText) findViewById(R.id.edt);
edt.requestFocus();    
edt.dispatchTouchEvent(MotionEvent.obtain(SystemClock.uptimeMillis(), SystemClock.uptimeMillis(), MotionEvent.ACTION_DOWN , 0, 0, 0));
edt.dispatchTouchEvent(MotionEvent.obtain(SystemClock.uptimeMillis(), SystemClock.uptimeMillis(), MotionEvent.ACTION_UP , 0, 0, 0));

이제 키보드가 열려 있습니다. :)


문제는 키보드가 열리는 것을 방지 하는 방법이었습니다 .
jk7


0

활동 XML 상단에 아래 코드를 추가하고보기가 EditText 위에 있는지 확인합니다.

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

0

android:focusableInTouchMode="true"

위의 줄을 xml EditText또는 TextInputLayout포커스가 있고softInputKeyboard 팝업을 .

이것은 우리의 문제를 해결했으며 이제 키보드가 팝업되지 않습니다.


0

search_edit_text = (EditText) findViewById (R.id.search_edit_text);

    search_edit_text.requestFocus();
    search_edit_text.dispatchTouchEvent(MotionEvent.obtain(SystemClock.uptimeMillis(), SystemClock.uptimeMillis(), MotionEvent.ACTION_DOWN , 0, 0, 0));
    search_edit_text.dispatchTouchEvent(MotionEvent.obtain(SystemClock.uptimeMillis(), SystemClock.uptimeMillis(), MotionEvent.ACTION_UP , 0, 0, 0));

이것은 나를 위해 작동합니다 조각은 약간 다른 구문을 가질 수 있습니다. 이것은 활동을 위해 작동합니다


답변에 제한, 가정 또는 단순화를 제공해야합니다. 답변 방법에 대한 자세한 내용은 다음 링크를 참조하십시오. stackoverflow.com/help/how-to-answer
Usama Abdulrehman

-1

보기에 EditText 및 Listview가있는 경우 키보드가 기본적으로 열립니다. 기본적으로 키보드 팝업을 숨기려면 다음을 수행하십시오.

this.listView.requestFocus();

editText에 대한보기를 가져온 후 목록보기에 초점을 요청하고 있는지 확인하십시오.

예를 들어

this.listView = (ListView) this.findViewById(R.id.list);
this.editTextSearch = (EditText) this.findViewById(R.id.editTextSearch);
this.listView.requestFocus();

그렇게하면 editText가 포커스를 받고 키보드가 나타납니다.


나는 이것을했지만 키보드는 여전히 튀어 나오고 포커스는 editText에 있습니다.
David Doria 2013 년
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.