[lottery] 03_内容部分显示管理(一)——返回键处理

Android 4.0

内容部分显示管理(一)——返回键处理

注意:
①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);
    
}