programing

단일 editText에서 포커스를 제거하는 방법

yoursource 2021. 1. 17. 12:26
반응형

단일 editText에서 포커스를 제거하는 방법


내 응용 프로그램 EditText에는 일부 TextViews, 버튼 및 스피너와 함께 단일이 있습니다 . 내 EditText는이 활동에서 유일한 포커스 가능한 뷰이기 때문에 포커스를받습니다. EditText필드에 주황색 테두리와 커서가있는 쇼.

이제이 필드에서 포커스를 제거하고 싶습니다 (커서와 테두리가 표시되지 않도록하겠습니다). 이를 수행하는 방법이 있습니까?

button.seFocusableInTouchMode()을 수행하여 버튼에 집중할 수있었습니다 button.requestFocus(). 그러나 이것은 버튼을 강조하고 분명히 내가 원하는 것이 아닙니다.


이 질문과 선택한 답변을 확인 하십시오. EditText가 활동 시작시 초점을 맞추지 못하도록 중지 추악하지만 작동하며 더 나은 해결책이 없다는 것을 알고 있습니다.


오래된 재화를 사용하려고 했습니까 View.clearFocus()


android .. 새로운 시도

getWindow().getDecorView().clearFocus();

그것은 나를 위해 작동합니다 ..

.. 추가하려면 레이아웃에 다음이 있어야합니다.

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

좀 더 자세한 내용과 이해를 바탕으로 EditText보기에서 포커스 (깜박이는 커서)를 제거하는 방법을 설명하려고합니다. 일반적으로이 코드 줄은 작동합니다.

editText.clearFocus()

그러나 editText에 여전히 포커스가있는 상황 일 수 있으며 clearFocus () 메서드가 활동 / 단편 레이아웃의 포커스 가능한 첫 번째 보기로 포커스를 다시 설정하려고하기 때문에 이런 일이 발생 합니다.

따라서 액티비티에 포커스가있는 뷰가 하나만 있고 일반적으로 EditText 뷰가되는 경우 clearFocus ()는 해당 뷰에 포커스를 다시 설정하고 clearFocus ()가 작동하지 않는 것처럼 보입니다. EditText 뷰는 기본적으로 포커스 가능 (true)이므로 레이아웃 내에 EditText 뷰가 하나만있는 경우 화면에 포커스가 맞춰집니다. 이 경우 솔루션은 레이아웃 파일 내에서 상위 뷰 (일부 레이아웃, 예 : LinearLayout, Framelayout)를 찾아이 xml 코드로 설정하는 것입니다.

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

그 후 editText.clearFocus ()를 실행하면 레이아웃 내부의 상위 뷰가 포커스를 받아들이고 editText가 포커스를 벗어납니다.

누군가가 clearFocus ()가 어떻게 작동하는지 이해하는 데 도움이되기를 바랍니다.


나는 너무 늦었지만 누군가를 위해 당신이 찾고있는 것과 같은 필요 editText.setFocusable (false) si가 필요합니다.


첨부 된 코드를 사용하여 "다른 사람"에게 포커스를 제공합니다. 키보드를 해제하고 포커스를 해제하려는 뷰가있는 경우에는 괜찮습니다. 누가 가져 오는지는 신경 쓰지 않습니다.

다음과 같이 사용하십시오. FocusHelper.releaseFocus (viewToReleaseFocusFrom)

public class FocusHelper {
    public static void releaseFocus(View view) {
        ViewParent parent = view.getParent();
        ViewGroup group = null;
        View child = null;
        while (parent != null) {
            if (parent instanceof ViewGroup) {
                group = (ViewGroup) parent;
                for (int i = 0; i < group.getChildCount(); i++) {
                    child = group.getChildAt(i);
                    if(child != view && child.isFocusable())
                        child.requestFocus();
                }
            }
            parent = parent.getParent();
        }
    }
}

Doc : 메서드는 자식보기에서보기 트리 위로 이동하여 포커스를 줄 첫 번째 자식을 찾습니다.

편집 : API를 사용할 수도 있습니다.

View focusableView = v.focusSearch(View.FOCUS_DOWN);
if(focusableView != null) focusableView.requestFocus();

활동이 시작된 이후로 초점을 맞춘 editText와 비슷한 문제가 발생했습니다. 이 문제는 다음과 같이 쉽게 수정되었습니다.

xml의 ​​editText가 포함 된 레이아웃에이 코드를 추가합니다.

    android:id="@+id/linearlayout" 
    android:focusableInTouchMode="true"

잊지 마세요 android:id, 그것 없이는 오류가 있습니다.

