Android踩坑小记(持续更新)

文章目录

  • dialog居中问题
  • dialog适配全面屏
  • 魅族MX5 显示白色shape无效的问题
  • Android studio Connection timed out: connect
  • webview页面软键盘弹出不了
  • webview一键登录手机QQ失败
  • NestedScrollView+RecycleView滚动的问题
  • dialog弹窗后导致沉浸栏(statusbar)变黑的问题
  • app finish 退出应用重启,application的oncreate方法没有重新执行
  • App退到后台,个推发送通知打开不了目标页,打开的是MainActivity的解决办法
  • 当RecyclerView遇到Inconsistency detected崩溃时
  • 解决部分机型的webview goBack方法返回的页面是空白页面
  • URLDecoder: Illegal hex characters in escape (%) pattern
  • NestedScrollView嵌套RecyclerView导致快速滚动列表的时候会停留在列表的顶部
  • JSONObject的optLong()的坑
  • URL中关于空格的编码转换成+或转换成%20的问题
  • Android 9 网络适配 network-security-config & cleartextTrafficPermitted
  • databinding中的TextView设置margin属性
  • Caused by: org.apache.xerces.impl.io.MalformedByteSequenceException: Invalid byte 3 of 3-byte UTF-8
  • Android 上出现:Type parameter T has incompatible upper bounds: ViewDataBinding 的问题
  • Missing import expression although it is registered
  • favicon.ico不存在导致webview#WebViewClient的onReceivedHttpError返回404状态码
  • 刘海屏如何全屏让布局延伸到状态栏底下
  • androidx.preference.PreferenceScreen 去除左边空白
  • The style on this component requires your app theme to be Theme.MaterialComponents
  • android 编译突然出错,错误原因 Could not resolve com.tencent.mm.opensdk:wechat-sdk-android-without-mta:+.
  • 微信登录,返回-6错误
  • 微信取消分享后还是执行成功函数
  • Cause: invalid type code: 1C
  • ExoPlayerFactory.newSimpleInstance 报错
  • exoplayer2.upstream.HttpDataSource$InvalidResponseCodeException: Response code 302
  • Textview做跑马灯出现抖动问题
  • 解决Android10读取不到/sdcard/、/storage/emulated/0/文件的问题
  • java.lang.IndexOutOfBoundsException: Inconsistency detected. Invalid view holder adapter positionBaseViewHolder{d29491a position=4 id=-1, oldPos=-1, pLpos:-1 no parent}
  • 解决支付宝SDK与友盟推送SDK出现的utdid冲突!
  • AndroidStudio Build Output乱码解决
  • Android Studio中Junit单元测试使用JSON对象异常的问题
  • IntelliJ IDEA 运行项目的时候提示 Command line is too long 错误
  • permission denied for window type 2002解决方法
  • Lint found fatal errors while assembling a release target.
  • error: style attribute 'attr/colorPrimary (:attr/colorPrimary)' not found.
  • Android Error:Execution failed for task ':app:compileDebugJavaWithJavac' 解决方案
  • 关于unbindService未调用onServiceDisconnected
  • android.util.AndroidRuntimeException: requestFeature() must be called before adding content 异常处理
  • Error running app: Default Activity Not Found
  • 解决项目中使用kotlin不能直接引用xml中id
  • Could not find org.jetbrains.kotlin:kotlin-stdlib-jre7:1.3.20.
  • warn: multiple substitutions specified in non-positional format; did you mean to add the formatted="false" attribute?
  • BottomSheetXXX实现下滑关闭菜单踩坑记
  • 小米手机使用NinePatchDrawable会出现线条的问题解决
  • ClickableSpan事件和View.onClick()事件冲突
  • BitmapFactory.decodeResource为null的处理方法之一
  • FloatingActionButton图标颜色无法修改
  • 导出ANR traces 文件(解决无权限、Permission denied)
  • 解决ViewPager2嵌套ViewPager2,导致内部ViewPager滑动无效的问题
  • 解决mac下AS的git log乱码问题
  • 点9图的非内容区域也是会占用实际宽高的.
  • 全屏时导致软键盘弹起会遮挡布局内容处理
  • 使用canvas.drawRoundRect()时,解决四个圆角的线比较粗的问题
  • java.lang.NoClassDefFoundError: javax/xml/bind/JAXBException解决办法
  • TabLayout的selectTab无效
  • DialogFragment的一些设置项以及坑
  • ImageView的maxHeight和minHeight无效问题
  • Fragment使用的各种奔溃异常
  • ConstraintLayout maxWidth无效问题
  • resolveActivity返回null问题
  • 关于Context.startForegroundService() did not then call Service.startForeground()的解决办法


