我很难使用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
添加一个事件处理程序,但是每当我点击文本时,光标都会移动,无论是否有焦点。
我只是想了解在这里使用什么是正确的事件处理程序,但我根本不能理解这个例子中的行为,更不用说弄清楚我想要实现的目标。我们将不胜感激。
答案 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);
}
});