>

2 개의 TextInputLayouts와 Spinner가있는 레이아웃이 있습니다 :

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context="test.focustest.MainActivity">
    <android.support.design.widget.TextInputLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content">
        <android.support.design.widget.TextInputEditText
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:hint="I don't like"/>
    </android.support.design.widget.TextInputLayout>
    <android.support.design.widget.TextInputLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content">
        <android.support.design.widget.TextInputEditText
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:hint="My favourite"/>
    </android.support.design.widget.TextInputLayout>
    <Spinner
        android:id="@+id/planets_spinner"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"></Spinner>
</LinearLayout>

활동 코드는 다음과 같습니다.

public class MainActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Spinner spinner = (Spinner) findViewById(R.id.planets_spinner);
        ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(this,
                R.array.planets_array, android.R.layout.simple_spinner_item);
        adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
        spinner.setAdapter(adapter);
    }
}

두 TextInputLayouts 사이를 전환하면 포커스가 예상대로 작동합니다. 첫 번째 EditText를 선택할 때의 모습입니다 :

두 번째 EditText가 선택되었을 때의 모습입니다 :

그러나 스피너를 선택할 때 마지막으로 선택한 TextInputLayout은 계속 초점을 유지합니다.

스피너가 열릴 때 두 TextInputLayouts에서 포커스를 제거하고 싶습니다. 이것을 달성하는 방법에 대한 아이디어가 있습니까?

  • 답변 # 1

    이 게시물의 도움으로이 문제를 해결했습니다 : 게시물 링크

    스피너가 열릴 때 포커스를 지우도록 내 활동을 알리는 사용자 정의 스피너를 추가했습니다. 코드는 다음과 같습니다.

       public class CustomSpinner extends AppCompatSpinner {
        public interface OnSpinnerEventsListener {
            void onSpinnerOpened(AppCompatSpinner spinner);
            void onSpinnerClosed(AppCompatSpinner spinner);
        }
        public CustomSpinner(Context context) {
            super(context);
        }
        public CustomSpinner(Context context, int mode) {
            super(context, mode);
        }
        public CustomSpinner(Context context, AttributeSet attrs) {
            super(context, attrs);
        }
        public CustomSpinner(Context context, AttributeSet attrs, int defStyleAttr) {
            super(context, attrs, defStyleAttr);
        }
        public CustomSpinner(Context context, AttributeSet attrs, int defStyleAttr, int mode) {
            super(context, attrs, defStyleAttr, mode);
        }
        public CustomSpinner(Context context, AttributeSet attrs, int defStyleAttr, int mode, Resources.Theme popupTheme) {
            super(context, attrs, defStyleAttr, mode, popupTheme);
        }
    
        private OnSpinnerEventsListener mListener;
        private boolean mOpenInitiated = false;
        // implement the Spinner constructors that you need
        @Override
        public boolean performClick() {
            // register that the Spinner was opened so we have a status
            // indicator for when the container holding this Spinner may lose focus
            mOpenInitiated = true;
            if (mListener != null) {
                mListener.onSpinnerOpened(this);
            }
            return super.performClick();
        }
        public void setSpinnerEventsListener(
                OnSpinnerEventsListener onSpinnerEventsListener) {
            mListener = onSpinnerEventsListener;
        }
        public void performClosedEvent() {
            mOpenInitiated = false;
            if (mListener != null) {
                mListener.onSpinnerClosed(this);
            }
        }
        public boolean hasBeenOpened() {
            return mOpenInitiated;
        }
        public void onWindowFocusChanged (boolean hasFocus) {
            if (hasBeenOpened() && hasFocus) {
                performClosedEvent();
            }
        }
    }
    
    

    그런 다음 활동은이 인터페이스를 구현합니다 :

    public class MainActivity extends AppCompatActivity implements CustomSpinner.OnSpinnerEventsListener {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        final CustomSpinner spinner = (CustomSpinner) findViewById(R.id.planets_spinner);
        ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(this,
                R.array.planets_array, android.R.layout.simple_spinner_item);
        adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
        spinner.setAdapter(adapter);
        findViewById(R.id.root).clearFocus();
        spinner.setSpinnerEventsListener(this);
    }
        @Override
        public void onSpinnerOpened(AppCompatSpinner spinner) {
            View view = this.getCurrentFocus();
            if (view != null) {
                InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
                imm.hideSoftInputFromWindow(view.getWindowToken(), 0);
            }
            findViewById(R.id.root).clearFocus();
        }
        @Override
        public void onSpinnerClosed(AppCompatSpinner spinner) {
        }
    }
    
    

    또한 root LinearLayout : root에 id를 추가했습니다. 초점을 지울 수 있습니다.

관련 자료

  • 이전 헬퍼를 사용하여 잘린 HTML의 경우 link_to가 정의되지 않은 메소드로 끝납니다
  • 다음 android - ProGuard는 분명히 실행되지 않습니다