如何以编程方式将焦点从一个EditText字段更改为下一个EditText字段?

时间:2019-06-06 17:06:27

标签: android

我的Android应用程序具有以下布局:

<layout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools">

    <data>

        <variable
            name="viewModel"
            type="org.myorganization.MyViewModel" />
    </data>

    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:clickable="true"
        android:focusableInTouchMode="true"
        android:animateLayoutChanges="true">

        <TextView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginStart="16dp"
            android:layout_marginTop="16dp"
            android:layout_marginEnd="16dp"
            android:textSize="18sp" />

        <TableRow
            android:layout_width="match_parent"
            android:layout_height="50dp"
            android:layout_marginStart="16dp"
            android:layout_marginTop="8dp"
            android:layout_marginEnd="16dp">

            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:textSize="16sp" />

            <TextView
                android:layout_width="0dip"
                android:layout_height="match_parent"
                android:layout_marginStart="8dp"
                android:layout_weight="0.3"
                android:gravity="center"
                android:textAlignment="center"
                android:textSize="18sp" />

            <EditText
                android:id="@+id/editText01"
                android:layout_width="0dip"
                android:layout_height="match_parent"
                android:layout_weight="1"
                android:inputType="numberDecimal|numberSigned"
                android:textAlignment="center" />

            <TextView
                android:layout_width="0dip"
                android:layout_height="match_parent"
                android:layout_weight="0.2"
                android:text="\u00B0"
                android:textSize="24sp" />

            <EditText
                android:id="@+id/editText02"
                android:layout_width="0dip"
                android:layout_height="match_parent"
                android:layout_weight="1"
                android:inputType="number"
                android:textAlignment="center" />

            <TextView
                android:layout_width="0dip"
                android:layout_height="match_parent"
                android:layout_weight="0.1"
                android:text="'"
                android:textSize="24sp" />

            <EditText
                android:id="@+id/editText03"
                android:layout_width="0dip"
                android:layout_height="match_parent"
                android:layout_weight="1"
                android:inputType="number"
                android:textAlignment="center" />

            <TextView
                android:layout_width="0dip"
                android:layout_height="match_parent"
                android:layout_weight="0.1"
                android:text='\"'
                android:textSize="24sp" />

        </TableRow>

        <TableRow
            android:layout_width="match_parent"
            android:layout_height="50dp"
            android:layout_marginStart="16dp"
            android:layout_marginTop="8dp"
            android:layout_marginEnd="16dp">

            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:textSize="16sp" />

            <TextView
                android:layout_width="0dip"
                android:layout_height="match_parent"
                android:layout_marginStart="8dp"
                android:layout_weight="0.3"
                android:gravity="center"
                android:textAlignment="center"
                android:textSize="18sp" />

            <EditText
                android:id="@+id/editText04"
                android:layout_width="0dip"
                android:layout_height="match_parent"
                android:layout_weight="1"
                android:enabled="true"
                android:inputType="numberDecimal|numberSigned"
                android:textAlignment="center" />

            <TextView
                android:layout_width="0dip"
                android:layout_height="match_parent"
                android:layout_weight="0.2"
                android:text="\u00B0"
                android:textSize="24sp" />

            <EditText
                android:id="@+id/editText05"
                android:layout_width="0dip"
                android:layout_height="match_parent"
                android:layout_weight="1"
                android:inputType="number"
                android:textAlignment="center" />

            <TextView
                android:layout_width="0dip"
                android:layout_height="match_parent"
                android:layout_weight="0.1"
                android:text="'"
                android:textSize="24sp" />

            <EditText
                android:id="@+id/editText06"
                android:layout_width="0dip"
                android:layout_height="match_parent"
                android:layout_weight="1"
                android:inputType="number"
                android:textAlignment="center" />

            <TextView
                android:layout_width="0dip"
                android:layout_height="match_parent"
                android:layout_weight="0.1"
                android:text='\"'
                android:textSize="24sp" />
        </TableRow>

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginStart="16dp"
            android:layout_marginTop="8dp"
            android:textSize="16sp" />

        <EditText
            android:id="@+id/editTextExternal"
            android:layout_width="match_parent"
            android:layout_height="50dp"
            android:layout_marginStart="16dp"
            android:layout_marginTop="8dp"
            android:layout_marginEnd="16dp"
            android:gravity="top"
            android:inputType="textMultiLine"
            android:maxLength="150" />

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_alignParentBottom="true"
            android:orientation="horizontal">

            <Button
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:layout_alignParentStart="true"
                android:layout_marginStart="16dp"
                android:layout_marginBottom="16dp"
                android:layout_weight="1"
                android:text="Cancel" />

            <Button
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:layout_alignParentEnd="true"
                android:layout_marginEnd="16dp"
                android:layout_marginBottom="16dp"
                android:layout_weight="1"
                android:text="Save" />

        </LinearLayout>

    </RelativeLayout>

</layout>

我希望能够以编程方式(即从Java代码中)从一个EditText字段移至另一个字段,但是我不知道该怎么做。我已经尝试了许多变体:

EditText editText = findViewById(editText01,2,3,4,5,6);
editText.focusSearch(FOCUS_RIGHT, FOCUS_LEFT, FOCUS_UP, FOCUS_DOWN);

editText.setFocusable();
editText.getFocusable();

editText.setFocusable(editText.getNextFocusForwardId());
...

甚至:

editText.focusSearch(FOCUS_FORWARD);

出于某些原因,AndroidStudio不允许我这样做。

我要尝试的是模拟键盘并复制“下一步”按钮。我使用了 HERE

找到的教程

那么,如何在Android中以编程方式将焦点从一个EditText字段更改为下一个EditText字段?


编辑:

这是我用于EditText.requestFocus()解决方案的代码:

private View.OnFocusChangeListener fieldFocusListener = new View.OnFocusChangeListener()
{
    @Override
    public void onFocusChange(View view, boolean isFocused)
    {
        if (isFocused)
        {
            int nextField = 0;
            EditText[] editTexts = {findViewById(R.id.editText01), findViewById(R.id.editText02), findViewById(R.id.editText03), findViewById(R.id.editText04), findViewById(R.id.editText05), findViewById(R.id.editText06)};
            EditText editText = findViewById(view.getId());

            for (int i = 0; i < editTexts.length; i++)
            {
                if (editTexts[i] == editText)
                    binding.customKeybaordLayout.setFocusedField(editTexts[(i != (editTexts.length - 1)) ? (i + 1) : 0]);
            }
        }
    }
};

2 个答案:

答案 0 :(得分:2)

使用editText.requestFocus();转到所需的editText, 然后使用以下代码打开键盘:

InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
imm.showSoftInput(editText, InputMethodManager.SHOW_IMPLICIT);

您可以使用以下代码强制打开键盘:

InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
imm.toggleSoftInput(InputMethodManager.SHOW_FORCED, 0); 

您必须在XML中设置android:nextFocusDown,并在此之后设置要聚焦的EditText

之后,您需要使用以下代码获取下一个可聚焦的EditText / View:

EditText nextEditText = (EditText)currentEditText.focusSearch(View.FOCUS_DOWN);
nextEditText.requestFocus();

答案 1 :(得分:1)

您必须使用editText.requestFocus();