【问题标题】:setNextFocusDownId(...) Not Doing as ExpectedsetNextFocusDownId(...) 未按预期执行
【发布时间】:2017-12-15 03:26:31
【问题描述】:

我正在尝试将多个 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>

我的 MainActivity.java 文件中的代码会动态添加 10 个 EditTexts 并尝试适当地分配“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 个元素的网格,但是,单击顶部单元格并单击键盘上的下一个箭头 (">") 会将您向下一行而不是预期的“NextFocused”ExitText。

从“0th”单元格开始,“下一步”按钮将带您依次完成“默认”序列: '0' > '2' > '4' > '6' > '8' > "Last" (而不是预期的 '0' > '1' > '2' > ... > '9' > "last ")。

有趣的是,将 NextFocused 设置为 findViewById(R.id.Last).getId()(而不是 t.getId())确实会导致焦点从网格中的每个单元格跳转到“最后一个”。知道为什么这对t.getId() 不起作用。

this question 的答案似乎建议简单地设置 'setNextFocusDownId(...)' 应该可以解决问题,但它对我不起作用。访问动态创建的视图的 ID 与我不太了解的 XML 定义的视图有什么不同吗?

谢谢, 斯拉尔蒂。

【问题讨论】:

    标签: android android-edittext keyboard grid-layout next


    【解决方案1】:

    呵呵,搞定了!

    我没有意识到,但是当动态创建一个视图时,它的 ID 总是创建一个值为“-1”的值。但是,可以使用视图的setId(int) 为视图分配一个 ID。从 API 级别 17 开始,可以使用generateViewId() 生成用于此目的的 ID,但在 API 17 之前,您必须提供自己的 ID。幸运的是,根据this postR.id... 的值都大于 0x00FFFFFF,因此通过从 '0' 向上计数来简单地创建动态 ID 应该可以让您远离之前定义的值。

    因此,在上面的示例中创建 TextView 后立即添加行 t.setId(i); 可以很好地解决问题。

    有关动态分配 ID 的另一个得到很好回答的问题,请查看 this question

    干杯, 斯拉尔蒂。

    【讨论】:

      猜你喜欢
      • 2013-08-20
      • 2011-02-25
      • 2012-11-23
      • 2014-10-20
      • 2015-09-17
      • 2015-07-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多