安卓编辑框 - 光标停留在起始位置

10

我在我的项目中使用了EditText。

问题在于,无论我在文本框中输入什么内容,它都会显示出来,但是光标始终不会移动,无论我输入多少个字符。此外,我也无法通过单击任何特定的字符来进行光标定位。

我的包含EditText的xml文件如下:

<EditText
        android:id="@+id/xEt"
        android:layout_width="fill_parent"
        android:layout_height="295dp"
        android:layout_alignParentLeft="true"
        android:ems="10"
        android:focusableInTouchMode="true" 
android:focusable="true" >

这个xml文件是:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/xsubLayout"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:keepScreenOn="true"
    android:orientation="vertical" >

    <RelativeLayout
        android:id="@+id/relativeLayout1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_alignParentRight="true" >

    </RelativeLayout>

    <EditText
        android:id="@+id/xEt"
        android:layout_width="wrap_content"
        android:layout_height="295dp"
        android:layout_alignParentLeft="true"
        android:layout_alignParentRight="true"
        android:layout_alignParentTop="true"
        android:ems="10"
        android:inputType="textMultiLine" >

        <requestFocus />
    </EditText>

</RelativeLayout>

    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="wrap_content" android:id="@+id/xK1"
        android:layout_height="wrap_content" android:orientation="vertical"
        android:visibility="gone">
        <include android:id="@+id/xKeyBoard" layout="@layout/gf"></include>
        <include android:id="@+id/xtop" layout="@layout/top"></include>
                <include android:id="@+id/x11" layout="@layout/x1"></include>
        <include android:id="@+id/x12" layout="@layout/x3"></include>
        <include android:id="@+id/x13" layout="@layout/x4"></include>
        <include android:id="@+id/x14" layout="@layout/x5"></include>

        <include android:id="@+id/x15" layout="@layout/x6"></include>
        <include android:id="@+id/x16" layout="@layout/x7"></include>
        <include android:id="@+id/x17" layout="@layout/x8"></include>
        <include android:id="@+id/x18" layout="@layout/x9"></include>

        <include android:id="@+id/x19" layout="@layout/x10"></include>
        <include android:id="@+id/x20" layout="@layout/x11"></include>

        <include android:id="@+id/x22" layout="@layout/x13"></include>

        <include android:id="@+id/x23" layout="@layout/x14"></include>
        <include android:id="@+id/x24" layout="@layout/x15"></include>
        <include android:id="@+id/x25" layout="@layout/x16"></include>
        <include android:id="@+id/x26" layout="@layout/x17"></include>

        <include android:id="@+id/x27" layout="@layout/x18"></include>
        <include android:id="@+id/x28" layout="@layout/x19"></include>


    </RelativeLayout>
</RelativeLayout>

2
你在不同的设备/模拟器上测试过吗? - Pratik
如果第一次测试出现相同的问题,那可能是设备问题。如果仍然出现相同的情况,请告诉我们。 - Pratik
@Pratik 这不是设备问题。我在手机上尝试了一下,但结果相同。 - Aakash Anuj
@Pratik:当我使用mEt.setSelection(mEt.getText().length());时,它对我有效,但是每次我更改EditText时,我都需要编写这个吗? - Aakash Anuj
首先,我的光标无法从起始位置移动。其次,我无法滚动。实际上,我正在使用自己的键盘而不是默认的键盘。也许这就是问题所在。 - Aakash Anuj
显示剩余4条评论
6个回答

7
在我的情况下,这是由于在xml布局的EditText元素中使用了:android:textAllCaps="true"。当我将其移除后,它按预期工作了。

1
为什么android:textAllCaps="true"会导致这种情况? - Sreekanth Karumanaghat
1
我因此浪费了几个小时!谢谢! - insomnium_

4

您是否将视图绑定到模型?即,您是否设置了MVVM?

如果是这样,请确保没有任何循环更新,特别是双向绑定。例如,如果用户键入一个字符,您会更新模型,这将反过来更新EditText控件并重复。

