背景
1.功能按键机在切换界面并返回时,无法恢复到上次滚动列表的位置,自动回到列表第一行。
2.功能机Feature Phone 区别于智能机的一个很关键的地方是焦点的显示,通过上下键使列表滚动,用不同样式显示表明焦点所在位置,智能机触屏不存在这个体验。
解决方案
1. 新增保存和请求恢复焦点位置两个接口;
/**
* Call this to try to give focus to an apn preference exists recycler view.
* @param focusPos the position of an apn item.
*/
private void requestFocusPref(int focusPos){
if(focusPos != 0) {
getListView().scrollToPosition(focusPos);
getListView().postDelayed(() -> {
requestFocus(getListView(), focusPos);
Log.i(TAG,"[requestFocusPref] delay 20ms in focusPos = " + focusPos);
},20);
}
}
private void saveCurrentFocus(){
if(getListView() != null && getListView().getFocusedChild() != null) {
mCurrentFocus = getListView().getLayoutManager().getPosition(getListView().getFocusedChild());
Log.i(TAG,"[saveCurrentFocus] focusChildTitle = " +
((TextView)getListView().getFocusedChild().findViewById(android.R.id.title)).getText() +
", mCurrentFocus = " + mCurrentFocus);
}
}
2. 在合适的地方调用保存和恢复(如切换界面或选中某行时,下面是举例)。
//在PreferenceFragment(PreferenceFragmentCompat)的子类中
@Override
public boolean onPreferenceChange(Preference preference, Object newValue) {
//omit some codes.
saveCurrentFocus();
requestFocusPref(mCurrentFocus);
return true;
}
private void setPreferChecked(ArrayList<ApnPreference> apnList) {
//omit some codes.
requestFocusPref(mCurrentFocus);
}