0

I have preferences created from XML and preferenceFragment and left-hand navigation. When I choose "Settings" my pref fragments comes out...I can use DPad to move up and down, when there are no more choices on the bottom, the cursor stops (desired behavior), but when I move up the list, the cursor continues over to the left-hand nav. I want it to stop at the top. Below is my pref_screen xml. My left hand nav is created code side. I have no idea how to work DPad logic into this. I also want to restrict the DPad from moving cursor over to left-hand navigation menu if in settings fragment.

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

Here is a screen shot: enter image description here

taraloca
  • 9,077
  • 9
  • 44
  • 77
  • What is "settings"? how do you load PreferencesFragment? Its difficult to help without seeing the actual UI and code here. – Megha Joshi - GoogleTV DevRel Nov 18 '11 at 21:56
  • sorry I am not able to reproduce this issue. I have an Activity with left nav bar and I am loading preferences on the right side of it. But when I hit up on the preferences screen, it doesn't move focus to my leftnav bar. I guess it has something to do with how ur layout xml and preferencefragment is loaded. – Megha Joshi - GoogleTV DevRel Nov 21 '11 at 19:17

1 Answers1

0

I had to figure out a way to depict the positions and children to handle dpad. Here is the code I wrote to handle this:

@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;
        }
    });
}
taraloca
  • 9,077
  • 9
  • 44
  • 77