Android:如何使TextView可编辑?

44

我如何允许用户编辑 TextView?当然,可以使用 EditText,但是我不知道如何自定义它,并且我在 Android 文档中看到 TextView 是可编辑的。因此,我尝试了以下代码:

<TextView android:id="@+id/tv"
          android:layout_width="wrap_content"
          android:layout_height="wrap_content"
          android:textSize="80sp"
          android:text="MyText"
          android:editable="true"
          android:singleLine="true"
          android:inputType="text"
          android:focusable="true"
          android:clickable="true"
          android:cursorVisible="true"/>

但它仍然看起来像普通的 TextView。有人知道我错过了什么吗?或者,也许,如何自定义 EditText 使其看起来像 TextView:没有边框和背景?


4
你可以使用EditText来替代。 - Chintan Raghwani
1
使用EditText有什么问题吗?您可以通过应用样式来更改EditText界面。 - Pratik
6个回答

87

我知道你不想使用EditText,但是将其外观设置为TextView真的很容易。

<EditText
     android:id="@+id/Id"
     android:layout_width="fill_parent"
     android:layout_height="wrap_content"
     android:background="@android:color/transparent" >
 </EditText>

你也可以使用android:background="@null"

编辑:

TextVieweditable参数确实使其可编辑(受一些限制)。

如果设置了android:editable="true",你可以通过D-pad访问TextView,或者添加android:focusableInTouchMode="true"以在触摸时获得焦点。

问题是不能修改现有文本,也不能移动光标。你写的文本只会添加到现有文本之前。


没错。实际上,EditText是从TextView继承而来的。最大的变化是它们让它处理触摸事件,并放置了一个背景。去掉背景(可能稍微调整一下填充)就成为了用户可以在触摸中编辑的TextView。 - DeeV
好的,这是可以接受的,但我仍然想知道为什么TextView可以声明为“可编辑”。 - uncle Lem
2
如果在xml中将editable设置为true,则Eclipse会给出以下警告:android:editable已弃用:使用<EditText>使其可编辑-不应在<TextView>中使用属性android:editable:将元素类型更改为<EditText>? - Benito Bertoli
此外,TextView文档确认:“TextView是一个完整的文本编辑器,但基本类被配置为不允许编辑;请参阅EditText以获取配置文本视图进行编辑的子类。”。请参见http://developer.android.com/reference/android/widget/TextView.html。 - saiyancoder
@Beniot Bertoli会做。 - RileyManda
显示剩余2条评论

9
您可以通过添加以下行使TextView具有编辑功能:
tv.setFocusable(true);
tv.setEnabled(true);
tv.setClickable(true);
tv.setFocusableInTouchMode(true);

9
您可以伪造一个可编辑的TextView。您只需在触摸它时隐藏TextView(使其“可点击”),用EditText替换它,在编辑完成后再重新显示它即可。

4

TextView定义了EditText上发现的所有功能,但没有内置支持它们。EditText的一些主要区别如下:

a) getDefaultEditable()方法返回true。这只是一个标记,将该子类定义为可编辑。

b) 移动方法。是一个控制光标行为(位置、向前/向后移动-在某些语言中可能会改变等)的对象。相反,TextView只返回null,因为它本身不是光标。

c) getText()方法的CharSequence。TextView为此返回单个字符串。EditText使用特定的字符序列实现(Editable),表示可变文本缓冲区。

因此,我们不能认为TextView像受限制的EditText一样。TextView概述了编辑界面,但本身不实现。

如果您需要一个可以随时关闭编辑的文本组件,则需要EditText组件。


3
    tv.setCursorVisible(true);
    tv.setFocusableInTouchMode(true);
    tv.requestFocus();
    tv.setEnabled(true);

当您回答问题时,请善意地参考其他答案。本答案已经给出。 - Malith Ileperuma
Malith,他的答案与已经提供的答案不同。它们都有4行并不意味着它们相同,哈哈。 - Anon

0
我通过编程创建TextView最终找到了解决您问题的方法。
TextView textView = new TextView(context, null, android.R.attr.editTextStyle) {
    @Override
    public boolean getDefaultEditable() {
        return true;
    }
};

或者在XML中

<TextView
android:id="@+id/textView_ID"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:style="@android:attr/editTextStyle"
android:editable="true"/>

享受!


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