EditText滚动条和ScrollView

时间:2012-03-09 12:55:22

标签: android android-layout android-edittext

包含EditText小部件以及放置在ScrollView中的一些小部件。

我已经使用android设置了EditText的属性:scrollbars =“vertical”以在editText中启用垂直滚动。

现在,当我启动活动时,editText具有焦点,并显示垂直滚动条几秒钟。

这里的问题是当我尝试在EditText中滚动时,ScrollView会移动。

如何在EditText中启用滚动,而不是在scrollview中滚动。

<ScrollView
    android:id="@+id/scrollView1"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <LinearLayout
        android:id="@+id/main"
        android:layout_width="match_parent"            
        android:layout_height="wrap_content"
        android:orientation="vertical" >
        .
        .
        .
        <EditText
            android:id="@+id/smset"
            android:layout_width="match_parent"
            android:gravity="top|left"
            android:height="100dip"
            android:inputType="textMultiLine" >
        </EditText>
        .
        .
        .
   </LinearLayout>
</ScrollView>

5 个答案:

答案 0 :(得分:5)

在你的java文件中

     EditText dwEdit = (EditText) findViewById(R.id.DwEdit);       
     dwEdit.setOnTouchListener(new OnTouchListener() {
           public boolean onTouch(View view, MotionEvent event) {
                // TODO Auto-generated method stub
                if (view.getId() ==R.id.DwEdit) {
                    view.getParent().requestDisallowInterceptTouchEvent(true);
                    switch (event.getAction()&MotionEvent.ACTION_MASK){
                    case MotionEvent.ACTION_UP:
                        view.getParent().requestDisallowInterceptTouchEvent(false);
                        break;
                    }
                }
                return false;
            }
        });
  

在xml中

   <EditText
    android:id="@+id/DwEdit"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:minLines="10"
    android:scrollbarStyle="insideInset"
    android:scrollbars="vertical" 
    android:overScrollMode="always"
    android:inputType="textCapSentences">
    </EditText> 

答案 1 :(得分:2)

你也不能放置能在滚动内容中滚动的东西。

当您触摸屏幕时,Android无法确定您要滚动哪个元素,因此根本不支持。 (忽略一些非常糟糕的黑客行为)。

答案 2 :(得分:0)

一个这样的黑客是:

scroll.setOnTouchListener(new OnTouchListener()
{ 
    public boolean onTouch(View v, MotionEvent event) 
    {
        return true; 
    }
});

请注意,要在ScrollView中启用滚动,您必须运行相同的功能,但使用“return false;”代替。

答案 3 :(得分:0)

如果做得好,我不会说这是不好的做法,但这不是自然期待的事情。

我经常将可滚动视图放在滚动的内容中,但你必须锁定外层并在内部启用滚动。理想情况下,您应该做其他事情,但这是可能的。

您可以将ScrollView修改为可锁定,例如here

然后在触摸内部事物时以编程方式锁定LockableScrollView滚动。

smset.setOnTouchListener(new OnTouchListener()
{
    public boolean onTouch(View v, MotionEvent event)
    {
        // Disables LockableScrollView when the EditText is touched
        if (event.getAction() == MotionEvent.ACTION_DOWN)
        {
            scrollView1.setScrollingEnabled(false);
        }

        // Enables LockableScrollView when the EditText is touched
        if (event.getAction() == MotionEvent.ACTION_UP)
        {
            scrollView1.setScrollingEnabled(true);
        }
        return false;
    }
});

这样做的缺点是,当触摸EditText时它会禁用滚动,但不会引起任何其他副作用。

答案 4 :(得分:0)

在kotlin中,您可以为所有ExitTextViews编写扩展功能,并在各处使用它们:

fun EditText.setTouchForScrollBars() {
    setOnTouchListener { view, event ->
        view.parent.requestDisallowInterceptTouchEvent(true)
        when (event.action and MotionEvent.ACTION_MASK) {
            MotionEvent.ACTION_UP -> view.parent.requestDisallowInterceptTouchEvent(false)
        }
        false
    }
}

但也可以在EditTextView XML中添加以下行:

android:scrollbarStyle="insideInset"
android:scrollbars="vertical"
android:overScrollMode="always"
android:inputType="textMultiLine"