Android custom ListView with ImageButton is not getting focus

nidhi_adiga picture nidhi_adiga · Mar 6, 2013 · Viewed 13k times · Source

I am developing an app for android TV. I have a listview with an ImageButton + Textviews as children. As TV does not take touch events but uses D-PAD or trackball remote I have to get focus on all clickable items so that user knows where the focus is. But the problem is I can get focus on list row if I add

android:descendantFocusability="blocksDescendants"

in the custom list row layout but ImageButton in the list row will not get focus. And if I remove above code then ImageButton gets focus but I can't click list row.

Also I added setItemsCanFocus for my ListView but no luck, nothing changed. I read many documents but i could not find a proper answer for this problem. I want focus on both List row as well as ImageButton. Is it possible, if any one knows please help me...

Answer

RobinHood picture RobinHood · Apr 1, 2013

I have to get focus on all clickable items so that user knows where the focus is. But the problem is I can get focus on list row if I add

View getting hang up due to multiple views inside row file, to get click You have to add one more property to your main layout of row xml.

android:descendantFocusability="blocksDescendants

But when I write above property then I'm not able to focus ImageButton which is in my row file.

I just tried one way to acheive to get foucus on ImageButton as well as on listview.

To get focus on ImageButton:

  1. Create one selector file.
  2. Applied on Imagebutton.
  3. Added android:focusableInTouchMode="true" to ImageButton.

To get focus on Listview:

  1. Add android:descendantFocusability="blocksDescendants to main-layout within row xml.

Now when you click on your ImageButton it will focus with your desire color even it will focus on listview click too.

Selecotor.xml

<?xml version="1.0" encoding="utf-8"?>
<selector 
    xmlns:android="http://schemas.android.com/apk/res/android"
    >
    <item 
        android:state_pressed="true"
        android:drawable="@android:color/transparent" 
        /> <!-- pressed -->    
    <item 
        android:state_focused="true"
        android:drawable="@android:color/darker_gray" 
        /> <!-- focused -->    
    <item 
        android:drawable="@android:drawable/btn_star" 
        /> <!-- default -->
</selector>

Tested in S3 emulator, works well.