ScrollView自动滚动到可选择的TextView

10

我在一个ScrollView中有一个垂直的LinearLayout。一切正常,直到将LinearLayout中的第三个TextView设置为可选。

更改后,它会自动滚动到第三个TextView

可能是什么原因导致了这个问题?

更改前和更改后:

enter image description here enter image description here

布局:

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/roota_view"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:layout_gravity="right"
    android:orientation="vertical" >

    <ScrollView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:paddingBottom="@dimen/activity_vertical_margin"
        android:paddingLeft="@dimen/activity_horizontal_margin"
        android:paddingRight="@dimen/activity_horizontal_margin"
        android:paddingTop="@dimen/activity_vertical_margin"
        tools:context="com.saliherikci.poemnotebook.ReadPoemActivity$PlaceholderFragment" >

        <LinearLayout
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:focusable="false"
            android:focusableInTouchMode="false"
            android:orientation="vertical" >

            <TextView
                android:id="@+id/poemTitleTextView"
                android:layout_width="fill_parent"
                android:layout_height="wrap_content"
                android:text="Çanakkale Şehitlerine"
                android:textColor="@color/poem_title"
                android:textSize="24dp" />

            <TextView
                android:id="@+id/poemAuthorTextView"
                android:layout_width="fill_parent"
                android:layout_height="wrap_content"
                android:layout_marginBottom="5dp"
                android:text="Mehmet Akif ERSOY"
                android:textAppearance="?android:attr/textAppearanceSmall"
                android:textSize="11dp" />

            <TextView
                android:id="@+id/poemContentTextView"
                android:layout_width="fill_parent"
                android:layout_height="wrap_content"
                android:text="Şu Boğaz harbi nedir? Var mı ki dünyâda eşi? "
                android:textColor="@color/poem_content"
                android:textIsSelectable="true"
                android:textSize="10dp" />
        </LinearLayout>
    </ScrollView>

    <LinearLayout
        android:id="@+id/fontSizeView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="top|right"
        android:background="@color/font_size_background"
        android:orientation="vertical"
        android:paddingBottom="5dp"
        android:paddingLeft="15dp"
        android:paddingRight="15dp"
        android:paddingTop="5dp"
        android:visibility="invisible" >

        <TextView
            android:id="@+id/textView1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="top|right"
            android:text="YAZI BOYUTU"
            android:textAppearance="?android:attr/textAppearanceSmall"
            android:textColor="#1a1a1a"
            android:textSize="8dp" />

        <LinearLayout
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="top|right"
            android:layout_marginTop="5dp"
            android:dividerPadding="5dp"
            android:orientation="horizontal"
            android:showDividers="middle" >

            <ImageButton
                android:id="@+id/font_size_1"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_gravity="bottom"
                android:background="@null"
                android:src="@drawable/ic_font_size_black_1_active" />

            <ImageButton
                android:id="@+id/font_size_2"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_gravity="bottom"
                android:layout_marginLeft="20dp"
                android:background="@null"
                android:src="@drawable/ic_font_size_black_2_inactive" />

            <ImageButton
                android:id="@+id/font_size_3"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_gravity="bottom"
                android:layout_marginLeft="20dp"
                android:background="@null"
                android:src="@drawable/ic_font_size_black_3_inactive" />

            <ImageButton
                android:id="@+id/font_size_4"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_gravity="bottom"
                android:layout_marginLeft="20dp"
                android:background="@null"
                android:src="@drawable/ic_font_size_black_4_inactive" />

            <ImageButton
                android:id="@+id/font_size_5"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginLeft="20dp"
                android:background="@null"
                android:src="@drawable/ic_font_size_black_5_inactive" />
        </LinearLayout>
    </LinearLayout>

</FrameLayout>

你能打印出你的布局 XML 文件中的内容吗? - Jonathan Liono
你的布局 XML 中没有看到任何 ScrollView。你是通过编程方式添加了 ScrollView 吗? - Jonathan Liono
4个回答

20

由于 ScrollViewViewParent.requestChildFocus 上调用了 ScrollView.scrollToChild,因此您会自动滚动到第三个 TextView

根据文档,如下所述

当这个父级的子项想要焦点时调用

当您使用 android:textIsSelectable="true" 时,您本质上是在调用 TextView.setTextIsSelectable(true),这将调用 View.setFocusableView.setFocusableInTouchMode

简而言之,为了防止自动滚动到第三个 TextView,请给第一个添加一些焦点。

<TextView
    android:id="@+id/poemTitleTextView"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:focusable="true"
    android:focusableInTouchMode="true"
    android:text="Çanakkale Şehitlerine"
    android:textColor="@color/poem_title"
    android:textSize="24dp"  />

2

这是我的解决方案:

@Override
    protected int computeScrollDeltaToGetChildRectOnScreen(Rect rect) {
        return 0;
    }
When called requestChildFocus will not called scrollToChild()

0
在我的情况下,我有一个包含一个 TextView 子元素的 ScrollView,并且该子元素使用了 marginTop (或者父元素的 paddingTop 或其他空间)。
第一次点击 TextView 时,ScrollView 将滚动到顶部的子元素。
为了避免这种跳动,我请求将焦点放在子元素上,并将滚动条向后滚动到 y=0
textView.post {
    textView.requestFocus()
    scrollView.scrollY = 0
}

-2

你能试着从poemContentTextView(第三个TextView)中移除这个属性吗?

android:layout_weight="22.14"


我将其删除了,因为它与这个问题无关。 - Salih Erikci

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接