最近的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

相关文章

HarmonyOS学习(七)——UI(五)常用布局总结

自适应布局 1.1、线性布局(LinearLayout) 通过线性容器Row和Column实现线性布局。Column容器内的子组件按照垂直方向排列,Row组件中的子组件按照水平方向排列。 属性说明space通过space参数设置主轴上子组件的间距,达到各子组件在排列上的等间距效果alignItems设置子组件在交叉轴上的对齐方式,且在各类尺寸屏幕上表现一致,其中交叉轴为垂直时,取值为Vert

这15个Vue指令,让你的项目开发爽到爆

1. V-Hotkey 仓库地址: github.com/Dafrok/v-ho… Demo: 戳这里 https://dafrok.github.io/v-hotkey 安装: npm install --save v-hotkey 这个指令可以给组件绑定一个或多个快捷键。你想要通过按下 Escape 键后隐藏某个组件,按住 Control 和回车键再显示它吗?小菜一碟: <template

Hadoop企业开发案例调优场景

需求 (1)需求:从1G数据中,统计每个单词出现次数。服务器3台,每台配置4G内存,4核CPU,4线程。 (2)需求分析: 1G / 128m = 8个MapTask;1个ReduceTask;1个mrAppMaster 平均每个节点运行10个 / 3台 ≈ 3个任务(4    3    3) HDFS参数调优 (1)修改:hadoop-env.sh export HDFS_NAMENOD

如何用Docker运行Django项目

本章教程,介绍如何用Docker创建一个Django,并运行能够访问。 一、拉取镜像 这里我们使用python3.11版本的docker镜像 docker pull python:3.11 二、运行容器 这里我们将容器内部的8080端口,映射到宿主机的80端口上。 docker run -itd --name python311 -p

学习hash总结

2014/1/29/   最近刚开始学hash,名字很陌生,但是hash的思想却很熟悉,以前早就做过此类的题,但是不知道这就是hash思想而已,说白了hash就是一个映射,往往灵活利用数组的下标来实现算法,hash的作用:1、判重;2、统计次数;

好题——hdu2522(小数问题:求1/n的第一个循环节)

好喜欢这题,第一次做小数问题,一开始真心没思路,然后参考了网上的一些资料。 知识点***********************************无限不循环小数即无理数,不能写作两整数之比*****************************(一开始没想到,小学没学好) 此题1/n肯定是一个有限循环小数,了解这些后就能做此题了。 按照除法的机制,用一个函数表示出来就可以了,代码如下

hdu1043(八数码问题,广搜 + hash(实现状态压缩) )

利用康拓展开将一个排列映射成一个自然数,然后就变成了普通的广搜题。 #include<iostream>#include<algorithm>#include<string>#include<stack>#include<queue>#include<map>#include<stdio.h>#include<stdlib.h>#include<ctype.h>#inclu

嵌入式QT开发:构建高效智能的嵌入式系统

摘要: 本文深入探讨了嵌入式 QT 相关的各个方面。从 QT 框架的基础架构和核心概念出发,详细阐述了其在嵌入式环境中的优势与特点。文中分析了嵌入式 QT 的开发环境搭建过程,包括交叉编译工具链的配置等关键步骤。进一步探讨了嵌入式 QT 的界面设计与开发,涵盖了从基本控件的使用到复杂界面布局的构建。同时也深入研究了信号与槽机制在嵌入式系统中的应用,以及嵌入式 QT 与硬件设备的交互,包括输入输出设

OpenHarmony鸿蒙开发( Beta5.0)无感配网详解

1、简介 无感配网是指在设备联网过程中无需输入热点相关账号信息,即可快速实现设备配网,是一种兼顾高效性、可靠性和安全性的配网方式。 2、配网原理 2.1 通信原理 手机和智能设备之间的信息传递,利用特有的NAN协议实现。利用手机和智能设备之间的WiFi 感知订阅、发布能力,实现了数字管家应用和设备之间的发现。在完成设备间的认证和响应后,即可发送相关配网数据。同时还支持与常规Sof

poj1330(LCA最近公共祖先)

题意:求最近公共祖先 思路:之前学习了树链剖分,然后我就用树链剖分的一小部分知识就可以解这个题目了,记录每个结点的fa和depth。然后查找时,每次将depth大的结点往上走直到x = y。 代码如下: #include<iostream>#include<algorithm>#include<stdio.h>#include<math.h>#include<cstring>