android 5.1.1 vivo x7手机弹出Dialog的时候,根布局必须要设置 android:layout_gravity="center"
属性,布局内容才会居中显示,我自己手机是android8.1.0的,不用设置也可以自动居中显示,坑啊…
2019/03/19
今天测试提了个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
该手机必须要设置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
解决方案看这里
原因看这里
2019/04/02
不知道什么时候开始, QQ oauth登陆, 不再让你在网页输入账号密码了. 页面提示正在拉起QQ手机版.然后测试发现点击之后提示qq版本太低,请升级, 一看版本已经是最新的了,这显然有问题.
通过观察webview的shouldOverrideUrlLoading方法返回的url发现,一键登录触发的链接是这样的, 这是在我们的webview加载的苏宁的购物页面中点击qq登录后捕获的url
可见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
1.滚动不了
检查RecyclerView的高度是不是设置了match_parent,是的话,修改成wrap_content就好了
2.滚动不灵敏
RecycleView需要设置setNestedScrollingEnabled(false)
3.RecycleView抢占焦点
给RecycleView布局设置android:focusableInTouchMode=“false”
2019/04/17
修改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
finish后加上这句 System.exit(0);退出虚拟机,App的进程就会被杀掉.
通常情况下,是根据推送协议构建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的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
我这里遇到的是使用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
解决办法
2019/06/25
方式一:
在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
详情
使用android 提供的Uri.encode方法解决,详情
详情
报错
Cannot find the setter for attribute ‘android:layout_marginRight’ with parameter type int on android.widget.TextView.
处理方式参考
详情
详情
详情
参考详情
主要是重写 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
参考这篇文章
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)
解决办法