PreferenceFragment не может прокрутить вверх / вниз на XE16 (отлично работал на XE12)

У меня в приложении Glass GDK есть несколько пользовательских настроек, в основном простые флажки. Я не смог найти специфическую для стекла парадигму предпочтений, поэтому я использовал PreferenceFragment, и он отлично работал на XE12.

К вашему сведению: когда я его реализовал, он изначально выглядел плохо, но я улучшил его, используя следующий стиль в AndroidManifest для моей настройки настроек:

<style name="Theme.Preferences" parent="@android:style/Theme.Holo.NoActionBar.Fullscreen" />

У меня не было возможностине обновить до XE16 (кроме отключения сетевого подключения). После обновления я настроил использование API моего приложения для нескольких изменений XE16. Все в основном работало.

Первое, что я заметил, было то, что мои действия в MainActivity погружения больше не возвращались к Live Card. Я исправил это, заставив обработчик onGesture в MainActivity возвращать false для Gesture.SWIPE_DOWN.

Второе, что я заметил, - это цель этого вопроса: моя функция SettingsActivity, которая оборачивает PreferenceFragment, больше не позволяет мне перемещаться вверх и вниз по списку предпочтений с помощью пролистывания влево и вправо. Мой код в конце этого поста. Я добавил GestureDetector, чтобы помочь отладить эту проблему после того, как она была замечена. Я вижу, как регистрируются SWIPE_LEFT и SWIPE_RIGHT, но независимо от того, что я возвращаю, или даже если я удаляю код жеста, выбор списка предпочтений никогда не перемещается из первого элемента. Первый элемент - это CheckBoxPreference, которыйделает переключаться при нажатии.

Я видел несколько других приложений Glass, которые используют настройки Android (PreferenceActivity или PreferenceFragment), и теперь все они, похоже, сломаны.

Как правильно реализовать настройки на стекле или как заставить PreferenceFragment работать?

public class SettingsActivity //
                extends Activity //
                implements GestureDetector.BaseListener
{
    private static final String TAG             = WtcLog.TAG(SettingsActivity.class);

    public static final int     RESULT_SIGN_OUT = RESULT_FIRST_USER + 1;

    private static final String TAG_PREFERENCES = "preferences";

    private GestureDetector     mGestureDetector;

    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);

        mGestureDetector = new GestureDetector(this);
        mGestureDetector.setBaseListener(this);

        getFragmentManager() //
        .beginTransaction() //
        .replace(android.R.id.content, new FragmentSettings(), TAG_PREFERENCES) //
        .commit();
    }

    public static class FragmentSettings extends PreferenceFragment
    {
        private ApplicationGlass   mApplication;
        private WavePreferences    mPreferences;

        private PreferenceScreen   mScreenTop;
        private PreferenceCategory mCategoryDebug;

        @Override
        public void onCreate(Bundle savedInstanceState)
        {
            super.onCreate(savedInstanceState);

            Activity activity = getActivity();
            mApplication = (ApplicationGlass) activity.getApplication();
            mPreferences = mApplication.getPreferences();

            addPreferencesFromResource(R.xml.preferences);

            mScreenTop = (PreferenceScreen) findPreference("screen_top");

            //
            // Remember Password
            //
            CheckBoxPreference prefRememberPassword = (CheckBoxPreference) findPreference("pref_remember_password");
            prefRememberPassword.setChecked(mPreferences.getRememberPassword());
            prefRememberPassword.setOnPreferenceChangeListener(new OnPreferenceChangeListener()
            {
                @Override
                public boolean onPreferenceChange(Preference preference, Object newValue)
                {
                    boolean rememberPassword = (Boolean) newValue;

                    String password = null;
                    if (rememberPassword)
                    {
                        password = mApplication.getSessionManager().getLastStartConnectInfo().getPassword();
                    }

                    mPreferences.setRememberPassword(rememberPassword);
                    mPreferences.setPassword(password);

                    return true;
                }
            });

            ...
        }
    }

    @Override
    public boolean onGenericMotionEvent(MotionEvent event)
    {
        if (mGestureDetector != null)
        {
            return mGestureDetector.onMotionEvent(event);
        }
        return false;
    }

    @Override
    public boolean onGesture(Gesture gesture)
    {
        WtcLog.debug(TAG, "onGesture(" + gesture + ")");
        switch (gesture)
        {
            case LONG_PRESS:
                WtcLog.debug(TAG, "onGesture: LONG_PRESS");
                break;
            case TAP:
                WtcLog.debug(TAG, "onGesture: TAP");
                break;
            case TWO_TAP:
                WtcLog.debug(TAG, "onGesture: TWO_TAP");
                break;
            case SWIPE_RIGHT:
                WtcLog.debug(TAG, "onGesture: SWIPE_RIGHT");
                break;
            case SWIPE_LEFT:
                WtcLog.debug(TAG, "onGesture: SWIPE_LEFT");
                break;
            case SWIPE_DOWN:
                WtcLog.debug(TAG, "onGesture: SWIPE_DOWN");
                break;
            case SWIPE_UP:
                WtcLog.debug(TAG, "onGesture: SWIPE_UP");
                break;
            case THREE_LONG_PRESS:
                WtcLog.debug(TAG, "onGesture: THREE_LONG_PRESS");
                break;
            case THREE_TAP:
                WtcLog.debug(TAG, "onGesture: THREE_TAP");
                break;
            case TWO_LONG_PRESS:
                WtcLog.debug(TAG, "onGesture: TWO_LONG_PRESS");
                break;
            case TWO_SWIPE_DOWN:
                WtcLog.debug(TAG, "onGesture: TWO_SWIPE_DOWN");
                break;
            case TWO_SWIPE_LEFT:
                WtcLog.debug(TAG, "onGesture: TWO_SWIPE_LEFT");
                break;
            case TWO_SWIPE_RIGHT:
                WtcLog.debug(TAG, "onGesture: TWO_SWIPE_RIGHT");
                break;
            case TWO_SWIPE_UP:
                WtcLog.debug(TAG, "onGesture: TWO_SWIPE_UP");
                break;
            default:
                WtcLog.error(TAG, "onGesture: unknown gesture \"" + gesture + "\"");
                break;
        }
        return false;
    }
}

Ответы на вопрос(3)

Ваш ответ на вопрос