ScrollViewネストEditTextプリエンプトフォーカスの問題

2848 ワード

シーンの説明:ScrollViewのレイアウトは1つのスクリーンサイズを超えており、そのうちの1つのEditTextが下部に近い位置にあるため、このEditTextにコンテンツを入力すると、ScrollViewを上にスライドし、焦点がこのEditTextにあるため、上へスライドして終了すると、自動的にこのEditTextにスライドする場合があります.ソリューション:
  • API 23以上にsetOnScrollChangeListener()は呼び出すことができますが、低バージョンとは互換性がありません.ScrollViewのcomputeScroll()メソッドを書き換えるか、ViewのonScrollChanged()メソッドを書き換えるか、スライドリスニングを設定してスライド距離のリスニングを実現できます.
  • computeScroll()
  • を書き換える
    public class MyScrollView extends ScrollView {
    
        private OnScrollListener listener;
    
        /**
         *          
         */
        public void setOnScrollListener(OnScrollListener listener) {
            this.listener = listener;
        }
    
        public MyScrollView(Context context) {
            super(context);
        }
    
        public MyScrollView(Context context, AttributeSet attrs) {
            super(context, attrs);
        }
    
        public MyScrollView(Context context, AttributeSet attrs, int defStyleAttr) {
            super(context, attrs, defStyleAttr);
        }
    
        //        
        public interface OnScrollListener{
    
            /**
             *         ,scrollY       
             */
            void onScroll(int scrollY);
        }
    
        @Override
        public void computeScroll() {
            super.computeScroll();
            if(listener!=null){
                listener.onScroll(getScrollY());
            }
        }
    }
    
  • onScrolChanged()
  • を書き換える
    public class MyScrollView extends ScrollView {
    
        private OnScrollListener listener;
    
        public void setOnScrollListener(OnScrollListener listener) {
            this.listener = listener;
        }
    
        public MyScrollView(Context context) {
            super(context);
        }
    
        public MyScrollView(Context context, AttributeSet attrs) {
            super(context, attrs);
        }
    
        public MyScrollView(Context context, AttributeSet attrs, int defStyleAttr) {
            super(context, attrs, defStyleAttr);
        }
    
        public interface OnScrollListener{
            void onScroll(int scrollY);
        }
    
        @Override
        protected void onScrollChanged(int l, int t, int oldl, int oldt) {
            super.onScrollChanged(l, t, oldl, oldt);
            if(listener != null){
                listener.onScroll(t);
            }
        }
    }
    

    2.スライドリスニングがあったら、いつEditTextの焦点をクリアするかを知る必要があります.このEditTextが画面の見えない位置にあるときに、焦点をクリアすることができます.
    Point p = new Point();
    getWindowManager().getDefaultDisplay().getSize(p);
    int screenWidth = p.x;
    int screenHeight = p.y;
    final Rect rect = new Rect(0, 0, screenWidth, screenHeight);
    int[] location = new int[2];
    edt_validate_code.getLocationInWindow(location);
    scroll_view.setOnScrollListener(new MyScrollView.OnScrollListener() {
        @Override
        public void onScroll(int scrollY) {
            if (edt_validate_code.getLocalVisibleRect(rect)) {
                //          
            } else {
                //            ,    
                edt_validate_code.clearFocus();
            }
        }
    });