2015-04-25 17 views
16

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).

with descendent focusability set

tıkladığınızda bir öğe üzerinde: android:descendantFocusability="afterDescendants" ekleme

scrolling short demo

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 @

clicking grid items

/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.

+0

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

+0

Android'i denediniz mi: drawSelectorOnTop = "true" '? – Manu

+0

@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

cevap

1

Kodunuzu denedim ve GridView ile çalıştığınız gibi çalışmıyor, ancak ListView ile de bir sorunum var. ListView doğru olarak kaydırır, ancak her sayfanın yalnızca ilk öğesi vurgulanır.

Bu küçük değişikliklerle hem GridView hem de ListView'de istediğiniz efekti elde edebilirsiniz. activity_my.xml içinde

Kaldır android:descendantFocusability:

<?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" /> 

dummy_item.xml içinde android:focusable kaldırın: item_background içinde android:state_selected için android:state_focused den

<?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" /> 

değişikliği.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> 
+0

durumunun aynı olması durumu seçilmiş durumdan farklı olsa da - aslında seçilen öğeleri temsil etmek istediğiniz durumu da dikkate alın, Örneğin çoklu seçim modunda: ayrıca, "selected", "focus" ve "selected + focused" durumlarının erişilebilir olması gerekir. – ataulm

+0

bu, GridView'in yalnızca çöp olduğunu vurgulamaktadır - Izgarada ilerlerken öğeler ('view.setSelected (true)') seçilmemelidir, ancak bu iyi bir çözümdür (seçilen durumu kullanarak) - güvenebilir Bir öğeyi seçmek istediğinizde, 'DisplayView' ve 'view.setChecked (true) 'işlevlerinde SetSelected öğesinin ne zaman yapılacağını seçmek için' state_checked '. Teşekkürler! – ataulm

+0

bir son yorum - Ben yanıldım - 'selected' kavramsal olarak, aynı zamanda, kaynak odaklı olarak, onlar (Google) bile adlandırma için özür dileriz! 'setActivated (boolean) ',' setSelected (boolean)' olacağını hayal ettiğim şeydir. – ataulm