1.Error while executing: am start -n错误解决方案
参考网址:Error while executing: am start -n错误解决方案_菜鸟博客-CSDN博客
说明:如果手动卸载app没有卸载干净,就用了adb uninstall packageName命令运行了一下,再重新运行项目
adb命令安装apk:
a、进入你的Android SDK/platform-tools 目录下
b、将你的apk文件 放到 platform-tools 文件目录下
c、在Android Studio 打开Terminal 输入命令:adb install -r xxx.apk(你放在platform-tools下的apk文件)
2.手机安装apk报签名不一致(提示手机上有该应用,卸载后再安装)
说明:先检查手机上时候有需要安装的apk,如果有的话需要先卸载掉手机上的应用再进行安装,如果手机中没有则可以通过USB线连接电脑运行1中的命令行清除手机中未卸载干净的文件
3.Android 报错Configuration 'compile' is obsolete and has been replaced with 'implementation' and 'api'
在Terminal中输入gradlew compileDebugSources可查看错误信息
解决方法:出现以上错误是因为compile已经过时可以换成implementation
compile ->implementation
androidTestCompile ->androidTestImplementation
testCompile -> testImplementation
4.List中重复数据和重复次数
List list = new ArrayList();
list.add("华为");
list.add("小米");
list.add("华为");
list.add("OPPO");
list.add("小米");
list.add("华为");
list.add("OPPO");
list.add("华为");
list.add("VIVO");
Map<String,Integer> map = new LinkedHashMap<>();
for (int a=0;a<list.size();a++){
if (map.containsKey(list.get(a))){
map.put(list.get(a), map.get(list.get(a))+1);
}else{
map.put(list.get(a), 1);
}
}
for (String key:map.keySet()){
key;//数据
map.values();//出现次数
}
参考网址:Java输出某一个字符串中重复出现的字串(长度为2)及其出现的次数_MisterMister的博客-CSDN博客
JAVA找出List集合中重复次数最多的数据和次数_gaoxiang24的博客-CSDN博客_java找出list中重复数据
5.android studio中修改项目包名
a、修改包文件的名称::右键-->Refactor-->Rename...
b、修改build.gradle中applicationId:你的包名
c、AndroidManifest.xml中package="你的包名"
d、删除.gradle文件(在你的项目中第一个文件)---原因:这个文件中有你项目的缓存数据
说明:如果不删除.gralde文件会报出does not exist.
6.android中录屏视频、截图
https://github.com/jinweime/screencaputre
7.代码中设置Textview中一行字数和获取控件实际宽度
注意:设置TextView一行显示字数时,TextView的宽度只能设置成WRAP_CONTENT,不能指定宽度或MATCH_PARENT
TextView textView = new TextView(this);
textView.setMaxEms(2);//一行最大字数
textView.setSingleLine(false);//是否省略 true 是,false 否
//获取控件的实际宽度、高度
int spec = View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED);
textView.measure(spec,spec);
int width = textView.getMeasuredWidth();
int height = textView.getMeasuredHeight()
8.获取控件字体颜色
参考网址:获取textview字体颜色 - 简书
TextView textView = new TextView(this);
textView.setTextColor(getResources().getColor(R.color.white));//设置字体颜色
int setColor = textView.getCurrentTextColor();//获取字体颜色
int chooseColor = getResources().getColor(R.color.white);
SyStem.out.println("setColor:"+setColor+"..chooseColor:"+chooseColor);//输出结果是两个值是一样的
9.Android中onDestroy() 延迟10秒左右才执行
参考网址:Activity onDestroy() 回调缓慢问题分析及完美解决方案 - popfisher - 博客园
Activity onDestroy() 调用研究_z1074971432的专栏-CSDN博客_activity ondestroy
Android onDestroy方法执行延迟的原因_ganshenml的专栏-CSDN博客
解决方法与建议
不要在Activity的onDestroy方法中做有关于数据存储,状态维护的事情,回收资源也最好不要完全依赖这个方法
private boolean isDestroyed = false;
private void destroy() {
if (isDestroyed) {
return;
}
// 回收资源
isDestroyed = true;
}
@Override
protected void onPause() {
super.onPause();
if (isFinishing()) {
//只有走回收流程的时候(返回键)的那种onPause,isFinishing才为true
//普通的切到后台或者另外一个Activity盖上来的是那个isFinishing是false
destroy();
}
}
@Override
public void onDestroy() {
destroy();
}
10.ScrollView滑动到指定位置
参考网址:android scrollview 滑动到顶端或者指定位置_你好邱林和的专栏-CSDN博客_android scrollview 滚动位置
TexView tv = findViewById(R.di.tv);
ScrollView sv.post(new Runnable() {
@Override
public void run() {
//To change body of implemented methods use File | Settings | File Templates.
//mRootScrollView.fullScroll(ScrollView.FOCUS_DOWN);
int[] location = new int[2];
tv.getLocationOnScreen(location);
int offset = location[1] - sv.getMeasuredHeight();
if (offset < 0) {
offset = 0;
}
sv.smoothScrollTo(0, offset);
}
});
11.Android中软键盘控制显示隐藏
参考网址:android弹出和关闭软键盘_qugengting的博客-CSDN博客_android 关闭软键盘
//隐藏软键盘
public static void hideInput(Activity context) {
InputMethodManager imm = (InputMethodManager) context.getSystemService(context.INPUT_METHOD_SERVICE);
View v = context.getWindow().peekDecorView();
if (null != v) {
imm.hideSoftInputFromWindow(v.getWindowToken(), 0);
}
}
避免软键盘弹出会覆盖底部控件的方法是在布局文件根布局加上一个属性:android:fitsSystemWindows="true"
12.List集合最大值、最小值
int xMax = Collections.max(xList);//取最大值
int xMin = Collections.min(xList);//取最小值
13.Activity的横竖屏切换产生屏幕旋转的问题
参考网址:Android 8.1横屏界面与竖屏界面跳转产生屏幕旋转的问题_wjr1949的博客-CSDN博客
在配置文件AndroidManifest.xml中添加如下代码:
<activity
android:name="AActivity"
android:configChanges="orientation|keyboard|keyboardHidden|screenSize"
android:screenOrientation="portrait" />
在Activity中的onDestroy()中添加如下代码:
@Override
protected void onDestroy() {
super.onDestroy();
//解决切换到上个界面后,横竖屏多次切换的问题
if (android.os.Build.VERSION.SDK_INT >= 27) {
//竖屏
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR_PORTRAIT);
//横屏
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR_LANDSCAPE);
}
}
14.使用Xutils库POST请求,并加header请求头
参考网址:Xutils使用方法,感觉这个框架挺好用的_jian_csdn的专栏-CSDN博客
String url = "http://192.168.1.1/Android/login";
RequestParams params = new RequestParams("utf-8");
params.addHeader("userID","123");
params.addQueryStringParameter("userName","张三");//字符串用这个
params.addBodyParameter("password","123");
Library_T.getHttpUtils().send(HttpRequest.HttpMethod.POST, url,params, new RequestCallBack<Object>() {
@Override
public void onSuccess(ResponseInfo<Object> responseInfo) {
System.out.println("LoginActivity:::" + responseInfo.result);
}
@Override
public void onFailure(HttpException error, String msg) {
System.out.println("LoginActivity:::" + msg);
}
});
15.Android10.0中报NoClassDefFoundError
Failed resolution of: Lorg/apache/comm
Failed resolution of: Lorg/apache/http/conn/scheme/Sch
在AndroidManifest.xml文件的application标签里面加入
<application
android:name=".application.MainApplication"
...
>
<uses-library android:name="org.apache.http.legacy" android:required="false" />
...
</application>
16.Android10.0中设置无标题栏
在Activity的OnCreate中设置以下代码
//如果在AndroidManifest中的application设置android:theme="@android:style/Theme.NoTitleBar"会报错
//实现全屏效果
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,WindowManager.LayoutParams.FLAG_FULLSCREEN);
17.Android10.0中创建文件夹
参考网址:Android 10 不能在内存根目录创建文件夹的问题 - 简书
//1.在manifest文件的application节点中添加
android:requestLegacyExternalStorage="true"
//2.适配
if (Build.VERSION.SDK_INT >= 29) {
//Android10之后
sdDir = context.getExternalFilesDir(null).getAbsolutePath();//获取应用所在根目录/Android/data/your.app.name/file/ 也可以根据沙盒机制传入自己想传的参数,存放在指定目录
} else {
sdDir = Environment.getExternalStorageDirectory();// 获取SD卡根目录
}
18.Android中的Zip解压缩
参考网址:Android中的Zip解压缩 - mfrbuaa - 博客园
Java解压文件的一些坑及经验分享(MALFORMED异常)_Zero的博客-CSDN博客_malformed异常
【bug修复】解决压缩文件夹时中文乱码以及空文件夹丢失 - 简书
解决中文乱码、空文件夹压缩、解压缩丢失情况(资源下载中----Android中zip解压缩2)
注意:指定编码格式要对应
遇到的问题:MALFORMED[1]
说明:由于操作系统平台的差异,导致zip压缩包的编码格式不同, windows默认使用GB2312格式,mac和linux默认使用utf-8格式
19.Android导入已有的SQLite数据库
参考网址:Android导入已有的SQLite数据库_li641808825的博客-CSDN博客
//获取手机中导入的数据库
SQLiteDatabase db = SQLiteDatabase.openOrCreateDatabase(Path+"/abc.db", null);
//接下来就可以对此数据库进行增、删、改、查等操作
20.Android中JSON序列化和反序列化
//JSON数据解析
JSONArray jsonArray = new JSONArray(str);
//"id":1,"pId":0,"name":"张三"
Gson gson = new Gson();
List<TestBean> list = new ArrayList<>();
for (int a=0;a<jsonArray.length();a++){
JSONObject object = (JSONObject) jsonArray.get(a);
TestBean bean = gson.fromJson(object.toString(), TestBean.class);
list.add(bean);
}
class TestBean{
public String id;
public String pId;
public String name;
}
//数据转JSON
JSONArray array = new JSONArray();
for (int a = 0; a < list.size(); a++) {
TestBean bean = list.get(a);
JSONObject obj = new JSONObject();
obj.put("id",bean.id);
obj.put("pId",bean.pId);
obj.put("name",bean.name);
array.put(obj);
}
//JSONArray转String 去掉转义字符
//使用以下方法需要在build.gradle文件中添加引用:implementation 'org.apache.commons:commons-lang3:3.7'
str = StringEscapeUtils.unescapeJava(array.toString());
21.Android中APP初始化运行显示白屏问题
参考网址:解决首次启动程序白屏时间过长的问题
Android Studio中运行项目会出现白屏,是因为Instant Run,而Instant Run是用来提升开发效率的;当release打包后的apk,运行时则不会出现长时间白屏的问题;但并不是没有,只是显示的非常快(一闪而过);如果实在不想出现白屏则可以通过以下来处理:styles.xml中修改
<!--AndroidManifest.xml中-->
<application
android:name=".activity.application.MainApplication"
android:allowBackup="true"
android:icon="@drawable/biao"
android:label="@string/app_name"
android:largeHeap="true"
android:networkSecurityConfig="@xml/network_security_config"
android:persistent="true"
android:sharedUserId="android.uid.system"
android:supportsRtl="true"
android:theme="@style/AppTheme"--------------------对应的styles.xml文件
android:usesCleartextTraffic="true">
<!--styles.xml中-->
<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
<item name="colorPrimary">@color/colorPrimary</item>
<item name="colorPrimaryDark">@color/colorPrimaryDark</item>
<item name="colorAccent">@color/colorAccent</item>
<!--以下两行,用来规避显示白屏,但是会觉得APP打开的慢一些,因为此处是把白屏变成了透明-->
<item name="android:windowIsTranslucent">true</item>
<item name="android:windowNoTitle">true</item>
</style>
22.Android中多次点击Toast只弹出一个
参考网址:Dialog、Toast、Snackbar,你真的了解它们吗?
public class Util {
private static Toast toast;
public static void showToast(Context context,
String content) {
if (toast == null) {
toast = Toast.makeText(context,
content,
Toast.LENGTH_SHORT);
} else {
toast.setText(content);
}
toast.show();
}
}
说明:多次调用showToast时,只弹出一个消息提示;如果有新的信息需要显示时,如果Toast不为null则直接设置setText显示无需再次makeText
23.Android中WebView加载网页不跳转浏览器
参考网址:Android WebView 加载的网页不能缩放相关问_博来品-CSDN博客
//设置用WebView打开内部链接(调用此方法是为了防止 WebView加载网页后,跳转到浏览器打开)
wv_web_view.setWebViewClient(new WebViewClient(){
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
//返回true, 立即跳转,返回false,打开网页有延时
view.loadUrl(url);
return true;
}
});
wv_web_view.loadUrl(URL);//---加载网页
24.判断字符串是否仅为数字
参考网址:https://www.it610.com/article/1279405076372275200.htm
public static boolean isNumeric(String str){
Pattern pattern = Pattern.compile("[0-9]*");
return pattern.matcher(str).matches();
}
25.Android中多个TextView纵向左右对齐
参考网址:https://www.jb51.net/article/119263.htm
在姓和名之间加空格, 但是如果用键盘的空格会在一些机型上对齐、一些机型上不对齐。\u3000是全角空格; \u0020是半角空格,效果跟在英文输入法下直接敲键盘空格一样。 这里要用全角空格, 占位一个汉字。
 ----也是空格,但是无法完全对齐
