Доступ к списку из PreferenceFragment - PullRequest
3 голосов
/ 02 декабря 2011

Мне нужно обрабатывать навигацию PreferenceFragment с помощью D-PAD в GoogleTV. Для этого мне нужно получить доступ к ListView (первый и последний элементы) PreferenceFragment.

В приведенном ниже коде я смог получить доступ к дочерним элементам списка, но он был пустым. Тем не менее, если я отлаживаюсь, я вижу, что создаются 12 детей, но они равны нулю, поэтому возвращаемое количество равно '0'

@Override
 public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState){
    //Log.d(DEBUG_TAG, "onCreateView");
    View v = inflater.inflate(R.layout.settings_tile, null);
    closeBtn = (ImageView) v.findViewById(R.id.settingsCloseButton);
    ListView lv = (ListView) v.findViewById(android.R.id.list);
    lv.getChildCount();
    return v;
}

Ниже приведен xml для PreferenceScreen ... обратите внимание, что это Pref-экраны в Pref-экранах:

<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen
  xmlns:android="http://schemas.android.com/apk/res/android"
  android:key="main_pref">
      <PreferenceCategory
            android:title="@string/units">
           <ListPreference
               android:key="pref_unit_temp"
               android:title="@string/temperature"
               android:defaultValue="@string/default_metric"
               android:entries="@array/pref_temp_units"
               android:entryValues="@array/pref_temp_units_values"
               android:dialogTitle="@string/units"
               android:layout="@layout/settings_item"
               />
    </PreferenceCategory>
    <PreferenceCategory
        android:title="@string/advanced">
        <ListPreference
            android:key="pref_speed"
            android:title="@string/speed"
            android:entries="@array/pref_speed"
            android:entryValues="@array/pref_speed_values"
            android:defaultValue="@string/default_metric"
            android:layout="@layout/settings_item"/>
        <ListPreference
            android:key="pref_measurement"
            android:title="@string/measurement"
            android:entries="@array/pref_measurement"
            android:entryValues="@array/pref_measurement_values"
            android:defaultValue="@string/default_metric"
            android:layout="@layout/settings_item"/>
        <ListPreference
            android:key="pref_time"
            android:title="@string/time_format"
            android:entries="@array/pref_time"
            android:entryValues="@array/pref_time_values"
            android:defaultValue="@string/default_metric"
            android:layout="@layout/settings_item"/>
        <ListPreference
            android:key="pref_date"
            android:title="@string/date_format"
            android:entries="@array/pref_date"
            android:entryValues="@array/pref_date_values"
            android:defaultValue="@string/default_metric"
            android:layout="@layout/settings_item"/>
    </PreferenceCategory>
        <PreferenceScreen
                android:title="@string/terms_conditions"
                android:summary=""
                android:layout="@layout/settings_item">
            <intent android:action="android.intent.action.VIEW"
                    android:data="http://www.accuweather.com/m/EULA.aspx" />
        </PreferenceScreen>        

    </PreferenceCategory>
</PreferenceScreen>

Могу ли я получить доступ по крайней мере к первому и последнему элементу "Температура" и "Условия и положения", как показано на рисунке ниже:

enter image description here

1 Ответ

6 голосов
/ 02 декабря 2011

Вот решение для доступа к просмотру списка и управления с помощью dpad:

@Override
     public View onCreateView(LayoutInflater inflater, ViewGroup container,
                Bundle savedInstanceState){
        //Log.d(DEBUG_TAG, "onCreateView");
        View v = inflater.inflate(R.layout.settings_tile, null);
        closeBtn = (ImageView) v.findViewById(R.id.settingsCloseButton);
        final ListView lv = (ListView) v.findViewById(android.R.id.list);
        lv.setOnKeyListener(new OnKeyListener() {
            @Override
            public boolean onKey(View v, int keyCode, KeyEvent event) {
                // TODO Auto-generated method stub
                if (event.getAction() == KeyEvent.ACTION_DOWN) {
                    switch(keyCode) {
                        case KeyEvent.KEYCODE_DPAD_DOWN:
                            return !(lv.getSelectedItemPosition() < lv.getCount() - 1);
                        case KeyEvent.KEYCODE_DPAD_UP:
                            return lv.getSelectedItemPosition() == 1;
                        case KeyEvent.KEYCODE_DPAD_RIGHT:
                            return true;    
                    }
                    return false;
                }
                return false;
            }
        });
        return v;
    }
...