调用 setVisibility(View.VISIBLE) 时不改变焦点
Not changing focus when calling setVisibility(View.VISIBLE)
我有一个场景,当某个动作发生时,我想让某些字段可见。这工作正常,但是当我在包含一些其他字段(例如 TextEdit)的 LinearLayout 上调用 setVisible(View.VISIBLE) 时,焦点转移到 TextEdit(或者至少屏幕滚动到它)。
有没有办法在调用 setVisibility(View.VISIBLE) 时不改变焦点?
我可以调用 setVisible 的 LinearLayout 的 XML 布局:
<LinearLayout
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:focusable="true"
android:focusableInTouchMode="true">
<TextView
android:id="@+id/name"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:textSize="18sp"
android:textStyle="normal"
android:paddingLeft="5dp"
android:paddingRight="5dp"
android:paddingBottom="5dp"
android:text="" />
<EditText android:id="@+id/entry"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:inputType="textMultiLine"
android:gravity="right" />
<View
android:layout_marginTop="8dp"
android:layout_width="match_parent"
android:layout_height="1dp"
android:background="@color/grey"
android:visibility="gone" />
</LinearLayout>
初始化它的代码:
private TextView mName;
private EditText mEntry;
...
private void initialize() {
LayoutInflater inflater = (LayoutInflater)mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
inflater.inflate(R.layout.field_multiline_entry, this);
// setup fields
mName = (TextView)findViewById(R.id.name);
mEntry = (EditText)findViewById(R.id.entry);
mEntry.addTextChangedListener(textWatcher);
}
以及调用 setVisibility 的代码:
if(sectionFieldView != null && sectionFieldView.getVisibility() != View.VISIBLE)
{
sectionFieldView.setVisibility(View.VISIBLE);
}
谢谢!
更新
感谢我下面的朋友,下面的代码有效。它基本上使 LinearLayout 的所有后代无法获得焦点,这意味着当屏幕可见时,屏幕不会滚动到它们,因为它们没有获得焦点。迄今为止,我发现防止这种情况发生的唯一方法...
((ViewGroup) fieldView).setDescendantFocusability(ViewGroup.FOCUS_BLOCK_DESCENDANTS);
fieldView.setVisibility(View.VISIBLE);
((ViewGroup) fieldView).setDescendantFocusability(ViewGroup.FOCUS_AFTER_DESCENDANTS);
您可以在 LinearLayout 上尝试使用 android:descendantFocusability
和 beforeDescendants
参数吗?
Constant Value Description
beforeDescendants 0 The ViewGroup will get focus before any of its descendants.
afterDescendants 1 The ViewGroup will get focus only if none of its descendants want it.
blocksDescendants 2 The ViewGroup will block its descendants from receiving focus.
我发现将 View.INVISIBLE 更改为 View.VISIBLE 不会导致焦点发生变化。
我有一个场景,当某个动作发生时,我想让某些字段可见。这工作正常,但是当我在包含一些其他字段(例如 TextEdit)的 LinearLayout 上调用 setVisible(View.VISIBLE) 时,焦点转移到 TextEdit(或者至少屏幕滚动到它)。
有没有办法在调用 setVisibility(View.VISIBLE) 时不改变焦点?
我可以调用 setVisible 的 LinearLayout 的 XML 布局:
<LinearLayout
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:focusable="true"
android:focusableInTouchMode="true">
<TextView
android:id="@+id/name"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:textSize="18sp"
android:textStyle="normal"
android:paddingLeft="5dp"
android:paddingRight="5dp"
android:paddingBottom="5dp"
android:text="" />
<EditText android:id="@+id/entry"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:inputType="textMultiLine"
android:gravity="right" />
<View
android:layout_marginTop="8dp"
android:layout_width="match_parent"
android:layout_height="1dp"
android:background="@color/grey"
android:visibility="gone" />
</LinearLayout>
初始化它的代码:
private TextView mName;
private EditText mEntry;
...
private void initialize() {
LayoutInflater inflater = (LayoutInflater)mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
inflater.inflate(R.layout.field_multiline_entry, this);
// setup fields
mName = (TextView)findViewById(R.id.name);
mEntry = (EditText)findViewById(R.id.entry);
mEntry.addTextChangedListener(textWatcher);
}
以及调用 setVisibility 的代码:
if(sectionFieldView != null && sectionFieldView.getVisibility() != View.VISIBLE)
{
sectionFieldView.setVisibility(View.VISIBLE);
}
谢谢!
更新
感谢我下面的朋友,下面的代码有效。它基本上使 LinearLayout 的所有后代无法获得焦点,这意味着当屏幕可见时,屏幕不会滚动到它们,因为它们没有获得焦点。迄今为止,我发现防止这种情况发生的唯一方法...
((ViewGroup) fieldView).setDescendantFocusability(ViewGroup.FOCUS_BLOCK_DESCENDANTS);
fieldView.setVisibility(View.VISIBLE);
((ViewGroup) fieldView).setDescendantFocusability(ViewGroup.FOCUS_AFTER_DESCENDANTS);
您可以在 LinearLayout 上尝试使用 android:descendantFocusability
和 beforeDescendants
参数吗?
Constant Value Description
beforeDescendants 0 The ViewGroup will get focus before any of its descendants.
afterDescendants 1 The ViewGroup will get focus only if none of its descendants want it.
blocksDescendants 2 The ViewGroup will block its descendants from receiving focus.
我发现将 View.INVISIBLE 更改为 View.VISIBLE 不会导致焦点发生变化。