Экран настроек DPad Nav Google TV - PullRequest
0 голосов
/ 18 ноября 2011

У меня есть настройки, созданные из XML, preferenceFragment и левой навигации.Когда я выбираю «Настройки», мои префрагменты выходят ... Я могу использовать DPad для перемещения вверх и вниз, когда больше нет выбора внизу, курсор останавливается (желаемое поведение), но когда я двигаюсь вверх по списку,курсор продолжается до левой навигационной панели.Я хочу, чтобы это остановилось на вершине.Ниже мой pref_screen xml.Моя левая рука создана со стороны кода.Я понятия не имею, как использовать логику DPad в этом.Я также хочу ограничить перемещение DPad курсором в левое меню навигации, если во фрагменте настроек.

    <?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><!--
    <PreferenceCategory
            android:title="Weather Notification Bar">
          <CheckBoxPreference
               android:key="pref_notification_enable"
               android:title="Enable Notifications"
               android:summary="Turn on/off status bar weather notifications"
               android:defaultValue="true"
               android:enabled="false"/>
          <ListPreference
               android:key="pref_notification_update_method"
               android:dependency="pref_notification_enable"
               android:title="Choose notification update method"
               android:summary="Manual, Automatic, Interval"
               android:entries="@array/pref_notification_update_method"
               android:entryValues="@array/pref_notification_update_method_values"
               android:dialogTitle="Update Method" />
          <ListPreference
               android:key="pref_notification_interval"
               android:title="Interval to update"
               android:dependency="pref_notification_enable"
               android:summary="Use this to set the update interval if interval method is selected"
               android:entries="@array/pref_notification_interval"
               android:entryValues="@array/pref_notification_interval_values"
               android:dialogTitle="Update Interval" />
    </PreferenceCategory>
    -->
    <!--<PreferenceCategory
            android:title="Background">
          <CheckBoxPreference
               android:key="background_enabled"
               android:title="Enable Interactive Background"
               android:summary="Turn off to improve performance"
               android:defaultValue="true"
               android:enabled="true"/>
    </PreferenceCategory>
    --><PreferenceCategory
          android:title="AccuWeather">
        <!-- <PreferenceScreen
                android:title="@string/call_us"
                android:summary=""
                android:layout="@layout/settings_item">
            <intent android:action="android.intent.action.DIAL"
                    android:data="tel:8142358650" />
        </PreferenceScreen>
        <PreferenceScreen
                android:title="@string/email_us"
                android:summary="customerservice@accuweather.com"
                android:layout="@layout/settings_item">
                <intent android:action="com.accuweather.android.tablet.EMAIL_ACCUWX"
                 />
            <intent android:action="android.intent.action.SENDTO"
                android:data="customerservice@accuweather.com"/>
       </PreferenceScreen> -->
        <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 Ответ

0 голосов
/ 07 декабря 2011

Мне пришлось придумать способ изобразить позиции и детей для работы с dpad. Вот код, который я написал, чтобы справиться с этим:

@Override
 public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState){
    View v = inflater.inflate(R.layout.settings_tile, null);
    final ImageView closeBtn = (ImageView) v.findViewById(R.id.settingsCloseButton);
    closeBtn.setFocusable(true);
    closeBtn.setOnClickListener(this);
    closeBtn.setOnFocusChangeListener(new OnFocusChangeListener() {

        @Override
        public void onFocusChange(View v, boolean hasFocus) {
            if (hasFocus) {
                v.setOnKeyListener(new OnKeyListener() {
                    @Override
                    public boolean onKey(View v, int keyCode, KeyEvent event) {
                        if (keyCode == KeyEvent.KEYCODE_DPAD_CENTER) {
                            return false;
                        }
                        if (event.getAction() == KeyEvent.ACTION_DOWN) {
                            return !(KeyEvent.KEYCODE_DPAD_DOWN == keyCode);
                        }
                        return false;
                    }
                });
            } else {
                v.setOnKeyListener(null);
            }

        }
    });
    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:
                        if (lv.getSelectedItemPosition() == 1) {
                            closeBtn.requestFocus();
                        }
                        return lv.getSelectedItemPosition() == 1;
                    case KeyEvent.KEYCODE_DPAD_RIGHT:
                        return true;    
                }
                return false;
            }
            return false;
        }
    });
    consumeKeyEvent(v);
    return v;
}

private void consumeKeyEvent(Object obj) {
    if (obj instanceof ViewGroup) {
        for (int i = 0; i < ((ViewGroup)obj).getChildCount(); i++) {
            consumeKeyEvent(((ViewGroup)obj).getChildAt(i));
        }
        return;
    }
    ((View)obj).setOnKeyListener(new OnKeyListener() {

        @Override
        public boolean onKey(View v, int keyCode, KeyEvent event) {
            Log.i(DEBUG_TAG, "Event consumed, " + keyCode);
            return false;
        }
    });
}
...