【问题标题】:EditText scroller and ScrollViewEditText 滚动条和 ScrollView
【发布时间】:2012-03-09 12:55:21
【问题描述】:

拥有 EditText 小部件以及一些放置在 ScrollView 中的小部件。

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

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

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

如何在 EditText 而不是在滚动视图中启用滚动。

<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>

【问题讨论】:

    标签: android android-layout android-edittext


    【解决方案1】:

    在你的 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> 
    

    【讨论】:

      【解决方案2】:

      你不能把可以滚动的东西放在可以滚动的东西里面。

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

      【讨论】:

      • 我需要你在滚动视图方面的帮助你能帮我吗
      • @Gaurav 提出问题,展示您的尝试,解释您的问题并使用正确的英语(不是“u”,而应该是“your”等)。
      • 我已在stackoverflow.com/questions/18077726/… 发布此内容,请帮助我处理此问题
      • @Gaurav 没有。你创建了你的问题,你会在那里得到你的帮助。除此之外,您仍然使用我个人讨厌的短信样式打字...
      【解决方案3】:

      一个这样的黑客是:

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

      请注意,要在 ScrollView 中启用滚动,您必须运行相同的函数,但使用“return false;”而是。

      【讨论】:

        【解决方案4】:

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

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

        您可以将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 被触摸时它会禁用滚动,但它不应该引起任何其他副作用。

        【讨论】:

          【解决方案5】:

          在 kotlin 中,你可以为所有的 ExitTextView 编写一个扩展函数,并在任何地方使用它们:

          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"
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2021-09-08
            • 1970-01-01
            • 2011-09-04
            • 1970-01-01
            • 2013-05-12
            • 2011-02-20
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多