内容部分显示管理(一)——返回键处理
注意: ①onKeyDown方法中,要返回true,防止继续广播下去 ②利用LinkedList模拟栈结构 |
1、图示分析一下返回键处理流程
2、修改界面切换方法,缓存需要返回界面到LinkedList
①通过LinkedList模拟栈的实现(addFrist)
②缓存当前界面的简单名称,需要用到对应界面内容时,通过简单名称到map中获取
3、增加处理返回缓存的方法,将LinkedList的顶部界面替换显示
①判断当前LinkedList的大小,获取顶部信息
②比对顶部信息与当前显示界面,如果不同则显示顶部界面,如果相同则清除LinkedList顶部的信息,之后重复上述操作
4、在Activity上处理onKeyDown方法,捕捉返回键信息
|
步骤: 1、在界面切换的时候,将当前切换过来的BaseView的简单名加载到 LinkedList<String> historyViews中去,而且是加载在第一个addFirst() 2、监听用户按后退键,将其处理交给UIManager的history方法处理,且要返回true,防止其继续传播, 而不是返回 return super.onKeyDown(keyCode, event); 3、当用户按后退键的时候,如果historyViews中有值,那么取出第一个和当前的界面的BaseView进行比较,如果和当前是同一个BaseView,那么将historyViews中的第一个给移除,然后递归调用history,继续取第一个,如果此时historyViews中只有一个值的时候,那么返回false,不再移除。如果和当前的BaseView不一致,那么加载到布局中显示, currentBaseView记住当前界面的BaseView。 |
核心代码: /**
* 7、处理用户返回键
*/
private LinkedList<String> historyViews = new LinkedList<String>();
public boolean history() {
LogUtil.i(TAG, "llHistory size:" + historyViews.size());
// 1、每次取出第一个
if (historyViews.size() > 0) {
String firstClassname = historyViews.getFirst();
if (currentBaseView.getClass().getSimpleName()
.equals(firstClassname)) {// 如果当前和集合中第一个相同的话,那么移除,递归调用
// 如果是最后一个,那么不退出
if (historyViews.size() == 1) {
return false;
}
// 一致,将第一个元素清除
historyViews.removeFirst();
// 再次获取集合中元素
return history();
} else {// 不相等了,那么就是到了另外一个界面了
BaseView otherBaseView = views.get(firstClassname);
rlCenterContentContainer.removeAllViews();
rlCenterContentContainer.addView(otherBaseView.getView());
currentBaseView = otherBaseView;
return true;
}
}
return false;
}
/**
* 6、界面切换(解决了每次切换没有进行界面的判断,当前如果正在显示第二个界面,仍然进行界面的切换
*
* @param clazz
*/
private Map<String, BaseView> views = new HashMap<String, BaseView>();
private BaseView currentBaseView;// 当前显示的界面类
public void changeView(Class<? extends BaseView> clazz){
// 1、如果当前的currentBaseView不为null且和待切换的界面类的字节码一直,那么是同一个界面,不切换
if (currentBaseView!=null && clazz == currentBaseView.getClass()) {
return;
}
String className = clazz.getSimpleName();
BaseView baseView = null;
if (views.containsKey(className)) {// map集合中有这个key,那么直接取出
baseView = views.get(className);
} else {// 如果不存在,利用反射给new该对象
try {
Constructor<? extends BaseView> constructor = clazz.getConstructor(Context.class);
baseView = constructor.newInstance(getContext());
views.put(className, baseView);
} catch (Exception e) {
e.printStackTrace();
}
}
LogUtil.i(TAG, baseView.toString());
View view = baseView.getView();
rlCenterContentContainer.addView(view);
// 2、 然后记住当前BaseView
currentBaseView = baseView;
historyViews.addFirst(className);// 将创建新的BaseView添加到第一个位置
Animation animation = AnimationUtils.loadAnimation(getContext(), R.anim.za_view_translate_in);
view.startAnimation(animation);
|
|