La navegación del teclado con Android GridView no desplaza la cuadrícula
focus (1)
Estoy tratando de usar un teclado para navegar a través de un GridView de elementos.
En la breve demostración, que solo contiene un GridView (que contiene vistas de elementos con android:focusable="true"
), puede ver que ninguno de los elementos se enfoca: la cuadrícula es lo que se desplaza (los elementos no se vuelven de color naranja ).
Agregar el android:descendantFocusability="afterDescendants"
permite que cada elemento se enfoque primero, pero aún así, no continúa desplazando el GridView para que puedas navegar hacia abajo:
Al hacer clic en un elemento (con el mouse o al presionar Retorno si el elemento estaba enfocado, después de la corrección de enfocabilidad descendente), el elemento se vuelve azul, lo que indica que está en estado de presión.
@ layout / activity_my.xml:
<?xml version="1.0" encoding="utf-8"?>
<GridView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/listview"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:numColumns="2" />
@ layout / dummy_item.xml:
<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/dummy_item_parent"
android:layout_width="match_parent"
android:layout_height="150dp"
android:gravity="center"
android:focusable="true"
android:clickable="true"
android:background="@drawable/item_background" />
@ drawable / item_background.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/holo_blue_light" />
<item android:state_focused="true" android:drawable="@android:color/holo_orange_light" />
<item android:drawable="@android:color/holo_red_light" />
</selector>
MyActivity.java (con ListAdapter):
public class MyActivity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_my);
AbsListView listview = (AbsListView) findViewById(R.id.listview);
listview.setAdapter(new DummyAdapter(getLayoutInflater()));
}
private static class DummyAdapter extends BaseAdapter {
private static final int COUNT = 25;
private final LayoutInflater layoutInflater;
DummyAdapter(LayoutInflater layoutInflater) {
this.layoutInflater = layoutInflater;
}
@Override
public int getCount() {
return COUNT;
}
@Override
public String getItem(int position) {
return "Item " + position;
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View view = convertView;
if (view == null) {
view = layoutInflater.inflate(R.layout.dummy_item, parent, false);
}
((TextView) view).setText(getItem(position));
return view;
}
}
}
El intercambio de GridView por un ListView, sin cambiar el adaptador, o los atributos de vista de elemento / vista de elemento, se comportará como se esperaba - los elementos pueden enfocarse y el ListView se desplazará a la parte inferior, de modo que todos los elementos se puedan enfocar solo con la entrada del teclado . Además, el uso de RecyclerView con LinearLayoutManager / GridLayoutManager también funcionará correctamente.
He intentado esto en API 16 y 22 con los mismos resultados. He intentado configurar el atributo android:descendantFocusability
en el GridView a afterDescendents
con el mismo resultado.
Intenté tu código y no funciona con GridView, como dijiste, pero también tengo algunos problemas con ListView
. El ListView
desplaza correctamente, pero solo se resalta el primer elemento de cada página.
Con estas pequeñas modificaciones, puede lograr el efecto que desea tanto en GridView como en ListView.
Elimine android:descendantFocusability
en activity_my.xml:
<?xml version="1.0" encoding="utf-8"?>
<GridView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/listview"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:numColumns="2" />
Eliminar android:focusable
enfocable en dummy_item.xml:
<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/dummy_item_parent"
android:layout_width="match_parent"
android:layout_height="150dp"
android:gravity="center"
android:clickable="true"
android:background="@drawable/item_background" />
Cambio de android:state_focused
a android:state_selected
en item_background.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/holo_blue_light" />
<item android:state_selected="true" android:drawable="@android:color/holo_orange_light" />
<item android:drawable="@android:color/holo_red_light" />
</selector>