最近的android项目开发问题总结

2024-09-03 02:32

本文主要是介绍最近的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();       
        }});
        }}

5 判断网络状态时
一般都会忘记加权限的问题,所以莫名的就程序崩溃了,一般都是加了联网的权限就忘记其他的了
    <!-- 获得网络 -->
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
6. 遇到下划线,中划线链接,上标下标气泡和moji表情的操作
你还在为这些东西困恼吗,当你遇到下划线你可能首先想到的是富文本吧,或者from.html();现在你可以用这个东西了,或许你了解的不是很多吧,那么我建议你使用一下spannablestring和ImageSpan这两个类,让你图文结合,想多美观就多美观还便于操作,再也不用通过写style来改变了,下面是spannableString的一些属性,你是否找到了你想要的效果呢
而开发表情的输入最简便的方法就是使用ImageSpan,真正实现文字对应图片,节省了不少的代码。
7.Android 百度地图开发问题----解决地图有时候加载不出来问题
相信很多人在开发百度地图的时候会出现百度地图有时候会加载不出来,只显示网格图。 这个问题究其原因就是申请百度key的时候填写的SHA1也就是指纹证书有问题。估计很多开发者都是照着百度开放平台上介绍的流程去申请的。

当然,照着百度开放平台上去申请是没错的。但是上面介绍的申请得到的指纹证书只是本地开发环境存在的默认签名文件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上的话就需要微信授权登陆了。

  1. 目前移动应用上微信登录只提供原生的登录方式,需要用户安装微信客户端才能配合使用。也就是如果第三方应用需要微信授权登陆的话就必须在本机上安装了微信。而后续授权登陆或调用接口之类的相当于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项目开发问题总结的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1131769

相关文章

使用Go语言开发一个命令行文件管理工具

《使用Go语言开发一个命令行文件管理工具》这篇文章主要为大家详细介绍了如何使用Go语言开发一款命令行文件管理工具,支持批量重命名,删除,创建,移动文件,需要的小伙伴可以了解下... 目录一、工具功能一览二、核心代码解析1. 主程序结构2. 批量重命名3. 批量删除4. 创建文件/目录5. 批量移动三、如何安

Nginx启动失败:端口80被占用问题的解决方案

《Nginx启动失败:端口80被占用问题的解决方案》在Linux服务器上部署Nginx时,可能会遇到Nginx启动失败的情况,尤其是错误提示bind()to0.0.0.0:80failed,这种问题通... 目录引言问题描述问题分析解决方案1. 检查占用端口 80 的进程使用 netstat 命令使用 ss

部署Vue项目到服务器后404错误的原因及解决方案

《部署Vue项目到服务器后404错误的原因及解决方案》文章介绍了Vue项目部署步骤以及404错误的解决方案,部署步骤包括构建项目、上传文件、配置Web服务器、重启Nginx和访问域名,404错误通常是... 目录一、vue项目部署步骤二、404错误原因及解决方案错误场景原因分析解决方案一、Vue项目部署步骤

mybatis和mybatis-plus设置值为null不起作用问题及解决

《mybatis和mybatis-plus设置值为null不起作用问题及解决》Mybatis-Plus的FieldStrategy主要用于控制新增、更新和查询时对空值的处理策略,通过配置不同的策略类型... 目录MyBATis-plusFieldStrategy作用FieldStrategy类型每种策略的作

Android 悬浮窗开发示例((动态权限请求 | 前台服务和通知 | 悬浮窗创建 )

《Android悬浮窗开发示例((动态权限请求|前台服务和通知|悬浮窗创建)》本文介绍了Android悬浮窗的实现效果,包括动态权限请求、前台服务和通知的使用,悬浮窗权限需要动态申请并引导... 目录一、悬浮窗 动态权限请求1、动态请求权限2、悬浮窗权限说明3、检查动态权限4、申请动态权限5、权限设置完毕后

linux下多个硬盘划分到同一挂载点问题

《linux下多个硬盘划分到同一挂载点问题》在Linux系统中,将多个硬盘划分到同一挂载点需要通过逻辑卷管理(LVM)来实现,首先,需要将物理存储设备(如硬盘分区)创建为物理卷,然后,将这些物理卷组成... 目录linux下多个硬盘划分到同一挂载点需要明确的几个概念硬盘插上默认的是非lvm总结Linux下多

Python Jupyter Notebook导包报错问题及解决

《PythonJupyterNotebook导包报错问题及解决》在conda环境中安装包后,JupyterNotebook导入时出现ImportError,可能是由于包版本不对应或版本太高,解决方... 目录问题解决方法重新安装Jupyter NoteBook 更改Kernel总结问题在conda上安装了

golang内存对齐的项目实践

《golang内存对齐的项目实践》本文主要介绍了golang内存对齐的项目实践,内存对齐不仅有助于提高内存访问效率,还确保了与硬件接口的兼容性,是Go语言编程中不可忽视的重要优化手段,下面就来介绍一下... 目录一、结构体中的字段顺序与内存对齐二、内存对齐的原理与规则三、调整结构体字段顺序优化内存对齐四、内

pip install jupyterlab失败的原因问题及探索

《pipinstalljupyterlab失败的原因问题及探索》在学习Yolo模型时,尝试安装JupyterLab但遇到错误,错误提示缺少Rust和Cargo编译环境,因为pywinpty包需要它... 目录背景问题解决方案总结背景最近在学习Yolo模型,然后其中要下载jupyter(有点LSVmu像一个

解决jupyterLab打开后出现Config option `template_path`not recognized by `ExporterCollapsibleHeadings`问题

《解决jupyterLab打开后出现Configoption`template_path`notrecognizedby`ExporterCollapsibleHeadings`问题》在Ju... 目录jupyterLab打开后出现“templandroidate_path”相关问题这是 tensorflo