android setNextFocusDownId(...)未按预期执行

nzkunb0c  于 2023-05-27  发布在  Android
关注(0)|答案(1)|浏览(227)

我试图将多个EditText添加到GridLayout中,并希望能够指定当用户单击键盘上的“下一步”按钮时关注哪个EditText。
我以为这会像在每个EditText上设置setNextFocusDownId(...)方法一样简单,但不幸的是,这似乎不起作用。
我的布局文件只是由底部带有EditText的GridLayout组成:

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

    <android.support.v7.widget.GridLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:grid="http://schemas.android.com/apk/res-auto"

        android:id="@+id/Grid"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"

        android:layout_centerHorizontal="true"
        grid:columnCount="2">

    </android.support.v7.widget.GridLayout>

    <EditText
        android:id="@+id/Last"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:hint="Last"/>
</LinearLayout>

我的www.example.com文件中的代码MainActivity.java动态地添加了10个EditText,并尝试适当地分配'NextFocus':

public class MainActivity extends AppCompatActivity
{
    final Context context = this;

    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        GridLayout grid = (GridLayout) findViewById(R.id.Grid);
        int N=10;
        grid.setRowCount((N+1)/2);

        EditText prev = null;

        for (int i=0 ; i<N ; i++)
        {
            EditText t = new EditText(context);
            t.setInputType(InputType.TYPE_CLASS_TEXT);
            t.setMaxLines(1);
            t.setHint("" + i);
            grid.addView(t);

            if (prev != null)
                prev.setNextFocusDownId(t.getId());

            prev = t;
        }
    }
}

这确实创建了一个包含两列5个元素的网格,但是,单击顶部单元格并单击键盘上的Next箭头(“>”)会向下移动一行,而不是到达预期的“NextFocused”ExitText。
从“第0”单元格开始,“下一步”按钮将带您依次通过“默认”序列:'0' > '2' > '4' > '6' > '8' >“Last”(而不是预期的'0' > '1' > '2' >...> '9' >“last”)。
有趣的是,将NextFocused设置为findViewById(R.id.Last).getId()(而不是t.getId())确实会导致焦点从网格中的每个单元格跳到“Last”。你知道为什么这对t.getId()不起作用吗?
this question的答案似乎建议简单地设置'setNextFocusDownId(...)'就可以了,但它对我不起作用。访问动态创建的视图的ID与XML定义的视图有什么不同吗?
谢谢你,Slarti。

0vvn1miw

0vvn1miw1#

哈哈,搞定了!
我没有意识到这一点,但当一个视图是动态创建的,它的ID总是创建一个值,如果'-1'。但是,可以使用View的setId(int)为视图分配ID。从API级别17开始,可以使用generateViewId()生成一个ID用于此目的,但在API 17之前,您必须提出自己的ID。幸运的是,根据this postR.id...的值都大于0x 00 FFFFFF,所以简单地通过从'0'开始计数来创建动态ID应该可以让您很好地清除先前定义的值。
因此,在上面的示例中,只要创建TextView,就添加t.setId(i);行,很好地解决了这个问题。
有关动态分配ID的另一个很好回答的问题,请查看this question
干杯斯拉蒂

相关问题