Android 问题整理 三

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 自带的)发生错误

  1. 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 侧滑删除收藏等

可能需要监听,否则无法侧滑

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禁止滑动 禁止左右滑动

参考: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" />

 

发表评论

zh_CNChinese
zh_CNChinese