在界面上使用URI编程
来源:互联网 发布:Linux下ifconfig 编辑:程序博客网 时间:2024/06/06 20:50
转载:
导言
做android 开发有一段时间了,很多时候就是做些重复性的数据绑定,还有就是不够操作不够灵活,例如,我在某个界面要新增一个按钮,就需要发布一个新版本,就这么一个按钮的话其实,可以完全由服务器控制,例如UC,凡客他们要更新首页,不可能为了更新一个首页特地开发一个新版本,那多傻啊,所以,观察了一下,想出了一个可能解决的方案…
1.控制显示
如何做到有服务器控制客户端的显示呢?
我们可以在客户端预留一些可能会用的例如UC的首页:
箭头标志的区域,是会根据不同情况而更新,而我现在就是要做出这样的效果.
如何控制显示?
我们知道,android 找view是通过一系列ID 值找到相关的UI 那样,我们可以通过,在服务端,发送我们要修改的id.
1,是直接发送ID值还是发送一个具体路径?
这点,我毫无犹豫的选择了发送一个ui的路径,通过在客户端把这个URI进行转义,然后获得,相关的ID值.代码
/** * 资源ID 的几种形式 * res = package:type/entry * 1,res://com.achai@drawable/test_icon * 2,res://drawable/test_icon *(1) 不带具体包名 *entry = layout/main *(2) 指定包名和类型实体 *com.achai@drawable/icon * @param url * @return */public static int getResIdFromURL(String url){URI uri = URI.create(url);String scheme = uri.getScheme();String type = uri.getHost();String entry =uri.getPath();entry = entry.replaceFirst("/", "");String packageName = uri.getUserInfo();if(ress == null)initRes();if(ress == null)return -1;//判断是否android资源URLif(!scheme.equals("res"))return -1;//1,判断是否是带包名的uri,并执行转换,获得资源IDif(packageName != null){return ress.getIdentifier(entry, type, packageName);}else{return ress.getIdentifier(entry, type, defPackage);}}
思路就如同代码那样,这样,我们的客户端就能够解析服务端发送过来要改哪个UI的了!接着就是修改值的事情了,这部分,以后继续!
2,控制监听
还是用uc作为例子:
在 UC的应用中心中,有个添加应用,这里就有个问题,我们如何监听我们新增的应用呢?
x
我翻阅android api的时候发现这么一行话
Tags
Unlike IDs, tags are not used to identify views. Tags are essentially an extra piece of information that can be associated with a view. They are most often used as a convenience to store data related to views in the views themselves rather than by putting them in a separate structure.
看到这里,我觉得就可以在这里做点文章了.
我们可以做一个tag 命令系统,然后,在这些新增应用的tag上打上一个标签命令,例如,UC就可能在这些应用上的tag 打上一个url 我们点击的时候,就会跳转到相关的应用.
根据这个思路敲下如下代码
public void doViewClicked(View v){String url = v.getTag().toString().trim();if(v != null && url != null){//对view 中tag 进行解析doExecUrl(v, url);}}protected void doExecUrl(View view, String url) {try{if(url.indexOf('\n') > 0){String[] urls = url.split("\n");for(String u : urls){execUrl(view, u);}}else{execUrl(view, url);}}catch(RuntimeException ex){UserApp.curApp().showMessage("url 解析错误");}}private void execUrl(View view, String u) {URI execUri = URI.create(u);if(execUri == null)return;String prefix = execUri.getScheme();//执行相关的的命令if(prefix.equals("cmd")){execCmd(execUri);}else if(prefix.equals("act")){execAct(execUri);}}/** * 执行命令操作 * @param u */private void execCmd(URI u){String type = u.getHost();//监控 watchif(type.equals("watch")){//用于观察view 中的变量改变情况,晚些在实现return;}//结束当前viewif(type.equals("finish")){theAct.finish();return;}//弹出提示if(type.equals("hint")){String msg = u.getFragment();if(msg != null){UserApp.showMessage(theAct, msg);}return;}//重新读取if(type.equals("reload")){return;}//设置指定id view 的值if(type.equals("setview")){return;}//设置显示某个viewif(type.equals("showview")){return;}}
这样,我们可以在初始化view的时候,遍历所有view的元素,有tag命令就设置监听器!
public void checkView(){ViewGroup vg = (ViewGroup) findViewById(R.id.line);int count = vg.getChildCount();for(int i=0; i < count; i ++){View child = vg.getChildAt(i);String tag = (String) child.getTag();if(tag != null){initTagCmd.setViewTagListenr(child);}}}
这样我们就可以很灵活的操作我们的UI 事件了!
k
可能有人会说效率问题?
效率的影响那是肯定会有的,但是,你想一下,一个view 官方推荐不要超过80个,一般而言也就10来个,遍历消耗的时间估计就算是htc g1(第一台android手机)那样的配置的手机都没问题,更何况是现在4核的android手机….
试一下效果:
这是一个开源的玩意…
这个项目放在了github上,如果有朋友,想试一下可以到以下链接下载或者关注,提供一些建议,完善的话会慢慢来…
android_URI4Resource
作者:游戏阿柴
出处:http://www.cnblogs.com/youxilua
本文采用知识共享署名-非商业性使用-相同方式共享 2.5 中国大陆许可协议进行许可,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接。
微博联系:新浪微博
用支付宝赞助博主:http://me.alipay.com/youxilua
- 在界面上使用URI编程
- android在界面上使用URI编程 ----开发笔记收集
- 在wxwidgets 界面编程使用 png 图片
- 界面编程学习-在状态栏上滚动文字
- 【VC】使用SDK在界面上显示图标和图像
- 在swt上使用windows消息编程
- 在WCF Uri中使用特殊字符
- Java网络编程之URI、URL研究(上)
- 如何使用 hive建立自己的函数在CLI界面上并使用
- 使用SuperWaba在PPC和Palm上编程【转贴】
- 在移动设备上使用M3G编程手册
- 可以在win7上使用的编程软件
- 使用C4droid和botbrew在andriod手机上编程
- 在Android中 使用 java.net.URI 与 android.net.Uri 的区别
- 让python在android系统上飞一会儿:第四节 使用WebView制作程序界面
- 如何使用汇编在dos界面上显示字体和颜色--学习心得笔记
- 在 Windows XP 上使用 FileZilla 来图形化界面管理 Linux Server——下
- Android中使用WindowManager在界面布局上添加浮动窗口
- ToggleButton开关按钮
- 对NGUI的UISprite和UITexture进行裁剪,圆形裁剪
- tomcat多域名配置
- JS正则表达式学习之路:(三)RegExp对象
- nRF51822使用Timer制作4路PWM波详解
- 在界面上使用URI编程
- ArcGisTiledMapServiceLayer 和 ArcGisDynamicServiceLayer 在ArcGIS server for Java的区别
- [前端] SVG简单分析
- [androdi基础知识] 之十六: ((TelephonyManager)paramContext.getSystemService("phone")).getDeviceId();语句的理解
- 第九周 项目五-我的方程类
- dc综合指令
- 自定义全文显示插件
- eclipse引进外部项目文件报错
- python之函数