dialog居中问题

android 5.1.1 vivo x7手机弹出Dialog的时候,根布局必须要设置 android:layout_gravity="center" 属性,布局内容才会居中显示,我自己手机是android8.1.0的,不用设置也可以自动居中显示,坑啊…

2019/03/19


dialog适配全面屏

今天测试提了个bug,在刘海屏的手机上弹窗,在底部蒙层没有遮住下面的显示区域,同时弹窗后退到后台再回来会发现dialog样式变了连同下面的Activity的布局也变了. 解决办法如下:


 <style name="myDialog" parent="@android:style/Theme.Dialog">
     
     "android:windowFrame">@null
     "android:windowNoTitle">true
     "android:windowBackground">@color/full_transparent
     
     "android:windowIsFloating">true
     "android:windowContentOverlay">@null
     
     "android:backgroundDimEnabled">true

	  
	
     
     "android:windowTranslucentStatus">true
     
     "android:statusBarColor">@android:color/transparent
     
     "android:windowTranslucentNavigation">true
 style>

然后在自定义的dialog上使用该样式

public class TabSelectDialog extends Dialog {
  
    public TabSelectDialog(@NonNull Context context) {
        super(context,R.style.myDialog); //这里使用样式
        setContentView(R.layout.dialog_tab_select);
    }
}

还有一个问题就是,虽然布局中已经设置match_parent全屏模式,但是弹出的dialog的布局内容却不是全屏的.因此在自定义的dialog中重写onStart,设置dialog的宽高为全屏模式

@Override
protected void onStart() {
    super.onStart();
    Window window = getWindow();
    WindowManager.LayoutParams lp = window.getAttributes();
    lp.width = ViewGroup.LayoutParams.MATCH_PARENT;
    lp.height = getContext().getResources().getDisplayMetrics().heightPixels;// 用MATCH_PARENT,状态栏和导航栏会覆盖不了
    window.setAttributes(lp);
}

2019/03/22


魅族MX5 显示白色shape无效的问题

该手机必须要设置stroke属性,否则无效


<shape android:shape="rectangle" xmlns:android="http://schemas.android.com/apk/res/android">

    <solid android:color="@color/white"/>
    <corners android:radius="50dp"/>
    
    <stroke android:color="@color/white" android:width="1px"/>
shape>

2019/03/25


Android studio Connection timed out: connect

解决方案看这里

手动注释掉下面这2句
Android踩坑小记(持续更新)_第1张图片
2019/03/27


webview页面软键盘弹出不了

原因看这里

2019/04/02


webview一键登录手机QQ失败

不知道什么时候开始, QQ oauth登陆, 不再让你在网页输入账号密码了. 页面提示正在拉起QQ手机版.然后测试发现点击之后提示qq版本太低,请升级, 一看版本已经是最新的了,这显然有问题.

通过观察webview的shouldOverrideUrlLoading方法返回的url发现,一键登录触发的链接是这样的, 这是在我们的webview加载的苏宁的购物页面中点击qq登录后捕获的url
Android踩坑小记(持续更新)_第2张图片
可见url的schema并不是http或者https开头的链接地址,而是wtloginmqq ,灵机一动,我想到了通过intent来让系统帮我们跳转到QQ, 思路有了,那就干

@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
	 //优先判断qq登录协议
     if (url.startsWith("wtloginmqq://ptlogin/qlogin")) {
         Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
         startActivity(intent);
         return true;
     }
     //然后才是正常的url判断
     if (URLUtil.isNetworkUrl(url)) {
         view.loadUrl(url);
         return true;
     }
     return false;
 }

ok, 搞定.点击一键登录qq成功后会跳去系统默认的浏览器显示苏宁购物的页面操作.

2019/04/03


NestedScrollView+RecycleView滚动的问题

1.滚动不了
检查RecyclerView的高度是不是设置了match_parent,是的话,修改成wrap_content就好了

2.滚动不灵敏
RecycleView需要设置setNestedScrollingEnabled(false)

3.RecycleView抢占焦点
给RecycleView布局设置android:focusableInTouchMode=“false”

2019/04/17

dialog弹窗后导致沉浸栏(statusbar)变黑的问题

