개발 - 안드로이드

안드로이드 fragment에서 editText.requestFocus() 안되는 경우

개미v 2023. 10. 11. 15:18

안드로이드에서 editText.requestFocus()는 커서를 입력 필드에 포커싱 하는 메소드 입니다.
그런데 이것이 경우에 따라서 될 때가 있고, 안될 때가 있습니다.

아래 코드는 처음은 되는데, 두번째 부터 안되었습니다.

public class TalkWriteFragment extends Fragment {
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        ViewGroup rootView = (ViewGroup) inflater.inflate(R.layout.fragment3_talk_write, container, false);

        editTextMsg = rootView.findViewById(R.id.editTextMsg);

        // 처음만 동작 O, 두번째 부터 동작 안함 X
        // 채팅 입력 필드 포커스
        editTextMsg.requestFocus();
        
        return rootView;
    }
}

 

추측해보면 fragment 생명주기와 관련이 있는 것으로 생각 됩니다.
fragment는 detach attach 할 때 뷰를 저장 했다가 다시 불러 옵니다.

아래 그림에서 onSaveInstanceState(), onViewInstanceState()와 관련이 있습니다.
즉, onCreateView() 에서는 아직 저장된 fragment 뷰를 불러오지 않은 단계이기 때문에 editText가 내가 생각하는 editText가 아니라는 것입니다.

처음만 동작 했던 것은 가장 처음에는 저장된 fragment 뷰가 없었기 때문입니다.

 

 

해결방법은 이전에 저장된 fragment 뷰가 불러와 지고 나서 requestFocus() 하면 됩니다.

public class TalkWriteFragment extends Fragment {
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        ViewGroup rootView = (ViewGroup) inflater.inflate(R.layout.fragment_talk_write, container, false);

        editTextMsg = rootView.findViewById(R.id.editTextMsg);
        
        return rootView;
    }

    @Override
    public void onViewStateRestored(@Nullable Bundle savedInstanceState) {
        super.onViewStateRestored(savedInstanceState);

        // 입력 필드 포커스
        editTextMsg.requestFocus();
    }
}