本文主要是介绍最近的android项目开发问题总结,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
安卓开发还是有碰到很多的问题,然后只有通过项目开发才能提升一些经验,感觉2年前学校里的东西还是学的不少,真正用到的并不是那么多,四大组件其实也就activity采用的多点,其他的三大组件在项目中并不是很常用,但是面试的时候有可能问到,所以我们呢还不得不学这些东西,写code是一个什么样的过程,我现在也说不出来,反正年轻还是多学点咯
1、android通过get方式传递中文参数到java web服务器出现乱码
解决方法:
android使用URLEncoder编码
String str = URLEncoder.encode(str ,"UTF-8");
如果你用的是http请求数据的话,那么最好在设置请求参数时这样
request.setEntity(new UrlEncodedFormEntity(nameValuePairs,
HTTP.UTF_8));
java web端使用
String str =request.getParameter("str");
str= new String(str.getBytes("ISO8859-1"),"UTF-8");//ISO8859-1这种编码在网页里你不得不防
2、android点击listview的item项没反应(3种处理的方式)
如listView.setOnItemClickListener(new OnItemClickListener(){public void onItemClick(AdapterView<?> parent, View view, int position, long id){viewItemDetail(position); }});
错误原因:listview,grideView的元素里不能包括button、imageButton这些点击事件按钮,因为这些按钮性质的控件把整个item的焦点抢去了,然后基于事件分发的机制使整个item的ontuch都不在响应
解决方式:(1)把button、imageButton换成imageView获者textView就ok了,(2)如果你是使用的baseAdapter的话也可以在getView方法里对convertView添加onclick事件,那么这个焦点是不会失效的,把postion改成final的,就能知道响应的具体是那个item,如果listView是自定义的只需把事件分发返回false.((3)ListViewItem有Button或者Checkable的子类控件的话,那么默认focus是交给了子控件,而ListView的Item能被选中的基础是它能获取Focus,也就是说我们可以通过将ListView中Item中包含的所有控件的focusable属性设置为false,这样的话ListView的Item自动获得了Focus的权限,也就可以被选中了,也就会响应onItemClickListener中的onItemClick()方法,然而将ListView的Item Layout的子控件focusable属性设置为false有点繁琐,我们可以通过对Item Layout的根控件设置其android:descendantFocusability=”blocksDescendants”即可,这样Item Layout就屏蔽了所有子控件获取Focus的权限,不需要针对Item Layout中的每一个控件重新设置focusable属性了,如此就可以顺利的响应onItemClickListener中的onItemClick()方法了。所以总结一下,最简单的解决方法就是在ListView的Item选项的布局文件根上android:descendantFocusability=”blocksDescendants”就可以了。
3、在两个Activity跳转时,由于第二个Activity在启动时加载了较多数据,就会在启动之前出现一个短暂的黑屏时间,解决这个问题比较简单的处理方法是将第二个Activity的主题设置成透明的,这样在启动第二个Activity时的黑屏就变成了显示第一个Activity界面。这个分两步完成:
第一步:xxx/res/values/styles.xml中加入自定义Activity的Theme,如下所示:
<style name="Transparent" parent="android:Theme.Light">
<!--将Activity的Theme设置成透明-->
<item name="android:windowIsTranslucent">true</item>
</style>
<style name="Transparent" parent="android:Theme.Light">
<!--将Activity的Theme设置成透明-->
<item name="android:windowIsTranslucent">true</item>
</style>第二步:在AndroidManifest.xml中将第二个Activity的"android:theme"属性设置成刚才自定义的主题样式。如下所示:
<activity android:name=".CustomerActivity" android:label="@string/app_name" android:theme="@style/Transparent"> 到此应该就不会出现那个讨厌的黑屏了。
4 .android webview开发html5
在android使用webview开发Html5时,html5使用了缓存,需要配置webview开启
// 设置可以使用localStorage myWebView.getSettings().setDomStorageEnabled(true); android webview开发html5之开启AppCache // 应用可以有数据库 myWebView.getSettings().setDatabaseEnabled(true); String databasePath = this.getApplicationContext().getDir(“database”, Context.MODE_PRIVATE).getPath(); myWebView.getSettings().setDatabasePath(databasePath); // 应用可以有缓存 myWebView.getSettings().setAppCacheEnabled(true); String appCaceDir =this.getApplicationContext().getDir(“cache”, Context.MODE_PRIVATE).getPath(); myWebView.getSettings().setAppCachePath(appCaceDir); myWebView.setWebChromeClient(new WebChromeClient() { @Override public void onExceededDatabaseQuota(String url, String databaseIdentifier, long quota, long estimatedDatabaseSize, long totalQuota, QuotaUpdater quotaUpdater) {quotaUpdater.updateQuota(5 * 1024 * 1024); }});
WebView中存在着两种缓存:网页数据缓存(存储打开过的页面及资源)、H5缓存(即appcache)。
1、缓存构成
根据setAppCachePath(String appCachePath)提供的路径,在H5使用缓存过程中生成的缓存文件。
2、缓存模式
无模式选择,通过setAppCacheEnabled(boolean flag)设置是否打开。默认关闭,即,H5的缓存无法使用。
3、清除缓存
找到调用setAppCachePath(String appCachePath)设置缓存的路径,把它下面的文件全部删除就OK了。
4、控制大小
通过setAppCacheMaxSize(long appCacheMaxSize)设置缓存最大容量,默认为Max Integer。
同时,可能通过覆盖WebChromeClient.onReachedMaxAppCacheSize(long requiredStorage, long quota, WebStorage.QuotaUpdater quotaUpdater)来设置缓存超过先前设置的最大容量时的策略。
webview具体使用:
// 设置支持JavaScript等 mWebSettings = mWebView.getSettings(); mWebSettings.setJavaScriptEnabled(true); mWebSettings.setBuiltInZoomControls(true); mWebSettings.setLightTouchEnabled(true); mWebSettings.setSupportZoom(true); mWebView.setHapticFeedbackEnabled(false); mWebSettings.setJavaScriptEnabled(true); mWebSettings.setSupportZoom(true);// 网页缩放 mWebSettings.setBuiltInZoomControls(true); mWebSettings.setDefaultZoom(ZoomDensity.CLOSE);// 默认缩放模式 mWebView.setInitialScale(100); // mWebView.loadDataWithBaseURL("file:///android_asset/", html, // mimeType, // encoding, ""); mWebView.loadUrl(www.baidu.com);
如果用webview点链接看了很多页以后,如果不做任何处理,点击系统“Back”键,整个浏览器会调用finish()而结束自身,如果希望浏览的网页回退而不是退出浏览器,需要在当前Activity中处理并消费掉该Back事件。
覆盖Activity类的onKeyDown(int keyCoder,KeyEvent event)方法。
Android的webView很强大,其实就是一个浏览器,你可以把它嵌入到你想要的位置,我这里遇到两个问题,就是怎么知道网页的加载进度和加载网页时,点击网页里面的链接还是在当前的webview里跳转,不想跳到浏览器那边,解决办法如下:
//此方法可以处理webview 在加载时和加载完成时一些操作 webView.setWebChromeClient(new WebChromeClient(){} @Override public void onProgressChanged(WebView view, int newProgress) {if(newProgress==100){// 这里是设置activity的标题, 也可以根据自己的需求做一些其他的操作 title.setText(“加载完成”);}else{title.setText(“加载中…….”); }} }); webView.setWebViewClient(new WebViewClient(){ @Override public boolean shouldOverrideUrlLoading(WebView view, String url) {//重写此方法表明点击网页里面的链接还是在当前的webview里跳转,不跳到浏览器那边 view.loadUrl(url); return true; } @Override public void onReceivedSslError(WebView view, SslErrorHandler handler, android.net.http.SslError error) {// 重写此方法可以让webview处理https请求 handler.proceed(); }}); }}
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
当然,照着百度开放平台上去申请是没错的。但是上面介绍的申请得到的指纹证书只是本地开发环境存在的默认签名文件debug.keystore的指纹证书。流程如下:
第一步:打开命令窗口,输入cd .android。(这一步说明开发环境默认的签名证书debug.keystore存放在C盘.android目录中)
第二步:进入.android目录后,接着输入keytool -list -v -keystore debug.keystore,这里的debug.keystore就是开发环境下默认的签名文件了。
值得注意的是:我们在开发一个apk发布在应用商店时,需要我们自己的生成的签名文件,这个签名文件和开发环境默认的签名文件肯定是不同的,至少指纹证书SHA1就不同。所以,当我们通过我们自己生成的签名文件导出签名的apk时,百度地图的key应该是我们自己的签名文件中的指纹证书,如果还是用的是debug.keystore的SHA1申请的key,百度地图自然就会有问题。比如,我们导出apk的签名文件名字为myapp.keystore;那么可以通过在命令窗口中输入keytool -list -v -keystore myapp.keystore得到SHA1,然后通过这个SHA1去申请百度key,这样,你导出的签名apk的百度地图功能就不会只显示方格图加载不出来地图的问题了。
总之:如果你用到百度地图功能的apk,仅仅是通过本地环境运行的,你完全可以按照百度开放平台上介绍的流程去获取SHA1。但是,如果你开发的apk是需要自己生成的签名文件(签名证书)导出,放到应用商店去给别人下载的。那么,你申请百度地图key的SHA1值,就应该是来自你生成的签名文件中的SHA1值,SHA1查看方式keytool -list -v -keystore 签名文件。(注意要进入文件所在路径再输入命令)。
8.第三方微信的登录问题
大家都知道随着开发功能需求的多元化,第三方登录,分享和云开发是越来越火热,然而大家在开发第三方登录和分享的过程中就TMD微信的是最难搞和最费事的,估计还有可能搞不好。
可是微信开放平台接入指南里有几个地方写的不清不楚。在此总结一下,以便需要的人。
很多微信公众平台的应用如果移植到app上的话就需要微信授权登陆了。
- 目前移动应用上微信登录只提供原生的登录方式,需要用户安装微信客户端才能配合使用。也就是如果第三方应用需要微信授权登陆的话就必须在本机上安装了微信。而后续授权登陆或调用接口之类的相当于app和微信两个应用之间通话。
不成功的主要原因有几个:
a. 忘记在你的包名相应目录下新建一个wxapi目录,并在该wxapi目录下新增一个WXEntryActivity类,该类继承自Activity(例如应用程序的包名为net.sourceforge.simcpux.wxapi,则新添加的类如下图所示)【如果是易信的话】,并且在清单文件里面进行注册
b.授权
我这里是写啊MyApplication里面的,这个大家可以用自己的方法去写。首先我们要先定义要用的IWXAPI ,注册好
public static IWXAPI WXapi;
WXapi = WXAPIFactory.createWXAPI(this, weixin_App_ID, true); (weixin_App_ID就是申请项目得到的AppID)
WXapi.registerApp(weixin_App_ID);
好,我们在来看授权代码。
SendAuth.Req req = new SendAuth.Req();
req.scope = "snsapi_userinfo";
req.state = "wechat_sdk_demo";
MyApplication.WXapi.sendReq(req);
同意授权会返回到 WXEntryActivity这个类,调用onResp(BaseResp resp) 方法
蛋疼的地方来了。。。
这里我们看到我们已经拿到code了,
正常情况下我们都会去resp.code得到String类型的code,不过这里就是点不出来。点不出来,得到不code,我们无法进行下一步。
后来我查了下他的父类才发现。我们可以吧resp强行转成SendAuth.Resp类型。(在这里,我也迷茫了很久)
SendAuth.Resp sendResp = (SendAuth.Resp) resp;
这样我们可以就可以通过sendResp来点出code。
sendResp.code OK,得到code接下来就简单多了。哈哈。。。
c.通过code参数加上AppID和AppSecret等,通过API换取access_token出错
这篇关于最近的android项目开发问题总结的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!