修改dialog的高度,将MATCH_PARENT修改成屏幕的真实高度即可.

@Override
protected void onStart() {
    super.onStart();
    Window window = getWindow();
    WindowManager.LayoutParams lp = window.getAttributes();
    lp.width = ViewGroup.LayoutParams.MATCH_PARENT;
    lp.height = getContext().getResources().getDisplayMetrics().heightPixels;//高度为真实高度
    window.setAttributes(lp);
}

另外,dialog想要状态栏透明,还需要设置这些style


<item name="android:windowTranslucentStatus">trueitem>

<item name="android:statusBarColor">@android:color/transparentitem>

2019/04/29


app finish 退出应用重启,application的oncreate方法没有重新执行

finish后加上这句 System.exit(0);退出虚拟机,App的进程就会被杀掉.

App退到后台,个推发送通知打开不了目标页,打开的是MainActivity的解决办法

通常情况下,是根据推送协议构建intent,然后再生成PendingIntent,最后Notification的setContentIntent来设置PendingIntent,当点击通知栏的推送通知就可以直接打开inten对应的Activity了. 但是今天测试发现,如果App退到后台时,只能打开MainActivity的神奇现象…

解决办法,创建一个空白的Activity, 启动模式设置为singleTask, 然后收到推送通知的时候,点击时先跳去该空白的Activity, 将推送协议带过去,统一在这个空白的Activity中处理协议跳转目标页,跳过去之后关闭当前的空白页即可.

代码如下:

 @Override
protected void initIntent() {
     super.initIntent();
     //获取推送协议
     String protocol = getIntent().getStringExtra("protocol");
     //根据推送协议生成对应的目标页的intent对象
     Intent target = PushHelper.getIntent(this, protocol);
 	 //启动目标Activity
     startActivity(target);
     //关闭当前空白页
     finish();
     overridePendingTransition(0, 0);
 }

2019/05/16


当RecyclerView遇到Inconsistency detected崩溃时

详情
RecyclerView的Adapter里,发生异常的错误代码如下:

public void notifyData(List<PoiItem> poiItemList) {
    if (poiItemList != null ) {
        mPoiItems.clear();
        mPoiItems.addAll(poiItemList);
        notifyItemRangeChanged(0, poiItemList.size());
    }
}

修复后,运行正常的代码如下:

public void notifyData(List<PoiItem> poiItemList) {
    if (poiItemList != null) {
        int previousSize = mPoiItems.size();
        mPoiItems.clear();
        notifyItemRangeRemoved(0, previousSize);
        mPoiItems.addAll(poiItemList);
        notifyItemRangeInserted(0, poiItemList.size());
    }
}

2019/05/25


解决部分机型的webview goBack方法返回的页面是空白页面

我这里遇到的是使用loadDataWithBaseURL方式来加载网页的情况,问题代码如下:
mWebView.loadDataWithBaseURL(url, pcResponse.getResponse(), “text/html”, “UTF-8”, null);

最后一个参数传了null ,查看源码发现他与历史记录有关 ,如果传null,返回历史页面就会看到空白’about:blank’

 /**
     * @param baseUrl the URL to use as the page's base URL. If null defaults to
     *                'about:blank'.
     * @param data a String of data in the given encoding
     * @param mimeType the MIMEType of the data, e.g. 'text/html'. If null,
     *                 defaults to 'text/html'.
     * @param encoding the encoding of the data
     * @param historyUrl the URL to use as the history entry. If null defaults
     *                   to 'about:blank'. If non-null, this must be a valid URL.
     */
    public void loadDataWithBaseURL(String baseUrl, String data,
            String mimeType, String encoding, String historyUrl) {
        checkThread();
        mProvider.loadDataWithBaseURL(baseUrl, data, mimeType, encoding, historyUrl);
    }

所以只需把最后一个参数填上url即可,例如:
mWebView.loadDataWithBaseURL(url, pcResponse.getResponse(), “text/html”, “UTF-8”, url);

2019/06/03


URLDecoder: Illegal hex characters in escape (%) pattern

解决办法

2019/06/25


NestedScrollView嵌套RecyclerView导致快速滚动列表的时候会停留在列表的顶部

方式一:
在RecycleView的外包裹一个父布局,添加这几个属性, 这种方式比较暴力,会导致EditText获取不了焦点无法点击.

