main.xml如下:
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="wrap_content" android:orientation="vertical" > <AutoCompleteTextView android:id="@+id/edit" android:layout_width="230dip" android:layout_height="wrap_content" android:textSize="20sp" android:layout_gravity="center_horizontal" android:layout_marginTop="20dip" /> </LinearLayout>
程序代码如下:
package com.android.system.AutoComplete; import java.util.ArrayList; import java.util.List; import android.app.Activity; import android.content.Context; import android.graphics.Color; import android.os.Bundle; import android.text.Editable; import android.text.TextWatcher; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.AutoCompleteTextView; import android.widget.BaseAdapter; import android.widget.Filter; import android.widget.Filterable; import android.widget.TextView; public class AutoComplete extends Activity { AutoCompleteTextView autoview; // default city String[] stringArray = { "@163.com", "@126.com", "@qq.com", "@sina.com", "@taobao.com" }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); autoview = (AutoCompleteTextView) findViewById(R.id.edit); // adapter = new ArrayAdapter<String>(this, android.R.layout.simple_dropdown_item_1line, stringArray); final MyAdatper adapter = new MyAdatper(this); autoview.setAdapter(adapter); autoview.addTextChangedListener(new TextWatcher() { @Override public void onTextChanged(CharSequence s, int start, int before, int count) { } @Override public void beforeTextChanged(CharSequence s, int start, int count, int after) { } @Override public void afterTextChanged(Editable s) { String input = s.toString(); adapter.mList.clear(); if (input.length() > 0) { for (int i = 0; i < stringArray.length; ++i) { adapter.mList.add(input + stringArray[i]); } } adapter.notifyDataSetChanged(); autoview.showDropDown(); } }); // default=2 autoview.setThreshold(1); } class MyAdatper extends BaseAdapter implements Filterable { List<String> mList; private Context mContext; private MyFilter mFilter; public MyAdatper(Context context) { mContext = context; mList = new ArrayList<String>(); } @Override public int getCount() { return mList == null ? 0 : mList.size(); } @Override public Object getItem(int position) { return mList == null ? null : mList.get(position); } @Override public long getItemId(int position) { return position; } @Override public View getView(int position, View convertView, ViewGroup parent) { if (convertView == null) { TextView tv = new TextView(mContext); tv.setTextColor(Color.BLACK); tv.setTextSize(20); convertView = tv; } TextView txt = (TextView) convertView; txt.setText(mList.get(position)); return txt; } @Override public Filter getFilter() { if (mFilter == null) { mFilter = new MyFilter(); } return mFilter; } private class MyFilter extends Filter { @Override protected FilterResults performFiltering(CharSequence constraint) { FilterResults results = new FilterResults(); if (mList == null) { mList = new ArrayList<String>(); } results.values = mList; results.count = mList.size(); return results; } @Override protected void publishResults(CharSequence constraint, FilterResults results) { if (results.count > 0) { notifyDataSetChanged(); } else { notifyDataSetInvalidated(); } } } } }
代码下载地址:http://download.csdn.net/detail/leiming32/4469341
微信平台开放后倒是挺火的,许多第三方应用都想试下,毕竟可以利用微信
建立起来的关系链来拓展自己的应用还是挺不错的,可以节约很多在社交方
面的开销,我最近由于实习需要也在研究这个东西,不过发现网上的相关资
料还是挺少的,这里把我的整个研究情况给出来,希望可以共同学习。
第三方应用接入微信平台(1)
二、第三方应用与微信通信的时序图
2、接收微信的请求信息
前面四步和之前的“1、向微信发送消息”是一样的,不需要重复执行,这里给出来只是为了
流程的整体性。当我们注册后,应用图标会出现在微信聊天的列表中,点击加号即可去添加,
添加后,如果聊天时点击应用图标将会回调第三方应用,如上面时序图所示。这里补充一点,
当我们向微信发消息的媒体类型是appdata类型,即WXAppExtendObject对象时,好友在
收到消息时点击消息,会出现类似的回调过程,需要修改的就是此时onReq被调用时,type
为ConstantsAPI.COMMAND_SHOWMESSAGE_FROM_WX而不是ConstantsAPI.COMMAND_GETMESSAGE_FROM_WX 。
当我们在onReq方法中接到ConstantsAPI.COMMAND_GETMESSAGE_FROM_WX
类型的消息时,如果想要把响应发回微信,可用如下代码段来实现
可以发现响应的消息对象和发请求是一样的,下面看看效果图
这是聊天窗口,前提是你已经点击加号将应用添加到下面的列表中
此时,如果点击第三方应用,会回调我们设置好的界面
这个界面是自己定义的,你可以在接到微信的请求后自定义响应界面。
说了半天,还没说到onReq方法或是前面讲的onResp方法的由来,
也就是说如果我们想要处理给微信发请求后的回馈或是响应微信的请求
应该怎么做,我们需要下面3步操作:
a. 可以在你的包名相应目录下新建一个wxapi目录,并在该wxapi目录下新增一个
WXEntryActivity类,该类继承自Activity(当然这个路径是自定义的,随便你自己)
并在manifest文件里面加上exported属性,设置为true,例如:
<activity
android:name=".wxapi.WXEntryActivity"
android:exported="true"
android:label="@string/app_name"
android:launchMode="singleTop" >
b. 实现IWXAPIEventHandler接口,微信发送的请求将回调到onReq方法,发送
到微信请求的响应结果将回调到onResp方法
终于出现了这两个神奇的方法,可以看看他们的大致用法
@Override public void onReq(BaseReq req) { switch (req.getType()) { case ConstantsAPI.COMMAND_GETMESSAGE_FROM_WX: goToGetMsg(); break; case ConstantsAPI.COMMAND_SHOWMESSAGE_FROM_WX: goToShowMsg((ShowMessageFromWX.Req) req); break; default: break; } }
@Override public void onResp(BaseResp resp) { int result = 0; switch (resp.errCode) { case BaseResp.ErrCode.ERR_OK: result = R.string.errcode_success; break; case BaseResp.ErrCode.ERR_USER_CANCEL: result = R.string.errcode_cancel; break; case BaseResp.ErrCode.ERR_AUTH_DENIED: result = R.string.errcode_deny; break; default: result = R.string.errcode_unknown; break; } Toast.makeText(this, result, Toast.LENGTH_LONG).show(); }
c. 在WXEntryActivity中将接收到的intent及实现了IWXAPIEventHandler接口的对
象传递给IWXAPI接口的handleIntent方法:
api.handleIntent(intent, this);
ok,这三步可以结合时序图一起来理解,都可以一一对应的。
最后给出一些注意点,也是容易混淆的,我都写过Demo验证过了,如果大家觉得有
不对的,欢迎指出,欢迎讨论
1、注册是本地注册,且只需要注册一次,但是在发送的时候微信服务器会检测第三方
应用的合法性
2、说白了就是在本地第三方应用将要发送的内容先发给微信进程,微信进程收到后再
将消息发给自己的微信好友
3、卸载或者反注册后,第三方应用将不会出现在本机微信的可添加应用列表中
4、使用微信开放平台发送的媒体对象中,网页,音频和视频只能是网络URL,图片可
发送本地路径,本地字节数据,网络URL,文件可以发送本地字节数据和本地路径,
附带在媒体对象中的字节数组,微信默认会是点击则给出下载界面,下载后存储的
路径是在/sdcard/Tecent/MicroMsg/本机微信帐号(一般是一串字母数字的组合体)/attachment
文件夹下。如果要自行处理只能是appdata类型数据,理由下面给出:
appdata类型的对象唯一特殊点就只是告诉微信这个消息点击时需要调用第三方应用,
而其他类型的媒体对象被点击时所显示的是微信的默认页面
5、微信根据transaction字段决定消息在聊天框中的表现以及点击后的响应,只有
appdata被点击时可以调用第三方应用的进程,所触发的方法是实现了IWXAPIEventHandler
接口的类的onReq方法,类型是ConstantsAPI.COMMAND_SHOWMESSAGE_FROM_WX
而在微信中和好友聊天时点击第三方应用图标所所触发的方法是实现了IWXAPIEventHandler
接口的类的onReq方法,类型是ConstantsAPI.COMMAND_GETMESSAGE_FROM_WX
6、微信会根据第三方应用是否注册来给出应用安装的信息,比如传给微信好友一个音频消息时,
当好友点击那个消息,微信会以一个WebView来load音频消息中的URL,不过在此前会在URL
后面附加一些微信定义的信息,其中就会包括一个字段是isInstalled
注:本博客的原创文章欢迎转载,但是请注明转载地址,否则将追究法律责任,
谢谢合作,希望共同学习。
CorePlot升级到1.0了,试用了一下,感觉功能和稳定性上都有了较大提升。所以专门写了几篇 1.0 的试用体验。
1. 编译 CorePlot 框架
首先需要下载Core Plot框架。
你可以在这里找到 1.0版本 Core Plot 的下载链接:
http://code.google.com/p/core-plot/downloads
下载后文件名为:CorePlot_1.0.zip。解压缩,即可得到 Core Plot框架的SDK及示例项目。
Core Plot SDK 以静态库的方式提供,我们需要编译成.a静态库文件。打开解压缩目录的 Source/framework/ 目录,有两个Xcode项目: CorePlot-CocoaTouch.xcodeproj 和CorePlot.xcodeproj。前者是iOS SDK,后者是 OSX SDK。双击 CorePlot-CocoaTouch.xcodeproj ,用Xcode 打开。点击 Run,即可在 Source/build 目录下编译出 CorePlot-CocoaTouch.a 文件。
提示:如果你不想自己编译 Core Plot SDK 静态库,在解压缩目录 “Binaries/iOS/CorePlotHeaders”目录中已经提供了一个现成的CorePlot-CocoaTouch.a 文件。
2. 使用 Core PlotSDK
编译好的静态库(.a文件),你要以静态库的方式链接到工程中。新建项目,执行以下步骤:
1、将解压缩目录中“Binaries/iOS/CorePlotHeaders”目录下的所有头文件拖到你的Xcode项目中。
2、将 .a 文件拖到你的项目中。
3、在Target的Build Settings设置中,找到Other Linker Flags,加入“ObjC -all_load”。
4、往工程中加入QuartzCore框架。
注意:如果你在编译项目时遇到错误“Command/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/clang failed with exitcode 1”,请将 Scheme 从 iOS Device 改为 iPhone 5.0 Simulator。或者将Compiler for C/C++ 改为LLVM GCC 4.2。同时,Core Plot 1.0 不再支持老的 armv6 CPU。
接下来我们运行 Core Plot SDK中的一个散点图的例子,演示如何在工程中使用Core Plot SDK。
将解压缩目录的 Source/examples/CPTTestApp-iPhone/Classes 目录下的CPTTestAppScatterPlotController.m和 CPTTestAppScatterPlotController.h 文件拖到Xcode项目中。
在你的view controller的.xib中,拖入一个 Object 对象,将 Identifier 改成CPTTestAppScatterPlotController。这样是为了从.xib中创建一个CPTTestAppScatterPlotController 实例。将.xib中的 View 对象的Identifier 改成CPTGraphHostingView。这是因为 CPTGraph 必须放在 CPTGraphHostingView 对象中。
图 1 将 View 对象的类型改为CPTGraphHostingView
连接 GraphHosting View 对象到 Test App Scatter Plot Controller 的 view 出口上。
运行程序,如图 2 所示。
图 2 运行程序
但程序还有一个Bug需要解决。此时如果你拖动图表,程序将出现EXEC_BAD错误并崩溃。我们需要自己持有 Test App Scatter PlotController 对象。最简单的办法,是在view controller中创建一个出口,并连接到 Test App Scatter PlotController 对象。再次运行程序,你就可以拖动或缩放图表了。