IT story

다른 컨트롤에 포커스를 설정하지 않고 포커스를 제거하는 방법은 무엇입니까?

hot-time 2020. 9. 10. 18:58
반응형

다른 컨트롤에 포커스를 설정하지 않고 포커스를 제거하는 방법은 무엇입니까?


UI가 직관적 인 것이 좋습니다. 각 화면은 자연스럽게 앱의 다음 단계로 사용자를 안내해야합니다. 그것을 제외하고는 가능한 한 혼란스럽고 혼란스럽게 만들기 위해 노력합니다.

농담이야 :-)

나는 TableRow각각 읽기 전용이고 초점을 맞출 수없는 EditText 컨트롤을 포함하고 오른쪽에 버튼이있는 세 개의를 가지고 있습니다. 각 버튼은 동일한 활동을 시작하지만 다른 인수를 사용합니다. 사용자가 거기에서 선택하고 하위 활동이 완료 EditText되어 사용자의 선택으로 해당 항목이 채워집니다.

이것은 고전적인 계단식 값 메커니즘입니다. 각 선택은 다음 선택 등에 대해 사용 가능한 옵션을 좁 힙니다. 따라서 현재 행의 EditText에 값이 포함될 때까지 다음 행 각각에서 두 컨트롤을 모두 비활성화합니다.

이 선호도 순서로 두 가지 중 하나를 수행해야합니다.

  1. 버튼을 클릭하면 다른 버튼에 포커스를 설정하지 않고 즉시 포커스를 제거합니다.
  2. 활동이 시작될 때 첫 번째 버튼에 초점 설정

문제는 하위 활동이 반환 된 후에 나타납니다. 클릭 한 버튼은 포커스를 유지합니다.

Re : 위의 # 1- removeFocus()방법이나 비슷한 것이없는 것 같습니다.

다시 : # 2 위- requestFocus()다음 행의 버튼에 포커스를 설정하는 데 사용할 수 있으며 하위 활동이 반환 된 후에 작동하지만 어떤 이유로 부모 활동의 onCreate().

어느 방향 으로든 UI 일관성이 필요합니다. 하위 활동이 완료된 후 버튼에 포커스가 없거나 각 버튼은 선택 전의 첫 번째 (유일한) 활성 버튼을 포함하여 논리 흐름의 위치에 따라 포커스를받습니다.


clearFocus () 사용은 당신이 찾은 것처럼 (다른 답변에 대한 주석에서 본) 나에게도 효과가 없었지만 결국 나를 위해 일한 것은 다음과 같습니다.

<LinearLayout 
    android:id="@+id/my_layout" 
    android:focusable="true" 
    android:focusableInTouchMode="true" ...>

내 최상위 레이아웃보기 (선형 레이아웃)에. 모든 Buttons / EditTexts 등에서 포커스를 제거하려면 다음을 수행하십시오.

LinearLayout myLayout = (LinearLayout) activity.findViewById(R.id.my_layout);
myLayout.requestFocus();

초점을 맞출 수 있도록 뷰를 설정하지 않는 한 초점을 요청하는 것은 아무것도하지 않았습니다.


오래된 질문이지만 비슷한 문제가 생겼을 때 내가 한 일을 공유 할 것이라고 생각했습니다.

초점을 맞춘 관점은 매번 달라서 매우 일반적인 것을 사용했습니다.

View current = getCurrentFocus();
if (current != null) current.clearFocus();

  1. 사용할 수 있습니다 View.clearFocus().

  2. View.requestFocus()에서 호출 된 사용 onResume().


<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
          xmlns:app="http://schemas.android.com/apk/res-auto"
          android:id="@+id/ll_root_view"
          android:layout_width="match_parent"
          android:layout_height="match_parent"
          android:orientation="vertical">

LinearLayout llRootView = findViewBindId(R.id.ll_root_view);
llRootView.clearFocus();

이미 프로필 정보 업데이트를 완료하고 레이아웃의 EditText에서 모든 포커스를 제거 할 때 이것을 사용합니다.

====> 업데이트 : 상위 레이아웃 콘텐츠에서 내 EditText 추가 줄 :

android:focusableInTouchMode="true"

android:descendantFocusability="beforeDescendants"

아래의 일부 레이아웃 옵션과 함께 활동에서 다음을 사용하면 원하는대로 작동하는 것 같습니다.

 getWindow().getDecorView().findViewById(android.R.id.content).clearFocus();

루트보기에서 다음 매개 변수와 관련하여.

<?xml
    android:focusable="true"
    android:focusableInTouchMode="true"
    android:descendantFocusability="beforeDescendants" />

