Скроллер EditText и ScrollView

иметь виджет EditText вместе с некоторыми виджетами, размещенными в ScrollView.

Я установил свойство EditText с помощью android: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>

person Ravibhushan    schedule 09.03.2012    source источник


Ответы (5)


Вы не можете поместить что-то, что может прокручиваться, внутрь того, что тоже прокручивается.

Android не может точно сказать, какой элемент вы хотите прокручивать при касании экрана, поэтому он вообще не поддерживается. (игнорируя некоторые хаки, которые являются довольно плохой практикой).

person WarrenFaith    schedule 11.05.2012
comment
мне нужна ваша помощь в просмотре прокрутки, можете ли вы помочь мне в этом - person Developer; 06.08.2013
comment
@Gaurav задайте вопрос, покажите, что вы пробовали, объясните свою проблему и используйте правильный английский (не вы, когда это должно быть вашим и т. д.). - person WarrenFaith; 06.08.2013
comment
я разместил это в stackoverflow. com/questions/18077726/ пожалуйста, помогите мне в этом - person Developer; 06.08.2013
comment
@Гаурав нет. Вы создали свой вопрос, и вы получите там помощь. Кроме того, вы все еще используете набор текста в стиле смс, который лично я ненавижу... - person WarrenFaith; 06.08.2013

В вашем 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> 
person Amsheer    schedule 21.05.2013

Один из таких хаков:

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

Обратите внимание, что для включения прокрутки в ScrollView вам нужно будет запустить ту же функцию, но с «return false;» вместо.

person Alex    schedule 02.10.2012

Я бы не сказал, что это плохая практика, если все сделано правильно, но это не то, что естественно ожидать.

Я регулярно размещаю прокручиваемые представления внутри чего-то, что прокручивается, но вы должны заблокировать внешний слой и включить прокрутку внутри. В идеале вы должны сделать что-то еще, но это возможно.

Вы можете изменить ScrollView, чтобы его можно было заблокировать, как в здесь.

Затем программно заблокируйте прокрутку 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, но это не должно вызывать никаких других побочных эффектов.

person Muz    schedule 03.10.2012

В 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"
person Amin Keshavarzian    schedule 31.07.2019