내가 editText에서 가진 또 다른 문제는 첫 번째 초점을 얻으면 초점이 사라지지 않는다는 것입니다. 이것은 Java의 코드 조각이며 editText와 editText의 텍스트를 캡처하는 버튼이 있습니다.

    editText=(EditText) findViewById(R.id.et1);
    tvhome= (TextView)findViewById(R.id.tv_home);
    etBtn= (Button) findViewById(R.id.btn_homeadd);
    etBtn.setOnClickListener(new View.OnClickListener() 
    {   
        @Override
        public void onClick(View v)
        {
            tvhome.setText( editText.getText().toString() );

            //** this code is for hiding the keyboard after pressing the button
            View view = Settings.this.getCurrentFocus();
            if (view != null) 
            {  
                InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
                imm.hideSoftInputFromWindow(view.getWindowToken(), 0);
            }
            //**

            editText.getText().clear();//clears the text
            editText.setFocusable(false);//disables the focus of the editText 
            Log.i("onCreate().Button.onClickListener()", "et.isfocused= "+editText.isFocused());
        }
    });
    editText.setOnClickListener(new View.OnClickListener() 
    {
        @Override
        public void onClick(View v) 
        {
            if(v.getId() == R.id.et1)
            {
                v.setFocusableInTouchMode(true);// when the editText is clicked it will gain focus again

                //** this code is for enabling the keyboard at the first click on the editText
                if(v.isFocused())//the code is optional, because at the second click the keyboard shows by itself
                {
                    InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
                    imm.showSoftInput(v, InputMethodManager.SHOW_IMPLICIT);
                }
                //**

                Log.i("onCreate().EditText.onClickListener()", "et.isfocused= "+v.isFocused());
            }
            else
                Log.i("onCreate().EditText.onClickListener()", "the listener did'nt consume the event");
        }
    });

여러분 중 일부에게 도움이되기를 바랍니다!


다른 뷰를 찾아서 초점을 맞추십시오.

var refresher = FindViewById<MvxSwipeRefreshLayout>(Resource.Id.refresher);

refresher.RequestFocus();

Edittext부모 레이아웃이 Linear추가 되면

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

아래와 같이

    <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="vertical"
            android:focusable="true"
            android:focusableInTouchMode="true">

           <EditText/>
          ............

Edittext 부모 레이아웃이 Relative이면

  android:descendantFocusability="beforeDescendants"
  android:focusableInTouchMode="true"

처럼

  <RelativeLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:descendantFocusability="beforeDescendants"
            android:focusableInTouchMode="true">

           <EditText/>
          ............

편집 텍스트의 초점을 맞추기 위해 많은 노력을 기울였습니다. clearfocus () 및 focusable 및 다른 것들은 결코 저에게 효과가 없었습니다. 그래서 가짜 편집 텍스트에 초점을 맞추는 아이디어를 생각해 냈습니다.

<LinearLayout
    ...
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <LinearLayout
        ...
        android:layout_width="match_parent"
        android:layout_height="match_parent">

    <!--here comes your stuff-->

    </LinearLayout>

    <EditText
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/fake"
        android:textSize="1sp"/>

</LinearLayout>

그런 다음 Java 코드에서 :

View view = Activity.this.getCurrentFocus();
                    if (view != null) {
                        InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
                        imm.hideSoftInputFromWindow(view.getWindowToken(), 0);
                        fake.requestFocus();
                    }

키보드를 숨기고 해당 편집 텍스트의 포커스를 제거합니다. 또한 보시다시피 가짜 편집 텍스트가 화면에서 나오고 볼 수 없습니다.


이 줄만 포함

android:selectAllOnFocus="false"

EditText 레이아웃에 해당하는 XML 세그먼트에서.


You just have to clear the focus from the view as

EditText.clearFocus()

If I understand your question correctly, this should help you:

TextView tv1 = (TextView) findViewById(R.id.tv1);
tv1 .setFocusable(false);

Since I was in a widget and not in an activity I did:

`getRootView().clearFocus();


<EditText android:layout_height="wrap_content" android:background="@android:color/transparent" android:layout_width="match_parent" 
    android:clickable="false"
     android:focusable="false"
     android:textSize="40dp"
     android:textAlignment="center" 
    android:textStyle="bold"  
    android:textAppearance="@style/Base.Theme.AppCompat.Light.DarkActionBar" 
   android:text="AVIATORS"/>

You only have to set the ViewGroup with the attribute:

android:focusableInTouchMode="true"

The ViewGroup is the layout that includes every child view.

ReferenceURL : https://stackoverflow.com/questions/3890033/how-to-remove-focus-from-single-edittext

반응형