fix: bug of ui.Widget; add: sample for ui.Widget
This commit is contained in:
18
app/src/main/assets/sample/界面控件/自定义控件-使用配置勾选框.js
Normal file
18
app/src/main/assets/sample/界面控件/自定义控件-使用配置勾选框.js
Normal file
@@ -0,0 +1,18 @@
|
|||||||
|
"ui";
|
||||||
|
|
||||||
|
var PrefCheckBox = require('./自定义控件-模块-配置勾选框.js');
|
||||||
|
|
||||||
|
ui.layout(
|
||||||
|
<vertical>
|
||||||
|
<pref-checkbox id="perf1" text="配置1"/>
|
||||||
|
<pref-checkbox id="perf2" text="配置2"/>
|
||||||
|
<button id="btn" text="获取配置"/>
|
||||||
|
</vertical>
|
||||||
|
);
|
||||||
|
|
||||||
|
ui.btn.on("click", function(){
|
||||||
|
toast("配置1为" + PrefCheckBox.getPref().get("perf1"));
|
||||||
|
toast("配置2为" + PrefCheckBox.getPref().get("perf2"));
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
41
app/src/main/assets/sample/界面控件/自定义控件-布局模板.js
Normal file
41
app/src/main/assets/sample/界面控件/自定义控件-布局模板.js
Normal file
@@ -0,0 +1,41 @@
|
|||||||
|
"ui";
|
||||||
|
|
||||||
|
var InputLayout = (function() {
|
||||||
|
//继承至ui.Widget
|
||||||
|
util.extend(InputLayout, ui.Widget);
|
||||||
|
|
||||||
|
function InputLayout() {
|
||||||
|
ui.Widget.call(this);
|
||||||
|
this.defineAttr("hint", (view, attr, value, defineSetter)=>{
|
||||||
|
view._hint.setText(value);
|
||||||
|
});
|
||||||
|
this.defineAttr("text", (view, attr, value, defineSetter)=>{
|
||||||
|
view._input.setText(value);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
InputLayout.prototype.render = function() {
|
||||||
|
return (
|
||||||
|
<vertical>
|
||||||
|
<text id="_hint" textSize="16sp" margin="4" textColor="gray"/>
|
||||||
|
<input id="_input" margin="0 16"/>
|
||||||
|
</vertical>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
InputLayout.prototype.getInput = function() {
|
||||||
|
return this.view._input.getText();
|
||||||
|
};
|
||||||
|
ui.registerWidget("input-layout", InputLayout);
|
||||||
|
return InputLayout;
|
||||||
|
})();
|
||||||
|
|
||||||
|
ui.layout(
|
||||||
|
<vertical>
|
||||||
|
<input-layout id="name" hint="请输入名字"/>
|
||||||
|
<input-layout id="age" hint="请输入年龄" text="18"/>
|
||||||
|
<button id="ok" text="确认"/>
|
||||||
|
</vertical>
|
||||||
|
);
|
||||||
|
|
||||||
|
ui.ok.on("click", function(){
|
||||||
|
toast("名字是:" + ui.name.widget.getInput() + ", 年龄是:" + ui.age.widget.getInput());
|
||||||
|
});
|
||||||
@@ -2,7 +2,7 @@
|
|||||||
|
|
||||||
var ColoredButton = (function() {
|
var ColoredButton = (function() {
|
||||||
//继承至ui.Widget
|
//继承至ui.Widget
|
||||||
util.extends(ColoredButton, ui.Widget);
|
util.extend(ColoredButton, ui.Widget);
|
||||||
|
|
||||||
function ColoredButton() {
|
function ColoredButton() {
|
||||||
//调用父类构造函数
|
//调用父类构造函数
|
||||||
|
|||||||
@@ -1,9 +1,8 @@
|
|||||||
"ui";
|
|
||||||
|
|
||||||
//这个自定义控件是一个勾选框checkbox,能够保存自己的勾选状态,在脚本重新启动时能恢复状态
|
//这个自定义控件是一个勾选框checkbox,能够保存自己的勾选状态,在脚本重新启动时能恢复状态
|
||||||
var PrefCheckBox = (function() {
|
var PrefCheckBox = (function() {
|
||||||
//继承至ui.Widget
|
//继承至ui.Widget
|
||||||
util.extends(PrefCheckBox, ui.Widget);
|
util.extend(PrefCheckBox, ui.Widget);
|
||||||
|
|
||||||
function PrefCheckBox() {
|
function PrefCheckBox() {
|
||||||
//调用父类构造函数
|
//调用父类构造函数
|
||||||
@@ -16,21 +15,28 @@ var PrefCheckBox = (function() {
|
|||||||
<checkbox />
|
<checkbox />
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
PrefCheckBox.prototype.onViewCreated = function(view) {
|
PrefCheckBox.prototype.onFinishInflation = function(view) {
|
||||||
view.setChecked(PrefCheckBox.getPref().get(this.getKey(), false));
|
view.setChecked(PrefCheckBox.getPref().get(this.getKey(), false));
|
||||||
view.on("check", (checked) => {
|
view.on("check", (checked) => {
|
||||||
PrefCheckBox.getPref().put(this.getKey(), checked);
|
PrefCheckBox.getPref().put(this.getKey(), checked);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
PrefCheckBox.prototype.getKey = function() {
|
PrefCheckBox.prototype.getKey = function() {
|
||||||
return this.key || view.attr("id").replace("@+id/", "");
|
if(this.key){
|
||||||
|
return this.key;
|
||||||
|
}
|
||||||
|
let id = this.view.attr("id");
|
||||||
|
if(!id){
|
||||||
|
throw new Error("should set a id or key to the checkbox");
|
||||||
|
}
|
||||||
|
return id.replace("@+id/", "");
|
||||||
}
|
}
|
||||||
PrefCheckBox.setPref = function(pref) {
|
PrefCheckBox.setPref = function(pref) {
|
||||||
PrefCheckBox._pref = pref;
|
PrefCheckBox._pref = pref;
|
||||||
}
|
}
|
||||||
PrefCheckBox.getPref = function(){
|
PrefCheckBox.getPref = function(){
|
||||||
if(!PrefCheckBox._pref){
|
if(!PrefCheckBox._pref){
|
||||||
PrefCheckBox._pref = storages.create("pref_pref");
|
PrefCheckBox._pref = storages.create("pref");
|
||||||
}
|
}
|
||||||
return PrefCheckBox._pref;
|
return PrefCheckBox._pref;
|
||||||
}
|
}
|
||||||
@@ -38,17 +44,4 @@ var PrefCheckBox = (function() {
|
|||||||
return PrefCheckBox;
|
return PrefCheckBox;
|
||||||
})();
|
})();
|
||||||
|
|
||||||
ui.layout(
|
module.exports = PrefCheckBox;
|
||||||
<vertical>
|
|
||||||
<pref-checkbox id="perf1" text="配置1"/>
|
|
||||||
<pref-checkbox id="perf2" text="配置2"/>
|
|
||||||
<button id="btn" text="获取配置"/>
|
|
||||||
</vertical>
|
|
||||||
);
|
|
||||||
|
|
||||||
ui.btn.on("click", function(){
|
|
||||||
toast("配置1为" + PrefCheckBox.getPref().get("perf1"));
|
|
||||||
toast("配置2为" + PrefCheckBox.getPref().get("perf2"));
|
|
||||||
});
|
|
||||||
|
|
||||||
|
|
||||||
@@ -82,6 +82,11 @@ module.exports = function(runtime, global){
|
|||||||
context.startActivity(Intent.createChooser(i, "发送邮件").addFlags(Intent.FLAG_ACTIVITY_NEW_TASK));
|
context.startActivity(Intent.createChooser(i, "发送邮件").addFlags(Intent.FLAG_ACTIVITY_NEW_TASK));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
app.getUriForFile = function(file){
|
||||||
|
return android.support.v4.content.FileProvider.getUriForFile(context,
|
||||||
|
"org.autojs.autojs.fileprovider", new java.io.File(files.path(path)));
|
||||||
|
};
|
||||||
|
|
||||||
function toArray(arg){
|
function toArray(arg){
|
||||||
if(typeof(arg) == 'string'){
|
if(typeof(arg) == 'string'){
|
||||||
return [arg];
|
return [arg];
|
||||||
|
|||||||
@@ -138,6 +138,10 @@ module.exports = function (runtime, global) {
|
|||||||
return null;
|
return null;
|
||||||
},
|
},
|
||||||
afterInflateView: function (context, view, node, parent, attachToParent) {
|
afterInflateView: function (context, view, node, parent, attachToParent) {
|
||||||
|
let widget = view.widget;
|
||||||
|
if(widget && context.get("root") != widget){
|
||||||
|
widget.notifyAfterInflation(view);
|
||||||
|
}
|
||||||
return view;
|
return view;
|
||||||
},
|
},
|
||||||
beforeCreateView: function (context, node, viewName, parent, attrs) {
|
beforeCreateView: function (context, node, viewName, parent, attrs) {
|
||||||
@@ -145,6 +149,7 @@ module.exports = function (runtime, global) {
|
|||||||
let Widget = ui.__widgets__[viewName];
|
let Widget = ui.__widgets__[viewName];
|
||||||
let widget = new Widget();
|
let widget = new Widget();
|
||||||
let ctx = layoutInflater.newInflateContext();
|
let ctx = layoutInflater.newInflateContext();
|
||||||
|
ctx.put("root", widget);
|
||||||
ctx.put("widget", widget);
|
ctx.put("widget", widget);
|
||||||
let view = ui.__inflate__(ctx, widget.renderInternal(), parent, false);
|
let view = ui.__inflate__(ctx, widget.renderInternal(), parent, false);
|
||||||
return view;
|
return view;
|
||||||
@@ -159,6 +164,7 @@ module.exports = function (runtime, global) {
|
|||||||
var widget = context.get("widget");
|
var widget = context.get("widget");
|
||||||
if(widget != null){
|
if(widget != null){
|
||||||
widget.view = view;
|
widget.view = view;
|
||||||
|
view.widget = widget;
|
||||||
let viewAttrs = com.stardust.autojs.core.ui.ViewExtras.getViewAttributes(view, layoutInflater.resourceParser);
|
let viewAttrs = com.stardust.autojs.core.ui.ViewExtras.getViewAttributes(view, layoutInflater.resourceParser);
|
||||||
viewAttrs.setViewAttributeDelegate({
|
viewAttrs.setViewAttributeDelegate({
|
||||||
has: function(name) {
|
has: function(name) {
|
||||||
@@ -291,6 +297,25 @@ module.exports = function (runtime, global) {
|
|||||||
return (< />)
|
return (< />)
|
||||||
};
|
};
|
||||||
Widget.prototype.defineAttr = function(attrName, getter, setter){
|
Widget.prototype.defineAttr = function(attrName, getter, setter){
|
||||||
|
var attrAlias = attrName;
|
||||||
|
var applier = null;
|
||||||
|
if(typeof(arguments[1]) == 'string'){
|
||||||
|
attrAlias = arguments[1];
|
||||||
|
if(arguments.length >= 3){
|
||||||
|
applier = arguments[2];
|
||||||
|
}
|
||||||
|
} else if(typeof(arguments[1]) == 'function' && typeof(arguments[2]) != 'function'){
|
||||||
|
applier = arguments[1];
|
||||||
|
}
|
||||||
|
if(!(typeof(arguments[1]) == 'function' && typeof(arguments[2]) == 'function')){
|
||||||
|
getter = ()=> {
|
||||||
|
return this[attrAlias];
|
||||||
|
};
|
||||||
|
setter = (view, attrName, value, setter)=> {
|
||||||
|
this[attrAlias] = value;
|
||||||
|
applier && applier(view, attrName, value, setter);
|
||||||
|
};
|
||||||
|
}
|
||||||
this.__attrs__[attrName] = {
|
this.__attrs__[attrName] = {
|
||||||
getter: getter,
|
getter: getter,
|
||||||
setter: setter
|
setter: setter
|
||||||
@@ -310,6 +335,11 @@ module.exports = function (runtime, global) {
|
|||||||
this.onViewCreated(view);
|
this.onViewCreated(view);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
Widget.prototype.notifyAfterInflation = function(view){
|
||||||
|
if(typeof(this.onFinishInflation) == 'function'){
|
||||||
|
this.onFinishInflation(view);
|
||||||
|
}
|
||||||
|
}
|
||||||
return Widget;
|
return Widget;
|
||||||
})();
|
})();
|
||||||
|
|
||||||
|
|||||||
@@ -20,7 +20,7 @@
|
|||||||
// USE OR OTHER DEALINGS IN THE SOFTWARE.
|
// USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
|
|
||||||
var formatRegExp = /%[sdj%]/g;
|
var formatRegExp = /%[sdj%]/g;
|
||||||
exports.extends = (function () {
|
exports.extend = (function () {
|
||||||
var extendStatics = Object.setPrototypeOf ||
|
var extendStatics = Object.setPrototypeOf ||
|
||||||
({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
|
({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
|
||||||
function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
|
function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
|
||||||
|
|||||||
@@ -208,12 +208,11 @@ public class DynamicLayoutInflater {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
ViewInflater<View> inflater = applyAttributes(context, view, attrs, parent);
|
ViewInflater<View> inflater = applyAttributes(context, view, attrs, parent);
|
||||||
if (!(view instanceof ViewGroup) || !node.hasChildNodes()) {
|
if (view instanceof ViewGroup && node.hasChildNodes()) {
|
||||||
return view;
|
inflateChildren(context, inflater, node, (ViewGroup) view);
|
||||||
}
|
if (inflater instanceof ViewGroupInflater) {
|
||||||
inflateChildren(context, inflater, node, (ViewGroup) view);
|
applyPendingAttributesOfChildren(context, (ViewGroupInflater) inflater, (ViewGroup) view);
|
||||||
if (inflater instanceof ViewGroupInflater) {
|
}
|
||||||
applyPendingAttributesOfChildren(context, (ViewGroupInflater) inflater, (ViewGroup) view);
|
|
||||||
}
|
}
|
||||||
return mLayoutInflaterDelegate.afterInflateView(context, view, node, parent, attachToParent);
|
return mLayoutInflaterDelegate.afterInflateView(context, view, node, parent, attachToParent);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -23,6 +23,7 @@ public class ViewPrototype {
|
|||||||
private final HashSet<String> mRegisteredEvents = new HashSet<>();
|
private final HashSet<String> mRegisteredEvents = new HashSet<>();
|
||||||
private final Scriptable mScope;
|
private final Scriptable mScope;
|
||||||
private final ViewAttributes mViewAttributes;
|
private final ViewAttributes mViewAttributes;
|
||||||
|
private Object mWidget;
|
||||||
|
|
||||||
public ViewPrototype(View view, ViewAttributes viewAttributes, Scriptable scope, ScriptRuntime runtime) {
|
public ViewPrototype(View view, ViewAttributes viewAttributes, Scriptable scope, ScriptRuntime runtime) {
|
||||||
mView = view;
|
mView = view;
|
||||||
@@ -50,6 +51,14 @@ public class ViewPrototype {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void setWidget(Object widget) {
|
||||||
|
mWidget = widget;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Object getWidget() {
|
||||||
|
return mWidget;
|
||||||
|
}
|
||||||
|
|
||||||
public void click() {
|
public void click() {
|
||||||
mView.performClick();
|
mView.performClick();
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user