【问题标题】:Not changing focus when calling setVisibility(View.VISIBLE)调用 setVisibility(View.VISIBLE) 时不改变焦点
【发布时间】:2016-01-06 21:00:01
【问题描述】:

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

标签: android focus visibility


【解决方案1】:

您可以尝试在 LinearLayout 上使用 android:descendantFocusabilitybeforeDescendants 参数吗?

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 上的方法。
  • 哇!它确实有效......谢谢!我必须执行以下操作: ((ViewGroup) fieldView).setDescendantFocusability(ViewGroup.FOCUS_BLOCK_DESCENDANTS); fieldView.setVisibility(View.VISIBLE); ((ViewGroup) fieldView).setDescendantFocusability(ViewGroup.FOCUS_AFTER_DESCENDANTS);
  • 我想你可以在你的 .xml 文件中设置我上面写的参数,它应该可以正常工作。只需添加 'android:descendantFocusability = "blocksDescendants"
  • 谢谢 - 我不确定它是否会完全阻止焦点 - 我不想这样做。我想暂时“关闭”焦点,直到我的可见性操作完成并重新打开。上面的代码完美运行。非常感谢您的帮助!!!
  • 感谢您的回答和评论@StephenMcCormick 在运行时更新descendantFocusability 也为我解决了同样的问题!
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 2013-04-17
    • 2011-05-10
    • 2017-09-27
    • 2016-09-07
    • 2013-04-14
    • 1970-01-01
    • 2012-10-21
    • 2012-07-22
    • 1970-01-01
    相关资源
    最近更新 更多