最近在做一个笔记应用时需要在用ScrollView套上linearlayout当父控件,其中的子控件有editText用来输入文本,但是发现在其他子控件刷新时,如果当前看不到editText的焦点,scrollView会自动跳到editText的焦点位置,这个问题无法解决,demo代码如下:<RelativeLayout 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"
    tools:context=".MainActivity" >
<ScrollView 
        android:layout_width="wrap_content"
        android:layout_height="wrap_content">
        <LinearLayout
            android:id="@+id/linear_layout"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:orientation="vertical"
            android:focusable="true"
            android:focusableInTouchMode="true"
            android:descendantFocusability="beforeDescendants" >
    <TextView
        android:id="@+id/tv"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerHorizontal="true"
        android:layout_centerVertical="true"
        android:text="@string/hello_world" />
    <EditText 
        android:id="@+id/et"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerHorizontal="true"
        android:layout_centerVertical="true"
        android:text="@string/hello_world"/>
    </LinearLayout>
    </ScrollView>
</RelativeLayout>
public class MainActivity extends Activity {    private TextView tv;
    private EditText et;    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        tv =  (TextView) this.findViewById(R.id.tv);
        et =  (EditText) this.findViewById(R.id.et);
        handler.sendEmptyMessageDelayed(0, 1000);
        Window  window  = this.getWindow();
    }    private Handler handler = new Handler() {        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);
            tv.setText(""+System.currentTimeMillis());
            this.sendEmptyMessageDelayed(0, 1000);
        }
    };}这里textView每次setText时都会引起scrollView滑到editText的光标位置处。但是参考中兴笔记,如图,是可以在保持editText存在焦点的状态下还能同时刷新录音控件,而且scrollView不会自动滑动。请教大牛如何才能实现这种效果呢,谢谢!!!

解决方案 »

  1.   

    网上的解决方案一般是禁用了scrollView的自动滑动功能,但是我还需要在editText中输入文本时,ScrollView能够正常的根据文本光标位置进行滑动,在输入时保证能看到光标。
      

  2.   

    fix 滚动 , 重写EditText
    @Override
    public boolean onTouchEvent(MotionEvent event) {
            if (event.getAction() == MotionEvent.ACTION_MOVE)
                this.getParent().requestDisallowInterceptTouchEvent(true);
            return super.onTouchEvent(event);
    }fix  焦点跳动, 重写ScrollView
    @Override
    public boolean requestChildRectangleOnScreen(View child, Rect rectangle, boolean immediate) {
            return child instanceof EditText;
    }
      

  3.   

    解决了吗?如果是 多个edittext呢
      

  4.   

    外部滑屏控件优先获取焦点,editText就会失去焦点,不会下滑了
     private void test() {
            entryScroll.setDescendantFocusability(ViewGroup.FOCUS_BEFORE_DESCENDANTS);
            entryScroll.setFocusable(true);
            entryScroll.setFocusableInTouchMode(true);
            entryScroll.setOnTouchListener(new View.OnTouchListener() {
                @Override
                public boolean onTouch(View v, MotionEvent event) {
                    v.requestFocusFromTouch();
                    return false;
                }
            });
        }