Can someone explain descendantFocusability = afterDescendants?

Android

Android Problem Overview


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

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

Android Solutions


Solution 1 - Android

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 http://www.programcreek.com/java-api-examples/index.php?source_dir=Android-Demo-Projects-master/layout/Listviews/src/net/sosiouxme/listviews/Main.java">here</a>;.

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

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionStackOverflowerView Question on Stackoverflow
Solution 1 - AndroidPranav KarnikView Answer on Stackoverflow