2013年5月17日星期五

ADF_219:ADF Mobile 11.1.2.4 Samples 介绍(5):Navigation

开发运行环境:JDeveloper 11.1.2.4 + Android SDK r21.1

Navigation演示了多种导航技术,比如Bounded TaskFlows和Routers,以及页面切换时的效果。
在这个例子中,每个特性都用一个Feature展现,每个Feature中都用了Bounded TaskFlows,感觉这样设计逻辑功能非常清楚。

知识点:

1. Transitions
页面切换时的效果是定义在Transitions上的,支持的效果有:fade,slideRight,slideLeft,slideUp,slideDown,flipRight,flipLeft,flipUp,flipDown。

2. TaskFlow Call 和 Return
在ADF Mobile中,可以使用TaskFlow Call和Return Activity。
因为TaskFlow可以嵌套,因此你可以灵活的设计页面流程。

3. Router的使用,以及List页面到Detail页面的当前行参数传递


(1)List.amx 页面代码,传递当前行#{row.rowKey}到#applicationScope.RouterBean.currEmp}。
setCurrentRowWithKeyValue
<amx:listView var="row" value="#{bindings.employees.collectionModel}" id="listView1">
  <amx:listItem id="listItem1" action="detail">
    <amx:outputText value="#{row.first} #{row.last}" id="outputText3"/>
    <amx:setPropertyListener from="#{row.rowKey}" to="#{applicationScope.RouterBean.currEmp}" type="action"/>
  </amx:listItem>
</amx:listView>

在Detail.amx中,可以看到当前行是如何从List传递到Detail的。
(2)手工在Bindings增加了一个action binding:setCurrentRowWithKeyValue


 (3)手工在Executables中增加了一个invoke action,指向setCurrentRowWithKeyValue



4. 下拉列表的实现
(1)页面代码
<amx:selectOneChoice  label="Employee" value="#{bindings.selectedEmp.inputValue}"
                             id="selectOneChoice1">
  <amx:selectItems value="#{bindings.selectedEmp.items}"/>
</amx:selectOneChoice>
<amx:commandButton id="commandButton1" actionListener="#{applicationScope.RouterBean.GotoEmployeeDetail}"
                 text="Show Employee Detail">
  <amx:setPropertyListener from="#{bindings.selectedEmp.inputValue}" to="#{applicationScope.RouterBean.currEmp}"
                           type="action"/>
</amx:commandButton>

(2)绑定关系的实现

 这里的Base Data Source是LauncherBean的一个属性:selectedEmp。
 而List Data Source,也就是下拉列表的选项来自EmployeeList的一个集合属性:employees。

(3)RouterBean 代码:

package application;

import oracle.adfmf.amx.event.ActionEvent;
import oracle.adfmf.framework.api.AdfmfContainerUtilities;
import oracle.adfmf.util.logging.Trace;
import com.sun.util.logging.Level;

public class RouterBean {
    public RouterBean() {
        super();
    }
 
    private String currEmp = "";

    public void setCurrEmp(String currEmp) {
        this.currEmp = currEmp;
    }

    public String getCurrEmp() {
        return currEmp;
    }

    public void GotoEmployeeDetail(ActionEvent action) {
        AdfmfContainerUtilities.resetFeature("Employees2");
    }
 
    public boolean getIsDetail() {
        boolean ret = false;
        if( currEmp.length() > 0) {
            ret = true;
        }

        return ret;
    }
}

说明:这里学习如何从一个Feature进入另一个Feature,resetFeature的含义是清除目标Feature的原有状态,即重新初始化。
也就是说,一个Feature也可以作为一个重用单元被其它Feature重用。

4. 通过程序动态导航
(1)ProgrammaticBean 代码

package mobile;

import javax.el.ValueExpression;

import oracle.adfmf.amx.event.ActionEvent;
import oracle.adfmf.amx.event.ValueChangeEvent;
import oracle.adfmf.framework.api.AdfmfContainerUtilities;
import oracle.adfmf.framework.api.AdfmfJavaUtilities;

public class ProgrammaticBean {
    public ProgrammaticBean() {
    }

    public void doNavigation(ActionEvent actionEvent) {
        ValueExpression ve = AdfmfJavaUtilities.getValueExpression("#{pageFlowScope.outcome}", String.class);
        String outcome = (String)ve.getValue(AdfmfJavaUtilities.getAdfELContext());
     
        AdfmfContainerUtilities.invokeContainerJavaScriptFunction(AdfmfJavaUtilities.getFeatureName(),
                                                                   "adf.mf.api.amx.doNavigation", new Object[] { outcome });      
    }

    public void valueChangeNavigate(ValueChangeEvent valueChangeEvent) {
        ValueExpression ve = AdfmfJavaUtilities.getValueExpression("#{pageFlowScope.outcome}", String.class);
        String outcome = (String)ve.getValue(AdfmfJavaUtilities.getAdfELContext());
     
        AdfmfContainerUtilities.invokeContainerJavaScriptFunction(AdfmfJavaUtilities.getFeatureName(),
                                                                   "adf.mf.api.amx.doNavigation", new Object[] { outcome });      
    }
}

没有评论: