android studio 设置项目支持的so库架构
ndk {
// 设置支持的SO库架构
abiFilters 'armeabi', 'x86', 'x86_64', 'armeabi-v7a', 'armeabi','arm64-v8a','mips','mips64'
}
json数据null值转换
null转换成其他字符
public class StringConverter implements JsonSerializer<String>,
JsonDeserializer<String>{
public String deserialize(JsonElement json, Type typeOfT,
JsonDeserializationContext context)
throws JsonParseException {
return json.getAsJsonPrimitive().getAsString();
}
public JsonElement serialize(String src, Type typeOfSrc,
JsonSerializationContext context) {
if (src == null) {
return new JsonPrimitive("null");
} else {
return new JsonPrimitive(src.toString());
}
}
}
使用
GsonBuilder gb = new GsonBuilder();
gb.registerTypeAdapter(String.class, new StringConverter());
Gson gson = gb.create();
Android Studio 修改虚拟机路径
到虚拟机目录的上一级文件夹的目录,找到对应虚拟机的配置文件,进行虚拟机目录的修改
创建 svg 文件时(使用导入功能,而非 as 自带的)发生错误
- asset studio could not generate a preview
源文件异常,使用 ps 等专业工具生成(本文采用生成 psd 的形式,注意生成的文件名称不要有中文)
设计底部类似闲鱼中间按钮凸起的底部导航栏
原文地址:https://blog.csdn.net/xh870189248/article/details/75808341
父布局添加属性(注意不同的父布局,可能导致导航栏上部的内容遮住凸起的按钮,这里的父布局使用LinearLayout,RelativeLayout 会产生错误)
android:clipChildren="false"
在 fragment 中监听 webview 返回上一个页面的方法
原文地址:https://www.jianshu.com/p/252ec6b8f6fc
webView.setOnKeyListener(new View.OnKeyListener() {
@Override
public boolean onKey(View v, int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_BACK && webView.canGoBack()) {
webView.goBack();
}
return false;
}
});
webView.setOnKeyListener(new View.OnKeyListener() { 执行两次
增加判断:event.getAction() == KeyEvent.ACTION_UP
参考地址:https://blog.csdn.net/rongwenbin/article/details/51396241
webView.setOnKeyListener(new View.OnKeyListener() {
@Override
public boolean onKey(View v, int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_BACK && event.getAction() == KeyEvent.ACTION_UP) {
if (webView.canGoBack()) {
appSpContent.edit().putBoolean(IS_TO_MAIN, false).apply();
// LogUtil.e("goback" + appSpContent.getBoolean(IS_TO_MAIN, true));
webView.goBack();
} else {
// LogUtil.e("ungoback" + appSpContent.getBoolean(IS_TO_MAIN, true));
appSpContent.edit().putBoolean(IS_TO_MAIN, true).apply();
}
}
return false;
}
});
webview 中前端存储 Android 传递的数据
// 报错 Android Webview: “Uncaught TypeError: Cannot read property 'xxx' of null”
webiew.getSettings().setDomStorageEnabled(true);// 不打开这个,前端存储就会失败
使用 Intent 传递数据的时候失效
参考:https://blog.csdn.net/wangchun8926/article/details/39100661
在 AndroidManiFest.xml 中使用 singleTask 启动模式的 Activity 中添加如下代码:
@Override
protected void onNewIntent(Intent intent) {
super.onNewIntent(intent);
setIntent(intent);
}
集成网易云互动直播(网易SDK)直播的画面会随着屏幕的旋转自动旋转,要修改这个问题修改代码如下:
参考:网易云信1,
@Override
public void onVideoFrameResolutionChanged(String account, int width, int height, int rotate) {
// 右上角的老师的直播图像会随着屏幕的旋转而改变,下面这句代码会禁用这个自动旋转
AVChatManager.getInstance().setParameter(AVChatParameters.KEY_VIDEO_ROTATE_IN_RENDING, Boolean.FALSE);
}
关于postman get 请求的参数
// Android 项目中 res/values/styles 中的属性继承关系
<style name="control_btn">
<item name="android:layout_width">wrap_content</item>
<item name="android:layout_height">wrap_content</item>
<item name="android:layout_gravity">center</item>
<item name="android:layout_weight">1</item>
<item name="android:clickable">true</item>
<item name="android:padding">@dimen/space_4</item>
</style>
<style name="control_btn.space">
<item name="android:clickable">false</item>
</style>
<style name="control_btn.action" >
<item name="android:padding">10dp</item>
</style>
// recyclerview 侧滑 SlideRecyclerview 侧滑删除收藏等
可能需要监听,否则无法侧滑
// LinearLayout 子 view 点击事件 child 点击事件 LinearLayout 动态添加 view
// 子 view 点击事件
private void colorLinearLayoutClick() {
for (int i = 0; i < mLlColorSelector.getChildCount(); i++) {
final int colorIndex = i;
((RoundTextView) mLlColorSelector.getChildAt(i))
.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
int selectColor = ((RoundTextView)mLlColorSelector.getChildAt(colorIndex))
.getDelegate().getBackgroundColor();
changeTextColor(selectColor);
Log.e("-------------", "child select color " + selectColor);
}
});
}
}
// 一、动态添加view
mLlColorSelector.removeAllViews();
for (int i = 0; i < 9; i++) {
colorItem = new RoundTextView(getActivity());
colorItem.getDelegate().setCornerRadius(5);
LinearLayout.LayoutParams llp = new LinearLayout.LayoutParams(60, 60);
llp.setMarginEnd(34);
colorItem.setLayoutParams(llp);
switch (i) {
case 0: color = BLACK; break; case 1: color = WHITE; break;
case 2: color = RED; break; case 3: color = 0xFFFE9500 /*pick*/; break;
case 4: color = GREEN; break; case 5: color = BLUE; break;
case 6: color = CYAN; break; case 7: color = YELLOW; break;
case 8: color = 0xFFFF2592/*orange*/; break;
}
colorItem.getDelegate().setBackgroundColor(color);
mLlColorSelector.addView(colorItem);
}
// 二、动态添加view
View view = View.inflate(context, R.layout.xxxxxxxx, null);
TextView content = view.findViewById(R.id.content);
content.setText(data.get(i));
view.setTag(data.get(i));
view.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
}
});
flowLayout.addView(view);
// Viewpager禁止滑动 禁止左右滑动
package com.dm.dsh.widgat;
import android.content.Context;
import android.support.v4.view.ViewPager;
import android.util.AttributeSet;
import android.view.MotionEvent;
public class NoScrollViewPager extends ViewPager {
private boolean isScroll;
public NoScrollViewPager(Context context,AttributeSet attrs){
super(context, attrs);
}
public NoScrollViewPager(Context context) {
super(context);
}
/**
* 1.dispatchTouchEvent一般情况不做处理
*,如果修改了默认的返回值,子孩子都无法收到事件
*/
@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
return super.dispatchTouchEvent(ev); // return true;不行
}
/**
* 是否拦截
* 拦截:会走到自己的onTouchEvent方法里面来
* 不拦截:事件传递给子孩子
*/
@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
// return false;//可行,不拦截事件,
// return true;//不行,孩子无法处理事件
//return super.onInterceptTouchEvent(ev);//不行,会有细微移动
if (isScroll){
return super.onInterceptTouchEvent(ev);
}else{
return false;
}
}
/**
* 是否消费事件
* 消费:事件就结束
* 不消费:往父控件传
*/
@Override
public boolean onTouchEvent(MotionEvent ev) {
//return false;// 可行,不消费,传给父控件
//return true;// 可行,消费,拦截事件
//super.onTouchEvent(ev); //不行,
//虽然onInterceptTouchEvent中拦截了,
//但是如果viewpage里面子控件不是viewgroup,还是会调用这个方法.
if (isScroll){
return super.onTouchEvent(ev);
}else {
return true;// 可行,消费,拦截事件
}
}
public void setScroll(boolean scroll) {
isScroll = scroll;
}
}
<com.zowneo.view.widget.NoScrollViewPager
android:id="@+id/viewpager"
android:overScrollMode="never"
android:scrollbars="none"
android:layout_width="match_parent"
android:layout_height="match_parent" />