<android.support.constraint.ConstraintLayout
     xmlns:android="http://schemas.android.com/apk/res/android"
     android:layout_width="match_parent"
     android:layout_height="wrap_content"
     android:descendantFocusability="blocksDescendants"
     android:focusable="true"
     android:focusableInTouchMode="true">
		

android.support.constraint.ConstraintLayout>

然后RecyclerView设置setNestedScrollingEnabled(false);

方式二:

mSearchEdt.clearFocus();//默认清空EditText的焦点
findViewById(R.id.scroll_view).setOnTouchListener(new View.OnTouchListener() {
   @Override
    public boolean onTouch(View v, MotionEvent event) {
        mSearchEdt.clearFocus(); //触摸列表的时候,清空EditText的焦点
        return false;
    }
});

2019/06/27


JSONObject的optLong()的坑

详情


URL中关于空格的编码转换成+或转换成%20的问题

使用android 提供的Uri.encode方法解决,详情

Android 9 网络适配 network-security-config & cleartextTrafficPermitted

详情


databinding中的TextView设置margin属性

报错

Cannot find the setter for attribute ‘android:layout_marginRight’ with parameter type int on android.widget.TextView.

处理方式参考


Caused by: org.apache.xerces.impl.io.MalformedByteSequenceException: Invalid byte 3 of 3-byte UTF-8

详情


Android 上出现:Type parameter T has incompatible upper bounds: ViewDataBinding 的问题

详情

Missing import expression although it is registered

详情


favicon.ico不存在导致webview#WebViewClient的onReceivedHttpError返回404状态码

参考详情

主要是重写 WebViewClient的这3个方法

	//禁用favicon.ico请求
	@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP) //5.0
	@Override
	public WebResourceResponse shouldInterceptRequest(WebView view, WebResourceRequest request) {
	    if (!request.isForMainFrame() && request.getUrl().getPath().endsWith("/favicon.ico")) {
	        try {
	            //返回一个本地的favicon.ico
	            return new WebResourceResponse("image/png", null,
	                    new BufferedInputStream(view.getContext().getAssets().open("favicon.ico")));
	        } catch (Exception e) {
	            e.printStackTrace();
	        }
	    }
	    return null;
	}
	@Override
	public WebResourceResponse shouldInterceptRequest(WebView view, String url) {
	    if (url.toLowerCase().contains("/favicon.ico")) {
	        try {
	            return new WebResourceResponse("image/png", null,
	                    new BufferedInputStream(view.getContext().getAssets().open("favicon.ico")));
	        } catch (Exception e) {
	            e.printStackTrace();
	        }
	    }
	    return null;
	}
	//Android6.0以上404或者500处理
	@TargetApi(android.os.Build.VERSION_CODES.M)
	@Override
	public void onReceivedHttpError(WebView view, WebResourceRequest request, WebResourceResponse errorResponse) {
	    super.onReceivedHttpError(view, request, errorResponse);
	    int statusCode = errorResponse.getStatusCode();
	    if (!request.isForMainFrame() && request.getUrl().getPath().endsWith("/favicon.ico") ) {
	        Log.e("cys","favicon.ico 请求错误"+errorResponse.getStatusCode()+errorResponse.getReasonPhrase());
	    }else{
	        if (404 == statusCode || 500 == statusCode) {
	            onReceivedError = true;
	            view.loadUrl("about:blank");// 避免出现默认的错误界面
	            mUEView.showError();
	        }
	    }
	}

然后在项目的asserts目录下添加一个favicon.ico文件, 若网页不存在则使用该本地的.


刘海屏如何全屏让布局延伸到状态栏底下

   

2020-7-5


androidx.preference.PreferenceScreen 去除左边空白

参考这篇文章

The style on this component requires your app theme to be Theme.MaterialComponents

 Caused by: java.lang.IllegalArgumentException: The style on this component requires your app theme to be Theme.MaterialComponents (or a descendant).
        at com.google.android.material.internal.ThemeEnforcement.checkTheme(ThemeEnforcement.java:248)
        at com.google.android.material.internal.ThemeEnforcement.checkMaterialTheme(ThemeEnforcement.java:222)
        at com.google.android.material.internal.ThemeEnforcement.checkCompatibleTheme(ThemeEnforcement.java:150)
        at com.google.android.material.internal.ThemeEnforcement.obtainStyledAttributes(ThemeEnforcement.java:81)
        at com.google.android.material.button.MaterialButton.(MaterialButton.java:200)
        at com.google.android.material.button.MaterialButton.(MaterialButton.java:191)

解决办法