调用setVisibility(View.VISIBLE)时不改变焦点

15

我有这样的一个场景,当某个操作发生时,我想让特定的字段可见。这很好用,但是当我在一个包含一些其他字段(如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);

尝试设置 editText.setFocusable(false) - Jas
2个回答

11
你可以尝试在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.

这需要在运行时发生...基本上我需要使LinearLayout的内容可见,但不希望子项也可见。在View上似乎没有相应的方法。 - Stephen McCormick
2
哇!它真的起作用了...谢谢!不过我还需要执行以下操作: ((ViewGroup) fieldView).setDescendantFocusability(ViewGroup.FOCUS_BLOCK_DESCENDANTS); fieldView.setVisibility(View.VISIBLE); ((ViewGroup) fieldView).setDescendantFocusability(ViewGroup.FOCUS_AFTER_DESCENDANTS); - Stephen McCormick
我认为你可以在你的.xml文件中设置我上面写的参数,这样应该就可以正常工作了。只需添加'android:descendantFocusability =“blocksDescendants”即可。 - Radek O
谢谢 - 我不确定它是否会完全阻止焦点 - 这是我不想做的。我想要在我的可见性操作完成之前“关闭”焦点,然后再打开它。上面的代码完美地解决了这个问题。非常感谢您的帮助!!! - Stephen McCormick
感谢您的回答和评论@StephenMcCormick 在运行时更新descendantFocusability也解决了我遇到的同样问题! - dev2505

0
我发现将View.INVISIBLE更改为View.VISIBLE不会导致焦点的改变。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接