Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Can someone explain descendantFocusability = afterDescendants?

Tags:

android

I'm having hard time understanding descendantFocusability. Very particulary afterDescendants.

Could someone show me an example of when this would be useful?

like image 594
StackOverflower Avatar asked Sep 21 '16 20:09

StackOverflower


1 Answers

Defines the relationship between the ViewGroup and its descendants when looking for a View to take focus.

Must be one of the following constant values.

+------------------------------------------------------------------------------------------+
|      Constant            Value            Description                                    |
+------------------------------------------------------------------------------------------+
| afterDescendants           1          The ViewGroup will get focus only if               |
|                                       none of its descendants want it.                   |
+------------------------------------------------------------------------------------------+
| beforeDescendants          0          The ViewGroup will get focus before                |
|                                       any of its descendants.                            |
+------------------------------------------------------------------------------------------+
| blocksDescendants          2          The ViewGroup will block its descendants from      |
|                                       receiving focus.                                   |
+------------------------------------------------------------------------------------------+

You can check the complete example here.

The snippet is :

public void onItemSelected(AdapterView<?> parent, View view,
        int position, long id) {
    ListView listView = getListView();
    Log.d(TAG, "onItemSelected gave us " + view.toString());
    Button b = (Button) view.findViewById(R.id.button);
    EditText et = (EditText) view.findViewById(R.id.editor);
    if (b != null || et != null) {
        // Use afterDescendants to keep ListView from getting focus
        listView.setDescendantFocusability(ViewGroup.FOCUS_AFTER_DESCENDANTS);
        if(et!=null) et.requestFocus();
        else if(b!=null) b.requestFocus();
    } else {
        if (!listView.isFocused()) {
            // Use beforeDescendants so that previous selections don't re-take focus
            listView.setDescendantFocusability(ViewGroup.FOCUS_BEFORE_DESCENDANTS);
            listView.requestFocus();
        }
    }

}

As per the above snippet, afterDescendants is used to prevent listview from getting focus, so that either EditText or Button can request focus.

Note: The link provided above is broken. Please refer to my Gist for the code

like image 175
Pranav Karnik Avatar answered Nov 09 '22 05:11

Pranav Karnik