source

레이아웃을 만들고 표시할 때 뷰에 포커스를 설정하는 방법은 무엇입니까?

factcode 2022. 10. 13. 23:35
반응형

레이아웃을 만들고 표시할 때 뷰에 포커스를 설정하는 방법은 무엇입니까?

현재, 저는 다음 레이아웃을 가지고 있습니다.Button,aTextView그리고EditText레이아웃이 표시되면 포커스가 자동으로 배치됩니다.EditText그러면 키보드가 Android 폰에 표시됩니다.그것은 내가 원하는 것이 아니다.제가 초점을 맞출 수 있는 방법이 있을까요?TextView또는 레이아웃이 표시될 때 아무것도 표시되지 않습니다.

포커스 설정:프레임워크는 사용자의 입력에 따라 이동 포커스를 처리합니다.특정 뷰에 포커스를 강제로 표시하려면 requestFocus()를 호출합니다.

이 방법은 다음과 같습니다.

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

다음을 추가해야 합니다.

android:focusableInTouchMode="true"

세트

 android:focusable="true"

당신의 안에서<EditText/>

포커스를 설정하려면 핸들러를 사용하여 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();
          } 
       }
     );
   }
}

키보드를 숨겨도 돼요.다음과 같은 경우:

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

해라

comp.requestFocusInWindow();

다음 행 설정OnResume또한 만약을 위해focusableInTouch컨트롤을 초기화하는 동안 true로 설정됩니다.

<controlName>.requestFocus();

<controlName>.requestFocusFromTouch();

포커스를 변경하려면 xml의 텍스트뷰를 포커스로 설정합니다.

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

java로 작성 시

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

위의 답변 중 어느 것도 나에게는 통하지 않는다.유일한 (예를 들어) 솔루션은 포커스를 수신하는 비활성화된 EditText의 첫 번째 TextView를 변경한 후 추가하는 것입니다.

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

[ Create Callback ]에서 키보드가 표시되지 않도록 합니다.첫 번째 EditText는 TextView와 비슷하지만 첫 번째 포커스를 얻을 수 있습니다.

마지막 제안은 올바른 해결책입니다.다시 한 번 말하지만, 첫 번째 세트android:focusable="true"레이아웃으로xml파일, 그 후requestFocus()코드의 뷰에 표시됩니다.

텍스트 뷰는 초점이 안 맞는 것 같아요.예를 들어 버튼에 포커스를 설정하거나 포커스가 있는 속성을 true로 설정합니다.

사이즈가 0 dip인 편집 텍스트를 ur xml의 첫 번째 컨트롤로 추가하면 렌더링에 초점을 맞출 수 있습니다.(포커스가 가능하고 모두...)

를 추가하는 것으로 시작할 수 있습니다.android:windowSoftInputMode에 있어서의 당신의 활동에 대해서AndroidManifest.xml파일.

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

그러면 키보드는 표시되지 않지만EditText아직 초점이야.이 문제를 해결하려면android:focusableInTouchmode그리고.android:focusable로.true루트 뷰에 표시됩니다.

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

위의 코드를 통해 다음 사항을 확인할 수 있습니다.RelativeLayout집중을 하고 있다EditText

초점은 터치 이외의 것(d패드, 키보드 등)을 사용할 때 UI 컴포넌트를 선택하는 것입니다.모든 뷰는 포커스를 수신할 수 있지만 일부 뷰는 기본적으로 포커스가 맞지 않습니다.setFocusable(true) 돼요.requestFocus()

다만, 터치 모드일 때는, 포커스가 무효가 되는 에 주의해 주세요.따라서 손가락을 사용하고 있다면, 프로그램적으로 초점을 바꾸는 것은 아무 것도 하지 않습니다.입력 편집기에서 입력을 수신하는 보기는 예외입니다.EditText 상황에 대해서는setFocusableInTouchMode(true)소프트 키보드가 입력의 송신지를 통지하기 위해서 사용합니다.EditText에는 기본적으로 이 설정이 있습니다.소프트 키보드가 자동적으로 팝업 됩니다.

소프트 키보드가 자동적으로 표시되지 않게 하려면 , @abeljus가 지적한 대로 일시적으로 억제할 수 있습니다.

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

가 [ ]를했을 때EditText키보드는

추가 정보:

추가할 수 있습니다.

       android:importantForAccessibility="yes"
       android:focusable="true"
       android:focusableInTouchMode="true"

[ Layout ](레이아웃)으로 이동하여 Talkback/Accessibility를 강제로 실행합니다.

실제로 필요한 것은 첫 번째 행뿐이지만, 다른 행은 OS에 중점을 두고 있는 내용을 보강합니다.

다음 Kotlin 확장자를 사용할 수 있습니다.

fun View.focusAndShowKeyboard() {
  /**
   * This is to be called when the window already has focus.
   */
  fun View.showTheKeyboardNow() {
    if (isFocused) {
      post {
        // We still post the call, just in case we are being notified of the windows focus
        // but InputMethodManager didn't get properly setup yet.
        val imm = context.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
        imm.showSoftInput(this, InputMethodManager.SHOW_IMPLICIT)
      }
    }
  }

  requestFocus()

  if (hasWindowFocus()) {
    // No need to wait for the window to get focus.
    showTheKeyboardNow()
  } else {
    // We need to wait until the window gets focus.
    viewTreeObserver.addOnWindowFocusChangeListener(
      object : ViewTreeObserver.OnWindowFocusChangeListener {
        override fun onWindowFocusChanged(hasFocus: Boolean) {
          // This notification will arrive just before the InputMethodManager gets set up.
          if (hasFocus) {
            this@focusAndShowKeyboard.showTheKeyboardNow()
            // It’s very important to remove this listener once we are done.
            viewTreeObserver.removeOnWindowFocusChangeListener(this)
          }
        }
      }
    )
  }
}

그냥 하세요.view.focusAndShowKeyboard()override fun onViewCreated(..) ★★★★★★★★★★★★★★★★★」override fun OnCreate(..)

PS: 보기를 숨기려면 다음 확장자를 사용합니다.

fun View.hideKeyboard() {
  val imm = context.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
  imm.hideSoftInputFromWindow(windowToken, 0)
}

다음 Android XML 속성을 사용하여 프로그래밍 방식으로도 뷰에 초점을 맞출 수 있는지 확인하십시오.

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

언급URL : https://stackoverflow.com/questions/2150656/how-to-set-focus-on-a-view-when-a-layout-is-created-and-displayed

반응형