当EditText禁用时允许滚动

4

我有一个如下设置的EditText

<ScrollView
    android:layout_width="match_parent"
    android:layout_height="wrap_content" >

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:descendantFocusability="beforeDescendants"
        android:focusableInTouchMode="true"
        android:orientation="vertical" >

        <EditText
            android:layout_width="match_parent"
            android:layout_height="375dp"
            android:ems="10"
            android:gravity="top">
        </EditText>

        <Button
            android:layout_width="match_parent"
            android:layout_height="wrap_content" />
    </LinearLayout>
</ScrollView>

程序的某个时刻,在文本被输入后,以下代码将使EditText失效:
edittext.setFocusable(false);
edittext.setEnabled(false);

问题在于,一旦EditText被禁用,我就无法上下滚动查看已经编写的内容。如何禁用输入,但仍允许查看已编写的内容?

1
记录一下,当我尝试你的代码时,甚至在禁用之前,我已经很难滚动EditText。将可滚动的小部件放入ScrollView中并不是一个好主意。有没有可能不将高度固定为某个值? - Andrew T.
(1.) ScrollView对我来说没有任何问题;它的工作方式正如我所期望的那样。实际上,它对我来说是必需的,因为它解决了一个与我的问题无关的不同问题。 (2.) 高度之所以固定在那里是由于与这个问题无关的另一个原因。 - user2323030
创建一个不可见的TextView,当你禁用EditText时,将文本复制到TextView中并显示出来怎么样?因为即使你将textMultiLine设置为EditText,低版本API上存在一个bug,你也无法在超过两行后滚动。 - Blo
谢谢。这个解决方法肯定可行。如果你把它作为答案,而且没有更好的建议出现,我会接受它的。 - user2323030
1个回答

0

尝试在您的EditText上设置android:inputType="textMultiLine"。即使我已经在评论中说过:较低的API存在错误,但是通过固定高度,也许它会起作用。

然而,如果这不起作用,您应该创建另一个视图作为TextView,具有与EditText相同的属性,并且可见性为gone,如下所示:

<ScrollView
    android:layout_width="match_parent"
    android:layout_height="wrap_content" >

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:descendantFocusability="beforeDescendants"
        android:focusableInTouchMode="true"
        android:orientation="vertical" >

        <EditText
            android:id="@+id/edittext"
            android:layout_width="match_parent"
            android:layout_height="375dp"
            android:ems="10"
            android:gravity="top" >
        </EditText>

        <TextView
            android:id="@+id/textview"
            android:layout_width="match_parent"
            android:layout_height="375dp"
            android:ems="10"
            android:gravity="top"
            android:visibility="gone" >
        </TextView>

        <Button
            android:layout_width="match_parent"
            android:layout_height="wrap_content" />
    </LinearLayout>
</ScrollView>  

然后,当你使用setOnKeyListener方法处理KeyEvent.ACTION_DOWNKeyEvent.ACTION_ENTER时,你可以将文本复制到TextView中并删除EditText:
edittext.setOnKeyListener(new OnKeyListener() {
    public boolean onKey(View v, int keyCode, KeyEvent event) {
        if ((event.getAction() == KeyEvent.ACTION_DOWN) && (keyCode == KeyEvent.KEYCODE_ENTER)) {
            String st = edittext.getText().toString();
            textview.setVisibility(View.VISIBLE);
            textview.setText(st);
            return true;
        }
        return false;
    }
});

如果需要重写文本,您可以使用反转方法。
希望这能帮到您。


设置android:inputType="textMultiLine"似乎没有任何作用,但是之后创建一个不可见的TextView然后将其切换确实可以正常工作。 - user2323030

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