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>
(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重用。
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 });
}
}
没有评论:
发表评论