26.Android中WebView和ListView共存滑动问题
参考网址:ListView嵌套webview滑动冲突_u011808801的专栏-CSDN博客
webView.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View view, MotionEvent motionEvent) {
if (motionEvent.getAction() == MotionEvent.ACTION_UP){
listView.requestDisallowInterceptTouchEvent(false);
}else{
listView.requestDisallowInterceptTouchEvent(true);
}
return false;
}
});
27.ScrollView嵌套listView时 自动滚动到listView最后一条数据的问题
参考网址:ScrollView嵌套listView时 自动滚动到listView最后一条数据的问题_zke1994的博客-CSDN博客
<!--在布局的根节点中添加以下属性-->
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:descendantFocusability="blocksDescendants"<!--这个视图会阻止它的任何后代获得焦点,甚至如果它们是可聚焦的。-->
tools:context=".Activity">
</RelativeLayout>
28.调用系统输入法(打开和关闭)
打开
private void showManager(EditText editText){
//调用系统输入法
InputMethodManager inputManager = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
inputManager.showSoftInput(editText, 0);
}
关闭
private void hintManager(EditText editText){
//参考网址:https://blog.csdn.net/u012305710/article/details/51326173
InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
//若返回true,则表示输入法打开,否则为关闭
boolean isOpen=imm.isActive();
if (isOpen){
//调用隐藏系统默认的输入法
// imm.hideSoftInputFromWindow(InstrumentTestActivity2.this.getCurrentFocus().getWindowToken(),
// InputMethodManager.HIDE_NOT_ALWAYS);
//如果输入法在窗口上已经显示,则隐藏,如果隐藏,则显示输入法到窗口上
//imm.toggleSoftInput(0, InputMethodManager.HIDE_NOT_ALWAYS);
imm.hideSoftInputFromWindow(editText.getApplicationWindowToken(), 0 );
}
}
软键盘弹出时底部布局上移
参考网址:Android 中软键盘弹出时底部布局上移问题 | 孟坤博客
1.
<activity
android:name=".activity.MainActivity"
android:windowSoftInputMode="adjustResize|stateHidden"/>----这句
通过实践发现没有起作用,查询资料得知我的布局是 RelativeLayout,底部菜单用了android:layout_alignParentBottom="true",因此方法一不起作用。
2.在代码 setContentView() 之前加入:
getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN|
WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN);
3.把顶级的layout替换成ScrollView,或者说在顶级的Layout上面再加一层ScrollView的封装。这样就会把软键盘和输入框一起滚动了,软键盘会一直处于底部。
29.获取手机剩余内存
/**
* 显示存储的剩余空间
* @param context
*/
public static long showAvailableSize(Context context){
long romSize =getAvailSpace(Environment.getDataDirectory().getAbsolutePath());//手机内部存储大小
long sdSize =getAvailSpace(Environment.getExternalStorageDirectory().getAbsolutePath());//外部存储大小
System.out.println("内存可用空间: "+ Formatter.formatFileSize(context,romSize));
System.out.println("SD卡可用空间:"+Formatter.formatFileSize(context,sdSize));
romSize = romSize/1024/1024/1024;
return romSize;
}
//获取某个目录的可用空间
public static long getAvailSpace(String path){
StatFs statfs = new StatFs(path);
long size = statfs.getBlockSize();//获取分区的大小
long count = statfs.getAvailableBlocks();//获取可用分区块的个数
return size*count;
}
30.Android中布局隐藏与展开效果的属性动画
参考网址:安卓项目实战之布局隐藏与展开效果的属性动画_智玲君-CSDN博客_android 布局展开收起动画
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context="com.ltl.mpiggybank.MainActivity" >
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="#458EFD"
android:padding="10dip" >
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:gravity="center_vertical"
android:text="下拉展开动画"
android:textColor="#ffffff"
android:textSize="20sp" />
</RelativeLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="#548AEA"
android:gravity="center"
android:orientation="vertical" >
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="20dip"
android:text="昨日收益(元)"
android:textColor="#ffffff"
android:textSize="16sp" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="0.00"
android:textColor="#ffffff"
android:textSize="45sp" />
</LinearLayout>
<LinearLayout
android:id="@+id/linear_hidden"
android:layout_width="match_parent"
android:layout_height="120dip"
android:background="#548AEA"
android:gravity="center"
android:orientation="vertical" >
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="20dip"
android:text="显示的View"
android:textColor="#ffffff"
android:textSize="16sp" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="0.00"
android:textColor="#ffffff"
android:textSize="35sp" />
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="#548AEA"
android:gravity="center"
android:onClick="onClick"
android:orientation="vertical" >
<ImageView
android:id="@+id/my_iv"
android:layout_width="25dip"
android:layout_height="25dip"
android:layout_margin="20dip"
android:src="@drawable/scroll" />
</LinearLayout>
</LinearLayout>
public class MainActivity extends ActionBarActivity {
private LinearLayout mHiddenLayout;
private float mDensity;
private int mHiddenViewMeasuredHeight;
private ImageView mIv;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.activity_main);
mHiddenLayout = (LinearLayout) findViewById(R.id.linear_hidden);
mIv = (ImageView) findViewById(R.id.my_iv);
// 隐藏部分布局的高度
mDensity = getResources().getDisplayMetrics().density;
mHiddenViewMeasuredHeight = (int) (mDensity * 120 + 0.5);
}
public void onClick(View v) {
if (mHiddenLayout.getVisibility() == View.GONE) {
animateOpen(mHiddenLayout);
animationIvOpen();
} else {
animateClose(mHiddenLayout);
animationIvClose();
}
}
private void animateOpen(View v) {
v.setVisibility(View.VISIBLE);
ValueAnimator animator = createDropAnimator(v, 0,
mHiddenViewMeasuredHeight);
animator.start();
}
private void animationIvOpen() {
RotateAnimation animation = new RotateAnimation(0, 180,
Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF,
0.5f);
animation.setFillAfter(true);
animation.setDuration(100);
mIv.startAnimation(animation);
}
private void animationIvClose() {
RotateAnimation animation = new RotateAnimation(180, 0,
Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF,
0.5f);
animation.setFillAfter(true);
animation.setDuration(100);
mIv.startAnimation(animation);
}
private void animateClose(final View view) {
int origHeight = view.getHeight();
ValueAnimator animator = createDropAnimator(view, origHeight, 0);
animator.addListener(new AnimatorListenerAdapter() {
@Override
public void onAnimationEnd(Animator animation) {
view.setVisibility(View.GONE);
}
});
animator.start();
}
private ValueAnimator createDropAnimator(final View v, int start, int end) {
ValueAnimator animator = ValueAnimator.ofInt(start, end);
animator.addUpdateListener(new AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator arg0) {
int value = (int) arg0.getAnimatedValue();
ViewGroup.LayoutParams layoutParams = v.getLayoutParams();
layoutParams.height = value;
v.setLayoutParams(layoutParams);
}
});
return animator;
}
}
31.Android中onDestroy执行延时(对应上边13)
参考网址:Android Activity的onStop()与onDestroy() 回调缓慢,延时调用的问题解决方案_huahuaxiaolian的博客-CSDN博客
解决方法与建议
方法1:监听物理返回键和左上角返回键,关闭页面时销毁
方法2:把销毁的相关代码放到finish()里面
建议:建议尽量不要在Activity的onDestroy方法中做回收资源、数据存储、状态改变等操作
32.AndroidStudio编译报错Cause: java.util.zip.ZipException或者Cause: zip file is empty
参考网址:AndroidStudio编译报错Cause: java.util.zip.ZipException或者Cause: zip file is empty - 简书
说明:报这个错说明jar包、aar文件或者so文件(看libs下文件)没有引用上,不信可以看代码中的引用是报红的状态;还可以查看本地项目目录下libs下的jar大小为0;这种情况下重新复制一份jar到项目中即可
33.Android中JSON数据转Map
String str = object.getString("data");
//数据格式:{"data":{"sds-123":{"name":"张三","age":"10","switch":"数学"}}}
Gson gson = new Gson();
Map<String, Data> maps = gson.fromJson(str, new TypeToken<Map<String, Data>>(){}.getType());
class Data{
public String name;
public String age;
@SerializedName("switch")
public String switchX;//switch不能定义成变量;加上上边一句则可以把JSOn中的switch字段中数据赋值给switchX
}
34.Android中判断WebView是否加载完成
webView.setWebViewClient(new WebViewClient(){
@Override
public void onPageFinished(WebView view, String url) {
super.onPageFinished(view, url);
System.out.println("MainActivity:::网页加载成功");
}
});
35.Android中自定义View的onSizeChanged获取宽高
说明:通过测试发现Android11下自定义View中的onSizeChanged方法获取宽高,当显示自定义View时Home键后台退出到手机界面或调出当前后台任务列表时,onSizeChanged中对应的自定义View的宽高会发生改变
解决办法:
private boolean isLoadDraw = false;
@Override
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
super.onSizeChanged(w, h, oldw, oldh);
//视图的宽高
System.out.println("宽:"+w+"高:"+h);
//自定义View画图:后台退出再进入,在android11高版本中会再次获取View的宽高
if (!isLoadDraw){
drawListener.getViewWidthAndHeight(w,h);
isLoadDraw = true;
}
}
36.ScrollView中自定义View不显示
参考网址:ScrollView中自定义View不显示_iblade的博客-CSDN博客
//自定义View重写以下方法
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
int heightMode = MeasureSpec.getMode(heightMeasureSpec);
int widthSize = MeasureSpec.getSize(widthMeasureSpec);
if (MeasureSpec.UNSPECIFIED == heightMode) {
int heightSize = (int) (widthSize * 1.2f);
setMeasuredDimension(widthMeasureSpec, heightSize);
}
}
37.Android中list集合的排序方法
参考网址:Android中list集合的排序方法_Nothing-CSDN博客_android list排序
List<MyBean> list = new ArrayList();
Collections.sort(list)
MyBean需要实现Comparable<MyBean>,重写compareTo方法
public class User implements Comparable<User>{
private int score;
private int age;
public User(int score, int age){
super();
this.score = score;
this.age = age;
}
public int getScore() {
return score;
}
public void setScore(int score) {
this.score = score;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public int compareTo(User o) {
//返回值0代表相等,1表示大于,-1表示小于
int i = this.getAge() - o.getAge();//先按照年龄排序
if(i == 0){
return this.score - o.getScore();//如果年龄相等了再用分数进行排序
}
return i;
}
}
public static void main(String[] args) {
List<User> users = new ArrayList<User>();
users.add(new User(78, 26));
users.add(new User(67, 23));
users.add(new User(34, 56));
users.add(new User(55, 23));
Collections.sort(users);
for(User user : users){
System.out.println(user.getScore() + ”,” + user.getAge());
}
}
38.Android中获取字体高度
参考网址:Android获取字体高度_xiechengfa的技术笔记-CSDN博客
//获取字体高度
private int getFontHeight(float fontSize) {
Paint paint = new Paint();
paint.setTextSize(fontSize);
Paint.FontMetrics fm = paint.getFontMetrics();
return (int) Math.ceil(fm.descent - fm.top) + 2;
}
39.Android中AlertDialog数据显示不全(添加滑动)
参考网址:Android:给对话框AlertDialog添加垂直滚动条_foxlovejiao的专栏-CSDN博客
说明:当AlertDialog里的内容很多时,就会看不到下面的内容,因为默认情况下,AlertDialog是没有滚动条的,无法滚动到下面去。
解决方法:直接在AlertDialog中引用布局的根布局下使用ScrollView即可。
40.java中将一个list的内容复制给另一个list之后,去新的list进行操作的时候,原来的list也会发生变化
通常方法:
List<Test> str3 = new ArrayList<>();
List<Test> str4 = new ArrayList<>();
str4 = str3;或str4.addAll(str3);或for循环遍历str3添加到str4中
以上这三种方式,当改变str4中数据时,str3中的数据也会随之发生改变
说明:当list的泛型是一个<对象>而不是<基础类型>时,str4中数据的对象指引和str3中是指向的同一对象;所以改变str4中数据str3中也会改变;
为什么说基础类型不会有这种情况,是因为基础类型属于只读的,如果想要修改数据只能str4.set(0,"修改后的数据"),这相当于把数据替换了,并非修改
解决办法:
通过将List中数据序列化和反序列化则可以将str3中的数据重新添加到str4中;说白了这种方式代码简洁和遍历str3,重新创建Test对象添加到str4中一样
List<Test> str3 = new ArrayList<>();
for (int a=0;a<10;a++){
Test bean = new Test();
bean.name = "这是第"+a+"个";
str3.add(bean);
}
List<Test> str4 = new ArrayList<>();
Gson gson = new Gson();
String ss = gson.toJson(str3);
Type type = new TypeToken<List<Test>>(){}.getType();
str4 = gson.fromJson(ss,type);
for (int a=0;a<str4.size();a++){
Test bean = str4.get(a);
bean.name = "这不是第"+a+"个";
}
System.out.println(str3.get(0).name);//这是第0个
System.out.println(str4.get(0).name);//这不是第0个
41.解决FileOutputStream中文乱码问题
参考网址:解决FileOutputStream中文乱码问题_至浊至愚-CSDN博客
File file = new File(filePath);
FileOutputStream fileOutputStream = new FileOutputStream(file);
//旧的
outStream.write(str.getBytes());
outStream.close();
//新的
OutputStreamWriter oStreamWriter = new OutputStreamWriter(fileOutputStream, "utf-8");
oStreamWriter.write(str);
oStreamWriter.close();
42.经纬度转换(ddmm.mmmm(度分)-> dd.dddd(度))
double originLat = Double.valueOf("3801.11111");//纬度
double originLng = Double.valueOf("11428.61111");//经度
double lat = Math.floor(originLat/100) + (originLat - Math.floor(originLat/100)*100)/60;
double lng = Math.floor(originLng/100) + (originLng - Math.floor(originLng/100)*100)/60;
43.android中原生API获取经纬度
private void getLocation(){
Location location = locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER);
ocationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 1000,0, locationListener);
//GPS原始数据输出
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
locationManager.addNmeaListener(mNmeaMessageListener);
} else {
locationManager.addNmeaListener(mNmeaListener);
}
}
@RequiresApi(api = Build.VERSION_CODES.N)
private final OnNmeaMessageListener mNmeaMessageListener = new OnNmeaMessageListener() {
@Override
public void onNmeaMessage(String message, long timestamp) {
/*<1> UTC时间,格式为hhmmss.sss。
<2> 纬度,格式为ddmm.mmmm(前导位数不足则补0)。
<3> 纬度半球,N或S(北纬或南纬)。
<4> 经度,格式为dddmm.mmmm(前导位数不足则补0)。
<5> 经度半球,E或W(东经或西经)。
<6> 定位质量指示,0=定位无效,1=定位有效,2=差分定位(有效)。
<7> 使用卫星数量,从00到12(前导位数不足则补0)。
<8> 水平精确度,0.5到99.9。
<9> 天线离海平面的高度,-9999.9到9999.9米
<10> 高度单位,M表示单位米。
<11> 大地椭球面相对海平面的高度(-999.9到9999.9)。
<12> 高度单位,M表示单位米。
<13> 差分GPS数据期限(RTCM SC-104),最后设立RTCM传送的秒数量。
<14> 差分参考基站标号,从0000到1023(前导位数不足则补0)。
<15> checksum校验和。*/
//GGA语句后边E4代表固定解,E5代表浮点解;E1\E2代表非高精度
//$GNRMC,090540.00,V,,,,,,,241121,,,N,V*14
if (message.contains("$GNGGA")){
List<String> list = new ArrayList<>();
splitS(message,list);
String wd = list.get(2);//度分格式
String jd = list.get(4);//度分格式
final double originLat = Double.valueOf(wd);
final double originLng = Double.valueOf(jd);
final double lat = Math.floor(originLat/100) + (originLat - Math.floor(originLat/100)*100)/60;
final double lng = Math.floor(originLng/100) + (originLng - Math.floor(originLng/100)*100)/60;
String type = list.get(6);
}
Toast.makeText(MainActivity.this, "1:"+message, Toast.LENGTH_SHORT).show();
}
};
GpsStatus.NmeaListener mNmeaListener = new GpsStatus.NmeaListener() {
@Override
public void onNmeaReceived(long l, String s) {
Toast.makeText(MainActivity.this, "2:"+s, Toast.LENGTH_SHORT).show();
}
};
public static void splitS(String str, List<String> list){
if (!str.equals("")){
if (str.contains(",")){
String a = str.substring(0,str.indexOf(","));
if (!a.equals("")){
list.add(a);
}
str = str.substring(str.indexOf(",")+1);
splitS(str,list);
}else if (!str.equals("")){
list.add(str);
}
}
}
//直接获取经纬度
LocationListener locationListener = new LocationListener() {
// Provider的状态在可用、暂时不可用和无服务三个状态直接切换时触发此函数
@Override
public void onStatusChanged(String provider, int status, Bundle extras) {
System.out.println("状态改变");
}
// Provider被enable时触发此函数,比如GPS被打开
@Override
public void onProviderEnabled(String provider) {
System.out.println("提供器启动");
}
// Provider被disable时触发此函数,比如GPS被关闭
@Override
public void onProviderDisabled(String provider) {
System.out.println("提供器关闭");
}
// 当坐标改变时触发此函数,如果Provider传进相同的坐标,它就不会被触发
@Override
public void onLocationChanged(Location location) {
System.out.println("位置改变");
if (location != null) {
Log.e("Map", "Location changed : Lat: " + location.getLatitude() + " Lng: " + location.getLongitude());
latitude = location.getLatitude(); // 经度
longitude = location.getLongitude(); // 纬度
info = "纬度:" + latitude + "," + "经度:" + longitude;
Toast.makeText(MainActivity.this, info, Toast.LENGTH_SHORT).show();
}
}
};
44.String中大小写字母转换
参考网址:JAVA字母的大小写转换 - 迷你熊爱你 - 博客园
//转大写
public static String upA_Z(String string){
return string.toUpperCase();
}
//转小写
public static String downA_Z(String string){
return string.toLowerCase();
}
45.Intent.FLAG_ACTIVITY_NEW_TASK
问题:Calling startActivity() from outside of an Activity context requires the FLAG_ACTIVITY_NEW_TASK flag. Is this really what you want?
说明:Android8.0以下在BroadcastReceiver或Service中打开Activity可以不用加,但Android8.0以上打开Activity如果不加则会报上边的异常错误
Intent intent = new Intent(getContext(), Activity_A.class);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);//使用方法
getContext().startActivity(intent);
参考网址:Android Intent.FLAG_ACTIVITY_NEW_TASK的说明_weixin_33788244的博客-CSDN博客
Android Intent.FLAG_ACTIVITY_NEW_TASK的个人理解_u010389391的博客-CSDN博客_flag_activity_new_task