因此,根据您的EditText控件属性,每次模型更改更新它时,光标可能会重置为起始位置。

如果是这种情况,从模型更新之前在模型值和EditText文本值之间进行简单的相等性检查应该可以解决问题。

if (txtEdit.text != modelValue)
{
    txtEdit.text = modelValue;
}

2

可能已经晚了一点回答这个问题。但是我使用自定义键盘时也遇到了同样的问题。在每个EditText的XML文件中添加以下行后,我的问题也得到了解决:

android:imeOptions="flagNoExtractUi"

android:inputType="textNoSuggestions"

像这样。

<Editext                
 android:layout_width="match_parent"
 android:layout_height="wrap_content"
 android:paddingLeft="2dp" 
 android:inputType="textNoSuggestions"
 android:imeOptions="flagNoExtractUi"/>

我看到很多人在搜索这个问题,所以我把它发布到与我问题相关的地方。


我也遇到了这个问题,但这种方法对我没有用。我正在开发自己的键盘输入法,而这个文本输入框位于IME配置选项的设置菜单中。 - Papyrus

1

将这些属性设置到您的XML文件中

  <YourLayout
     xmlns:android="http://schemas.android.com/apk/res/android"
     android:focusable="true" 
     android:focusableInTouchMode="true">

  <EditText
    android:id="@+id/xEt"
    android:layout_width="fill_parent"
    android:layout_height="295dp"
    android:layout_alignParentLeft="true"
    android:ems="10"
    android:clickable="true"
    android:cursorVisible="true"/> 

</YourLayout>

试试这个。 并将其放入您的Java代码中。

 EditText et = (EditText)findViewById(R.id.xEt);
 et.setSelection(et.getText().length());

不,它仍然无法工作。我该怎么办?它仍然停留在起始位置。 - Aakash Anuj
我没有使用默认键盘,而是使用自己的布局……这会造成问题吗? - Aakash Anuj
请上传您的布局文件。 - Nirav Tukadiya
Nirav,我必须在各处编写这段代码 et.setSelection(et.getText().length()); 才能实现结果,因为它只在遇到时才起作用。而且,我无法回去编辑文本。也就是说,一旦输入,我就不能编辑字符。我该怎么办? - Aakash Anuj
Logcat没有显示任何错误。这段代码太长了,我无法在这里贴出来。我只能说我正在使用自己的键盘布局。由于我没有使用默认键盘,这会造成问题吗? - Aakash Anuj
不会有任何问题,因为你做得很对。我猜你的Java代码可能包含错误。 - Nirav Tukadiya

1

我正在使用这个解决方案来解决这个问题,如果字符是英文或数字字符,则将EditText的重力改为左侧,否则在另一种语言中,在我的情况下是阿拉伯语,然后将重力改为左侧,光标将根据每种语言正确移动:

        editText.addTextChangedListener(new TextWatcher() {

            @Override
            public void onTextChanged(CharSequence s, int start, int before, int count) {
                if(s.length() > 0){
                    char c = s.charAt(0);
                     // characters are Enlgish or digits.
                    if ((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z') || Character.isDigit(c)) {
                        editText.setGravity(Gravity.LEFT);
                    }else {
                        editText.setGravity(Gravity.RIGHT);


                    }
                } 
            }

            @Override
            public void beforeTextChanged(CharSequence s, int start, int count,
                    int after) {

            }

            @Override
            public void afterTextChanged(Editable s) {

            }
        });

0

我曾经遇到过这个问题,当时我正在开发一个自定义的Android键盘IME。对于我来说,这些所提出的解决方案都不起作用(请注意,我的Android版本是12,比某些建议中使用的版本要晚得多)。

我的问题实际上是由 @MADol 所指出的问题引起的,即每次状态更新时它都会将光标设置回到初始位置(字段的开头)。我正在使用类型为AppCompatEditText的文本输入字段:

var editText: AppCompatEditText

在负责根据状态更新文本值的方法中,我只需添加以下内容:

editText.setSelection(editText.length())

我在这里找到了这个解决方案。


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