setNextFocusDownId(...) 未按预期执行
setNextFocusDownId(...) Not Doing as Expected
我正在尝试将多个 EditText 添加到 GridLayout,并希望能够指定当用户单击键盘上的 "Next" 按钮时聚焦哪个 EditText。
我认为这会像在每个 EditText 上设置 setNextFocusDownId(...)
方法一样简单,但不幸的是这似乎不起作用。
我的布局文件只包含一个 GridLayout,底部有一个 EditText:
<?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 个 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 个元素的网格,但是,单击顶部单元格并单击键盘上的下一个箭头(“>”)会将您带到一行而不是预期的 "NextFocused" 退出文本。
从“第 0 个”单元格开始,"next" 按钮将带您依次完成 'default' 序列:
'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 定义的视图有什么不同吗?
谢谢,
斯拉蒂
呵呵,搞定了!
我没有意识到,但是当动态创建视图时,它的 ID 始终使用值“-1”创建。但是,可以使用视图的 setId(int)
将 ID 分配给视图。从 API 级别 17 开始,可以使用 generateViewId()
生成用于此目的的 ID,但在 API 17 之前,您必须想出自己的 ID。幸运的是,根据 this post,R.id...
值都大于 0x00FFFFFF,因此只需通过从“0”向上计数来创建动态 ID,就可以让您清楚地了解先前定义的值。
因此,在上面的示例中创建 TextView 后立即添加行 t.setId(i);
可以很好地解决问题。
有关动态分配 ID 的另一个回答得很好的问题,请查看 this question。
干杯,
斯拉蒂
我正在尝试将多个 EditText 添加到 GridLayout,并希望能够指定当用户单击键盘上的 "Next" 按钮时聚焦哪个 EditText。
我认为这会像在每个 EditText 上设置 setNextFocusDownId(...)
方法一样简单,但不幸的是这似乎不起作用。
我的布局文件只包含一个 GridLayout,底部有一个 EditText:
<?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 个 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 个元素的网格,但是,单击顶部单元格并单击键盘上的下一个箭头(“>”)会将您带到一行而不是预期的 "NextFocused" 退出文本。
从“第 0 个”单元格开始,"next" 按钮将带您依次完成 'default' 序列: '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 定义的视图有什么不同吗?
谢谢, 斯拉蒂
呵呵,搞定了!
我没有意识到,但是当动态创建视图时,它的 ID 始终使用值“-1”创建。但是,可以使用视图的 setId(int)
将 ID 分配给视图。从 API 级别 17 开始,可以使用 generateViewId()
生成用于此目的的 ID,但在 API 17 之前,您必须想出自己的 ID。幸运的是,根据 this post,R.id...
值都大于 0x00FFFFFF,因此只需通过从“0”向上计数来创建动态 ID,就可以让您清楚地了解先前定义的值。
因此,在上面的示例中创建 TextView 后立即添加行 t.setId(i);
可以很好地解决问题。
有关动态分配 ID 的另一个回答得很好的问题,请查看 this question。
干杯, 斯拉蒂