레이아웃을 생성하고 표시 할 때 뷰에 초점을 맞추는 방법은 무엇입니까?


90

현재, Buttona TextViewEditText. 레이아웃이 표시되면 포커스가 자동으로에 놓 EditText이고 키보드가 Android 휴대폰에 표시되도록 트리거합니다. 내가 원하는 것이 아닙니다. TextView레이아웃이 표시 될 때 포커스를 설정 하거나 아무것도 설정 하지 않을 수있는 방법이 있습니까?

답변:


109

포커스 설정 : 프레임 워크는 사용자 입력에 대한 응답으로 이동 포커스를 처리합니다. 특정보기에 초점을 맞추려면 requestFocus ()를 호출하십시오.


17

이것은 작동합니다 :

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

그것은 무엇을합니까? 보기 나 조각뿐 아니라 전체 활동에 대한 일부 상태를 수정하는 것처럼 보이므로 이에 대해주의하고 모든 의미를 이해하지 않는 한 사용하지 않습니다.
Kartick Vaddadi

사실 나는 원래 포스터의 요청에 따라 이것을하지 않을 것입니다. 이렇게하면 현재 문제가 해결 될 수 있지만 나중에 문제를 일으킬 수있는 부작용이 있습니다. 원래의 해킹을 무효화하기 위해 나중에 다른 해킹을 추가하는 코드 기반으로 들어가는 것은 이와 같은 해킹입니다. 악순환이 계속됩니다 .... 사람들은 왜 코드를 유지할 수 없게되는지 궁금해합니다. 네, 짐작 하셨는데요 .... 저는 이런 일을하는 다른 사람들과 일을해서 제 삶을 매우 어렵게 만듭니다.
dell116


6

세트

 android:focusable="true"

당신의 <EditText/>


6

포커스를 설정하려면 핸들러를 사용하여 requestFocus ()를 지연합니다.

private Handler mHandler= new Handler();

public class HelloAndroid extends Activity {
   /** Called when the activity is first created. */
   @Override
   public void onCreate(Bundle savedInstanceState) {
     super.onCreate(savedInstanceState);
     setContentView(R.layout.main);

     LinearLayout mainVw = (LinearLayout) findViewById(R.id.main_layout);

     LinearLayout.LayoutParams params = new LinearLayout.LayoutParams( 
           LinearLayout.LayoutParams.FILL_PARENT,
           LinearLayout.LayoutParams.WRAP_CONTENT);

     EditText edit = new EditText(this);
     edit.setLayoutParams(params);
     mainVw.addView(edit);

     TextView titleTv = new TextView(this);
     titleTv.setText("test");
     titleTv.setLayoutParams(params);
     mainVw.addView(titleTv);

     mHandler.post(
       new Runnable() 
       {
          public void run() 
          {
            titleTv.requestFocus();
          } 
       }
     );
   }
}

5

키보드를 숨기면됩니다. 이 같은:

InputMethodManager inputManager = (InputMethodManager) getSystemService(INPUT_METHOD_SERVICE);
inputManager.hideSoftInputFromWindow(this.getCurrentFocus().getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);


3

이 줄도로 설정하고 컨트롤을 초기화하는 동안이 true로 설정되어 OnResume있는지 확인하십시오.focusableInTouch

<controlName>.requestFocus();

<controlName>.requestFocusFromTouch();

3

포커스를 변경하려면 xml의 textView를 포커스 가능하게 만드십시오.

<TextView
            **android:focusable="true"**
            android:id="@+id/tv_id"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"/>

그리고 자바에서 생성시

textView.requestFocus();

또는 단순히 키보드 숨기기

public void hideKeyBoard(Activity act) {
    act.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN);
    InputMethodManager imm = (InputMethodManager) act.getSystemService(Context.INPUT_METHOD_SERVICE);
}

android : focusable = "true"및 textView.requestFocus (); 나를 위해 일했습니다. 감사!
Werner

2

위의 답변 중 어느 것도 나를 위해 작동하지 않습니다. 유일한 해결책은 포커스를받는 비활성화 된 EditText 에서 첫 번째 TextView 를 변경 한 다음 추가하는 것입니다.

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

에서 에서 onCreate 키보드를 방지하기 위해 콜백 표시합니다. 이제 첫 번째 EditText는 TextView처럼 보이지만 마지막으로 초기 포커스를 얻을 수 있습니다.


2

마지막 제안은 올바른 해결책입니다. 반복하려면 먼저 android:focusable="true"레이아웃 xml파일 에서 설정 한 다음 requestFocus()코드의보기에서 설정합니다.


1

텍스트보기가 초점을 맞출 수 없다고 생각합니다. 예를 들어 버튼에 포커스를 설정하거나 focusable 속성을 true로 설정하십시오.


1

ur xml의 첫 번째 컨트롤로 "0 dip"크기의 편집 텍스트를 추가 할 수 있으므로 렌더링에 초점을 맞출 것입니다.


1

파일 android:windowSoftInputMode의 활동에 추가 하여 시작할 수 있습니다 AndroidManifest.xml.

<activity android:name="YourActivity"
          android:windowSoftInputMode="stateHidden" />

이렇게하면 키보드가 표시되지 않지만 EditText여전히 포커스가 있습니다. 이를 해결하기 위해 루트 뷰에서 android:focusableInTouchmodeandroid:focusable로 설정할 수 true있습니다.

<LinearLayout android:orientation="vertical"
              android:focusable="true"
              android:focusableInTouchMode="true"
              ...
              >
    <EditText
         ...
       />
    <TextView
         ...
       />
    <Button
         ...
       />
</LinearLayout>

위의 코드 RelativeLayout는 대신 포커스를 받고 있는지 확인합니다.EditText


0

포커스는 터치 이외의 것을 사용할 때 (예 : d- 패드, 키보드 등) UI 구성 요소를 선택하는 데 사용됩니다. 모든 뷰는 포커스를받을 수 있지만 일부는 기본적으로 포커스를받을 수 없습니다. (뷰에 setFocusable(true)초점을 맞출 수 있으며 초점을 맞출 수 있습니다.requestFocus() .)

그러나 터치 모드에서는 포커스가 비활성화 된다는 점에 유의해야합니다 . 따라서 손가락을 사용하는 경우 프로그래밍 방식으로 포커스를 변경해도 아무 효과가 없습니다. 이에 대한 예외는 입력 편집기에서 입력을받는 뷰의 경우입니다. An EditText이 그러한 예입니다. 이 특별한 상황 setFocusableInTouchMode(true)에서는 소프트 키보드가 입력을 보낼 위치를 알려주는 데 사용됩니다. An EditText에는 기본적으로이 설정이 있습니다. 소프트 키보드가 자동으로 나타납니다.

소프트 키보드가 자동으로 팝업되지 않도록하려면 @abeljus가 언급 한대로 일시적으로 억제 할 수 있습니다.

InputMethodManager inputManager = (InputMethodManager) getSystemService(INPUT_METHOD_SERVICE);
inputManager.hideSoftInputFromWindow(this.getCurrentFocus().getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);

사용자가를 클릭 EditText해도 키보드가 계속 표시되어야합니다.

추가 읽기 :


이 대답이 틀렸습니까? 반대표에 댓글이 남지 않았습니다.
Suragch
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.