如何检测用户何时聚焦编辑文本并将光标放在右侧(结束)?

时间:2018-04-05 17:25:43

标签: c# android xamarin android-edittext

我很难使用EditText小部件。它会在应用程序启动时自动聚焦,并且在我完成编辑时不会失焦。我似乎无法理解如何捕获以下事件:打开虚拟键盘,关闭/隐藏虚拟键盘。

会发生什么:当用户触摸EditText小部件时,虚拟键盘会打开,光标会放在用户触摸的位置。

我想要更改的内容:当用户与编辑文本交互时(即,打开虚拟键盘),我希望光标显示在右侧(文本末尾)无论他们在哪里触摸。每次用户打开虚拟键盘与特定的EditText进行交互时,我希望光标从右侧开始,以便于编辑。之后,用户可以正常编辑并像往常一样将光标移动到任何位置。然后,我需要在完成编辑时使窗口小部件变得不专心,以便下次用户编辑时可以重复此行为。

目前我正在测试如何在单独的测试应用中实现这一目标。我根据我遇到的其他答案制作了一个非常基本的应用程序,只有一个线性布局和编辑文本小部件,但遗憾的是无法解决我的问题。这是它的样子:

Main.axml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:minWidth="25px"
    android:minHeight="25px"
    android:id="@+id/mainLayout"
    android:focusable="true"
    android:focusableInTouchMode="true"
    android:descendantFocusability="beforeDescendants">
<EditText
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:id="@+id/editText1"
    android:text="65336"
    android:gravity="center_horizontal"
    android:imeOptions="actionDone"
    android:inputType="number" />

MainActivity.cs

protected override void OnCreate(Bundle savedInstanceState)
{
    base.OnCreate(savedInstanceState);

    // Set our view from the "main" layout resource
    SetContentView(Resource.Layout.Main);

    LinearLayout linear = (LinearLayout)FindViewById(Resource.Id.mainLayout);
    EditText editor = (EditText)FindViewById(Resource.Id.editText1);

    editor.EditorAction += (sender, args) => {
        if (args.ActionId == Android.Views.InputMethods.ImeAction.Done) {
            editor.ClearFocus();
            linear.RequestFocus();
            Toast.MakeText(this, "IME Done", ToastLength.Short).Show();
        }
    };

    editor.FocusChange += (sender, args) => {
        if (args.HasFocus)
        {
            editor.SetSelection(editor.Text.Length);
            Toast.MakeText(this, "Focusing", ToastLength.Short).Show();
        }
        else {
            Toast.MakeText(this, "Unfocusing", ToastLength.Short).Show();
        }
    };
}

我不知道发生了什么。现在发生的事情是当我触摸EditText小部件时,我得到了#34; Focusing&#34;吐司但游标没有设置到最后。如果通过在线性布局上启用属性focusable,{{1并设置focusableInTouchMode

然后IME键盘显示。如果我单击UI箭头关闭键盘没有任何反应。如果我点击&#34;完成&#34;虚拟密钥,我得到&#34; IME Done&#34;吐司。 EditText确实没有聚焦,但虚拟键盘仍然存在。实际上,我的EditText有一个&#34;数字&#34; descendantFocusability="beforeDescendants"而键盘变成了常规文本键盘。

如果我删除input type行,那么当我点击&#34;完成&#34;在虚拟键盘上,EditText将自动重新聚焦,键盘不会消失,直到我手动隐藏它。 EditText小部件始终保持专注。我甚至无法找到如何检测&#34;虚拟键盘隐藏&#34;事件

我还尝试向linear.RequestFocus添加一个事件处理程序,但是每当我点击文本时,光标都会移动,无论是否有焦点。

我只是想了解在这里使用什么是正确的事件处理程序,但我根本不能理解这个例子中的行为,更不用说弄清楚我想要实现的目标。我们将不胜感激。

1 个答案:

答案 0 :(得分:0)

如果您想将光标设置在最后,请遵循以下解决方案:

final int numberOfItems = Integer.parseInt(yourEditText.getText().toString());
final int length = Integer.toString(numberOfItems).length();


        /* Move to last cursor in edit text */
        yourEditText.post(new Runnable() {
            @Override
            public void run() {
                yourEditText.setSelection(length);
            }
        });