EDITTEXTスリップイベントScrollViewソリューションは、ネストされた、と両者の間のスライドで団結します。それが最後のスライド、スライドに関連付けられているどのような時間ののEditText一部は、その後、彼らはスライディングイベントは、それらの間の完全な連続性があるように、ScrollViewの外側に沿ってスライドさせるべきであるときです。効果を見てみましょう。
オンラインは完全な実装の例を見つけることができなかった、彼は彼自身のラインやデモがありました。
次のように注釈付きのコードは、すべてのコードは次のようになります。
パッケージchn.fz.thatjay.scrolleditview.view。 輸入android.content.Context; 輸入android.content.res.TypedArray; 輸入android.text.Layout; 輸入android.util.AttributeSet; 輸入android.support.v7.widget.AppCompatEditText; 輸入android.util.Log; 輸入android.view.MotionEvent。 輸入android.view.View。 輸入android.widget.RelativeLayout; 輸入chn.fz.thatjay.scrolleditview.R。 パブリック クラス ScrollMulrowsEditTextは拡張AppCompatEditText { 民間 最終を文字列タグ=「ScMulrowsEditText」。 // 滑动距离的最大边界 プライベート int型mOffsetHeight。 プライベート int型mHeight。 プライベート int型 mVert = 0 ; 公共ScrollMulrowsEditText(コンテキスト・コンテキスト){ スーパー(コンテキスト)。 } 公共ScrollMulrowsEditText(コンテキスト・コンテキスト、属性セットのATTRS){ スーパー(文脈、ATTRS)。 initAttribute(コンテキスト、attrsに、 0 ); } 公共 ScrollMulrowsEditText(コンテキスト・コンテキスト、属性セットattrsに、INT defStyleAttr){ スーパー(コンテキスト、attrsに、defStyleAttr); initAttribute(文脈、attrsに、defStyleAttr); } @Overrideが 保護 ボイド onMeasureを(INT widthMeasureSpec、INT heightMeasureSpec){ スーパー.onMeasure(widthMeasureSpec、heightMeasureSpec); int型、paddingTop INT paddingBottomの; int型の高さを、 INT mLayoutHeight; // 取得したコンテンツペイン レイアウトmLayout = getLayout(); // パネルの高さの内容を取得 mLayoutHeight = mLayout.getHeightを(); //はパディングを取得 = paddingTop getTotalPaddingTop(); // 次のパディング取得 paddingBottomの= getTotalPaddingBottomを(); // コントロールの実際の高さを取得 高さ= mHeight; // のgetHeight()は最初に0を得、それは外部からの設定を指定することが好ましいです / / 境界mOffsetHeightコンテンツの摺動距離が少なく、0の値は全くスクロールバーときときに算出 paddingTop + + = mLayoutHeight paddingBottomのmOffsetHeightない- 高さ; setOnTouchListener(); のiF(のgetId()== R.id.edittext2){ Log.dを(TAG、 "ffffaaaaのonMeasure ==" + mOffsetHeight); } } プライベート ボイド initAttribute(コンテキスト・コンテキスト、属性セットのattrsに、INT defStyleAttr){ TypedArray配列 = context.obtainStyledAttributes(ATTRS、R.styleable.ScrollMulrowsEditText、defStyleAttr、0 ); int型のカウント= array.getIndexCount(); 以下のために(int型 i = 0; iは数<; iは++ ){ int型 ATTR = array.getIndex(I)。 スイッチ(ATTR){ ケースR.styleable.ScrollMulrowsEditText_sc_mul_edit_height: mHeight = array.getDimensionPixelSize(ATTR、0 ); 破ります; } } array.recycle()。 } @Overrideは、 保護された ボイド onScrollChangedを(INT HORIZ、INTヴェール、INT oldHoriz、INT oldVert){ スーパー.onScrollChanged(HORIZ、ヴェール、oldHoriz、oldVert); mVert = ヴェール; IF(のgetId()== R.id.edittext2){ Log.d(TAG、 "ffffaaaa mOffsetHeight ==" + mOffsetHeight + ",,ヴェール===" + ヴェール); } IF(ヴェールmOffsetHeight == == 0 ||ヴェール){ / / ここでのイベントスライドレイアウトの親や祖父のレイアウトをトリガ getParent()requestDisallowInterceptTouchEvent(falseには); Log.d(TAG、 "falseにヴェールrequestDisallowInterceptTouchEventは" ); } } // の上縁上にスライド パブリック ブール(){isUpperEdge 戻り mVertの== 0 ; } // の下縁にスライド 公衆 ブールisLowerEdge(){ 返す mVert == mOffsetHeightを; } プライベート フロートscrollBeginY; 公共 ボイドsetOnTouchListener(){ setOnTouchListener(新新View.OnTouchListener(){ @Override 公共 ブールOnTouch(ビューV、MotionEventイベント){ // スクロール方向が決定されているかどうかを指定するcanScrollVertically()メソッドは、引数が正または負、負、上にスクロールするかどうかをチェックし、肯定的ですスクロールダウンするかどうかを確認する 場合(MotionEvent.ACTION_DOWN == event.getActionは()){ scrollBeginY = ; event.getY()は 。v.getParent()(requestDisallowInterceptTouchEvent trueには); // 親クラスのレイアウトを必要とするが、タッチイベント傍受ありません 戻り falseに; } Log.d(TAG、 "event.getY" + event.getY()); // のEditTextのgetYを得る極端なエッジは、固定値でない場合 なら(canScrollVertically(1)){ // 下にスクロールすることができ IF(isUpperEdge()&& event.getY()> = scrollBeginY){ // 上縁、スライド下向きのジェスチャ有する v.getParentを()。requestDisallowInterceptTouchEvent(偽の) ; // 親レイアウト } 他{ (v.getParent()requestDisallowInterceptTouchEvent trueに); } } そう IF(canScrollVertically(-1)){ // スクロールでき IF(isLowerEdge()&& event.getY()< scrollBeginY =){ //は下縁、スライド上方ジェスチャーを有します v.getParent()requestDisallowInterceptTouchEvent(偽の); // 親レイアウト } 他{ v.getParent()requestDisallowInterceptTouchEvent(真の); } } 他{ v.getParent()requestDisallowInterceptTouchEvent(偽の); // へ父のレイアウト } // トップのgetY値上のgetY小さな携帯電話の画面 // のgetY携帯電話の画面下には大きいのgetYが 返す 偽; } }); } }
アクティビティコード、以下が消えたときに、キーボードの入力方法を監視するために使用されるサードパーティライブラリのImmersionBarあるのでのEditTextそれ以外のEditTextカーソルが見ることは困難であった、フォーカスを失いました。
@Override 保護された ボイドのonCreate(バンドルsavedInstanceState){ スーパー.onCreate(savedInstanceState)。 setContentView(R.layout.activity_main)。 initStatusBar(edittext1、edittext2、edittext3、edittext4、edittext5)。 } パブリック 無効 initStatusBar(最終のEditText ... ETS){ ImmersionBar.with(この) .fitsSystemWindows(真) .statusBarColor(R.color.color1) .keyboardEnable(真) .setOnKeyboardListener(新 OnKeyboardListener(){ @Override 公共 のボイド(onKeyboardChange ブール isPopup、int型keyboardHeight){ 場合(!isPopup){ のため(のEditTextら:ETS ){ et.clearFocus(); } } } }) .INIT(); }