Bir GridView öğesinde gezinmek için klavye kullanmaya çalışıyorum.Android GridView ile klavye navigasyonu ızgarayı kaydırmıyor
Yalnızca bir GridView içeren (android:focusable="true"
numaralı öğe görünümlerini içeren) kısa demoda, öğelerin hiçbirinin odaklanmadığını görebiliyorsunuz - ızgara, kaydırılan şeydir (öğeler turuncuya dönüşmüyor).
tıkladığınızda bir öğe üzerinde: android:descendantFocusability="afterDescendants"
ekleme
her öğe ilk odaklı olmak, ancak aşağı gitmek böylece yine, GridView kaydırmak için devam etmez verir (fare ile veya öğenin odaklanıp odaklanmasından sonra Return tuşuna basmakla), bir öğeyi maviye çevirir - basılı durumda olduğunu belirtir. düzeni @
/activity_my.xml: düzeni/dummy_item.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" />
:
<?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>
: çekilebilir/item_background.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" />
MyA (ListAdapter ile) ctivity.java:
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;
}
}
}
adaptör değiştirmeden, bir ListView GridView Swapping veya beklendiği gibi öğe görüntüleme/öğesi görünümü nitelikleri davranacaktır
- ürün odaklı olabilir ve ListView kaydıracaktır aşağıya, böylece tüm öğeler sadece klavye girişi kullanılarak odaklanabilir. Ayrıca, LineearLayoutManager/GridLayoutManager ile bir RecyclerView kullanarak da düzgün çalışacaktır.Bunu API 16 ve 22'de aynı sonuçlarla denedim. GridView'da android:descendantFocusability
özniteliği ayarlarını aynı sonuçla afterDescendents
olarak denedim.
Böyle bir ekran uygulamak için GridLayoutManager (ve öğe aralığı için, hesap öğe aralıkların içine alan bir ItemDecoration) ile bir RecyclerView kullanmak. Bu soru sadece merak için! – ataulm
Android'i denediniz mi: drawSelectorOnTop = "true" '? – Manu
@manu Cevabınız için teşekkürler. Sorun, seçici/odak ile değil, kaydırma yapamamaktadır (ikinci gifte görebilirsiniz, seçiciyi görebiliyorum, ancak hala kaydırma yapamıyorum). – ataulm