Android 小技巧配置记录-2

    技术2022-07-10  134

    推广: 欢迎访问我搭建的小站,今后的内容将更多的发表在我的小站之中。

    欢迎大家的访问:https://zinyan.com/

    前言

    汇种一些,配置方面小技巧。

    1.ScrollView 嵌套WebView显示

    嵌套之后,通常情况下 WebView 内容加载了,但是不显示,显示空白。或者显示灰色,就是不显示网页内容。

    首先,官方就不建议我们这样使用,但是很多时候产品非得这样处理。然后开发被逼无奈,碰见了这种嵌套模式,我们该如何处理? 下面出两个很简单的解决方法。ps-如果你的网页还要支持分页,那么更好的方法就是取消ScrollView 的嵌套了。否则效果不会很理想。

    第一种:

    WebView webView = new WebView(this); WebSettings webSettings = webView.getSettings(); webSettings.setJavaScriptEnabled(true); webSettings.setDomStorageEnabled(true); webView.setWebChromeClient(new WebChromeClient()); webView.setWebViewClient(new WebViewClient(){ @Override public boolean shouldOverrideUrlLoading(WebView view, String url) { webView.loadUrl(url); return true; } @Override public void onPageFinished(WebView view, String url) { // super.onPageFinished(view, url); //加载结束 关键点在这里, 将WebView 添加到Layout之中。 ll.addView(view); } @Override public void onPageStarted(WebView view, String url, Bitmap favicon) { super.onPageStarted(view, url, favicon); //加载过程中 } @Override public void onReceivedError(WebView view, WebResourceRequest request, WebResourceError error) { super.onReceivedError(view, request, error); //加载错误 } }); webView.getSettings().setJavaScriptEnabled(true); webView.loadUrl(url);

    webView 即使没有添加到layout之中,只要你创建成功了调用loadUrl 方法。 那么网页就会自动进行线程加载了。你要知道webView 的数据加载其实也是一种网络请求,也是在子线程之中处理的。 那么就监听网络加载状态, 网页加载完毕后,将WebView 添加到layout之中。这样是一个最简单快捷的方式了。

    第二种: 什么内容都不用配置,就是在webView 的加载上面,使用loadData 方法。 但是需要后台接口的配合。后台传递的网页数据,进行加载显示。

    webView.loadData();

    注意: 在activity界面关闭时进行回收WebView,否则会出现闪退的现象。

    @Override protected void onDestroy() { webView.destroy(); webView=null; super.onDestroy(); }

    2.搜索结果标红或者标其他颜色

    public static void setSpecifiedText(TextView textView, String keyStr) { //检查文本框 或者关键字是否空 String message= textView.getText().toString(); if(message.length()<=0 || StringUtil.isEmpty(specifiedText)){ return; } String[] keyword = new String[]{keyStr}; SpannableStringBuilder spannable = new SpannableStringBuilder(message); CharacterStyle span; String wordReg; for (int i = 0; i < keyword.length; i++) { String key = ""; if (keyword[i].contains("*") || keyword[i].contains("(") || keyword[i].contains(")")) { char[] chars = keyword[i].toCharArray(); for (int k = 0; k < chars.length; k++) { if (chars[k] == '*' || chars[k] == '(' || chars[k] == ')') { key = key + "\\" + String.valueOf(chars[k]); } else { key = key + String.valueOf(chars[k]); } } keyword[i] = key; } wordReg = "(?i)" + keyword[i]; Pattern pattern = Pattern.compile(wordReg); Matcher matcher = pattern.matcher(message); while (matcher.find()) { span = new ForegroundColorSpan(Color.RED); //默认采用红色,如果觉得颜色不对可以自己设置 spannable.setSpan(span, matcher.start(), matcher.end(), Spannable.SPAN_MARK_MARK); } } textView.setText(spannable); }

    3.关键字替换为图片

    有时候需要在文字前面添加上图片。下面的功能就很有效果了。

    public static SpannableString getImageSpanStr(String string, int resid, Context context) { SpannableString spannableString = new SpannableString("图标 " + string); CenteredImageSpan imageSpan = new CenteredImageSpan(context,resid); spannableString.setSpan(imageSpan, 0, 2, Spanned.SPAN_INCLUSIVE_EXCLUSIVE); return spannableString; }

    4.计算TextView 可以显示的内容行数

    在adapter 中实现TextView 显示文字过多实进行折叠显示,过少时不进行折叠显示。

    int MAX_LINES=4; private int MaxWords =0; public boolean isTextMacLine(String text) { if(StringUtil.isEmpty(text)) return false; int lines=0; if(MaxWords==0) { //计算一遍之后,就不用再计算每行可以显示多大字体了。 int txtWidth = BaseUtil.spToPx(context, 14);// 将字体SP单位转为px单位 得到一个字符的显示宽度 int viewWidth = BaseUtil.getWidthPixels((Activity) context) - BaseUtil.dpToPx(context, 45);//得到View 要显示的区域宽度 。 我的界面之中TextView 显示额宽度就是屏幕宽度,并且左右间距45dp 所以我直接这么计算了 MaxWords = viewWidth/txtWidth; //得到一行最大显示多少个字符。 } int strLength = text.length(); if(text.contains("\n")){ //如果有换行的话 String strs[] = text.split("\n"); int strLines; for (int i=0;i<strs.length;i++){ strLines =strs[i].length() / MaxWords; if(strs[i].length() % MaxWords > 0){ strLines++; } lines += strLines; } }else { lines = strLength / MaxWords; //如果没有换行 } if (lines > MAX_LINES) { return true; } else if (lines == MAX_LINES) { if (strLength % MaxWords > 0) { return true; } } return false; } //这个方法设置得到了一行能够显示多大。 //然后配合Adapter 可以自动决定是否显示 收起和展开 功能按钮。 if(isTextMacLine(content.getText().toString())){ tv_show_more.setVisibility(View.VISIBLE); }else{ tv_show_more.setVisibility(View.INVISIBLE); } if (tv_show_more.getVisibility() == View.VISIBLE) { if (item.isShow()) { content.setEllipsize(null);//不进行省略显示 content.setSingleLine(false);//支持多行 tv_show_more.setText("收起"); tv_show_more.setCompoundDrawablesRelativeWithIntrinsicBounds(0, 0, R.drawable.up, 0); } else { //isshow=false; content.setEllipsize(TextUtils.TruncateAt.END); content.setLines(MAX_LINES); tv_show_more.setText("展开"); tv_show_more.setCompoundDrawablesRelativeWithIntrinsicBounds(0, 0, R.drawable.down, 0); } }

    ps 上面的方法只是由于在Adapter中已经存在了,不想自定义TextView 进行处理的一种快捷方式,如果时间够的话。建议还是直接自定义View 。然后再View 内部进行判断计算高度,然后决定显示逻辑。这样可靠性和维护性更好。

    Processed: 0.010, SQL: 9