https://developer.android.com/reference/android/view/ViewGroup#attr_android:descendantFocusability

답변 : https://forums.xamarin.com/discussion/1856/how-to-disable-auto-focus-on-edit-text

windowSoftInputMode 정보

There's yet another point of contention to be aware of. By default, Android will automatically assign initial focus to the first EditText or focusable control in your Activity. It naturally follows that the InputMethod (typically the soft keyboard) will respond to the focus event by showing itself. The windowSoftInputMode attribute in AndroidManifest.xml, when set to stateAlwaysHidden, instructs the keyboard to ignore this automatically-assigned initial focus.

<activity
    android:name=".MyActivity"
    android:windowSoftInputMode="stateAlwaysHidden"/>

great reference


What about just adding android:windowSoftInputMode="stateHidden" on your activity in the manifest.

Taken from a smart man commenting on this: https://stackoverflow.com/a/2059394/956975


First of all, it will 100% work........

  1. Create onResume() method.
  2. Inside this onResume() find the view which is focusing again and again by findViewById().
  3. Inside this onResume() set requestFocus() to this view.
  4. Inside this onResume() set clearFocus to this view.
  5. Go in xml of same layout and find that top view which you want to be focused and set focusable true and focusableInTuch true.
  6. Inside this onResume() find the above top view by findViewById
  7. Inside this onResume() set requestFocus() to this view at the last.
  8. And now enjoy......

I tried to disable and enable focusability for view and it worked for me (focus was reset):

focusedView.setFocusable(false);
focusedView.setFocusableInTouchMode(false);
focusedView.setFocusable(true);
focusedView.setFocusableInTouchMode(true);

You could try turning off the main Activity's ability to save its state (thus making it forget what control had text and what had focus). You will need to have some other way of remembering what your EditText's have and repopulating them onResume(). Launch your sub-Activities with startActivityForResult() and create an onActivityResult() handler in your main Activity that will update the EditText's correctly. This way you can set the proper button you want focused onResume() at the same time you repopulate the EditText's by using a myButton.post(new Runnable(){ run() { myButton.requestFocus(); } });

The View.post() method is useful for setting focus initially because that runnable will be executed after the window is created and things settle down, allowing the focus mechanism to function properly by that time. Trying to set focus during onCreate/Start/Resume() usually has issues, I've found.

Please note this is pseudo-code and non-tested, but it's a possible direction you could try.


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

Add them to your ViewGroup that includes your EditTextView. It works properly to my Constraint Layout. Hope this help


Try the following (calling clearAllEditTextFocuses();)

private final boolean clearAllEditTextFocuses() {
    View v = getCurrentFocus();
    if(v instanceof EditText) {
        final FocusedEditTextItems list = new FocusedEditTextItems();
        list.addAndClearFocus((EditText) v);

        //Focus von allen EditTexten entfernen
        boolean repeat = true;
        do {
            v = getCurrentFocus();
            if(v instanceof EditText) {
                if(list.containsView(v))
                    repeat = false;
                else list.addAndClearFocus((EditText) v);
            } else repeat = false;
        } while(repeat);

        final boolean result = !(v instanceof EditText);
        //Focus wieder setzen
        list.reset();
        return result;
    } else return false;
}

private final static class FocusedEditTextItem {

    private final boolean focusable;

    private final boolean focusableInTouchMode;

    @NonNull
    private final EditText editText;

    private FocusedEditTextItem(final @NonNull EditText v) {
        editText = v;
        focusable = v.isFocusable();
        focusableInTouchMode = v.isFocusableInTouchMode();
    }

    private final void clearFocus() {
        if(focusable)
            editText.setFocusable(false);
        if(focusableInTouchMode)
            editText.setFocusableInTouchMode(false);
        editText.clearFocus();
    }

    private final void reset() {
        if(focusable)
            editText.setFocusable(true);
        if(focusableInTouchMode)
            editText.setFocusableInTouchMode(true);
    }

}

private final static class FocusedEditTextItems extends ArrayList<FocusedEditTextItem> {

    private final void addAndClearFocus(final @NonNull EditText v) {
        final FocusedEditTextItem item = new FocusedEditTextItem(v);
        add(item);
        item.clearFocus();
    }

    private final boolean containsView(final @NonNull View v) {
        boolean result = false;
        for(FocusedEditTextItem item: this) {
            if(item.editText == v) {
                result = true;
                break;
            }
        }
        return result;
    }

    private final void reset() {
        for(FocusedEditTextItem item: this)
            item.reset();
    }

}

참고URL : https://stackoverflow.com/questions/6117967/how-to-remove-focus-without-setting-focus-to-another-control

반응형