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;
}
}