Android各种小技巧(持续更新)

原创 2015年11月18日 00:14:44

  本文主要记录博主在平日工作中遇到的各种困惑,以及对应的解决方案。

ScrollView嵌套Listview时引起冲突的解决办法

  通常情况下,不建议两个或以上带滚动功能的控件嵌套使用。解决此问题的一种常用方法是手动设定ListView的高度为所有子项的总高度。

    /**
     * 重新计算ListView的高度
     */
    public void calcListViewHeight()
    {
        int totalHeight = 0;
        int desiredWidth = View.MeasureSpec.makeMeasureSpec(listview.getWidth(), View.MeasureSpec.UNSPECIFIED);
        View view = null;

        for (int i = 0; i < adapter.getCount(); i++)
        {
            view = adapter.getView(i, view, listview);
            if (i == 0)
            {
                view.setLayoutParams(new ViewGroup.LayoutParams(desiredWidth, ViewGroup.LayoutParams.WRAP_CONTENT));
            }
            view.measure(View.MeasureSpec.makeMeasureSpec(desiredWidth, View.MeasureSpec.AT_MOST), View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED));// 计算子项View 的宽高

            totalHeight += view.getMeasuredHeight(); // 统计所有子项的总高度
        }

        ViewGroup.LayoutParams params = listview.getLayoutParams();
        params.height = totalHeight+ (listview.getDividerHeight() * (listview.getCount() - 1) );
        listview.setLayoutParams(params);

        //显示定位到顶部(因为设定后,焦点会转移到listview上)
        globalLayout.setFocusable(true);
        globalLayout.setFocusableInTouchMode(true);
        globalLayout.requestFocus();
    }

这里要求ListView中的每个Item必须是LinearLayout布局,因为其他的Layout都没有重写onMeasure()方法,所以会在调用measure()时抛出异常。


在onCreate()中无法得到自适应的测量宽度和测量高度的解决办法

  使用getMeasuredWidth()和getMeasuredHeight()获取控件和布局的测量高度和测量宽度需要在它们自身调用onMeasure()之后。在Activity中的onCreate()方法进行时,是无法拿到自适应宽高控件的测量宽度和测量高度的。可通过加回调的方法获取,代码如下。

//这里当layout发生布局改变时,测量convertView的高度(这段代码源自一个ViewHolder,因此两者是同一个布局)
layout.getViewTreeObserver().addOnGlobalLayoutListener(
        new ViewTreeObserver.OnGlobalLayoutListener()
        {
            @Override
            public void onGlobalLayout()
            {
                int height = convertView.getMeasuredHeight();
                ViewGroup.LayoutParams lps = linePostfix.getLayoutParams();
                lps.height = height;
                linePostfix.setLayoutParams(lps);
            }
        });

设置光标显示时,EditText是否弹出软键盘

  在一些IM软件中,有时需要在EditText显示输入光标时,软键盘不弹出(比如在输入颜文字的情况下,打开表情布局即可)。TextView类中有一个名为setShowSoftInputOnFocus的方法,可以设置软键盘在获得焦点时是否弹出,但这个方法在API21时才开放为公有的。在API21之前,需要使用反射来调用这个函数,代码如下。

    /**
     * 设置光标显示时,Edittext是否弹出软件盘,
     */
    private void setEnableShowSoftInput(boolean enable) 
    {
        Class<EditText> cls = EditText.class;
        Method method;
        try 
        {
            method = cls.getMethod("setShowSoftInputOnFocus", boolean.class);
            method.setAccessible(true);
            method.invoke(editMsg, enable);  //editMsg为EditText控件实例
        } 
        catch (Exception e) {}
    }

在StringBuilder中使用HTML格式

  显示在TextView中的文本,如果希望不同部分显示不同的颜色或者不同的字号的话,使用Html类中的fromHtml静态方法是个不错的选择。不过对于字符串比较长的情况,我们通常会先使用StringBuilder来构建这个字符串,但是StringBuilder并不能渲染Html格式,需要使用SpannableStringBuilder这个类代替StringBuilder来构建字符串。代码如下:

TextView txt = (TextView) findViewById(R.id.txt_test);
        SpannableStringBuilder sb = new SpannableStringBuilder();
        sb.append("你今天已经吃了").append(Html.fromHtml("<font color=#000080>"+"20"+"</font>")).append("斤米饭")
            .append(",和").append(Html.fromHtml("<font color=#800000>" + "10" + "</font>")).append("斤肉")
            .append(",外加").append(Html.fromHtml("<font color=#008000>" + "15" + "</font>")).append("斤水果");
        txt.setText(sb);

  效果如下图所示:
文本测试


ScrollView嵌套自定义ViewGroup时高度为0的问题

  在使用自定义的ViewGroup时,需要在onMeasure()方法中测量ViewGroup的宽度和高度,之后需要根据测量模式返回不同的结果。通常情况下,只会针对EXACTLY(match_parent,20dp…)和AT_MOST(wrap_content)两种测量模式进行判断。然而,当ViewGroup嵌套在ScrollView中的时候,其高度(假设ScrollView是纵向滚动的)的测量模式将变为UNSPECIFIED。因此在onMeasure()方法的最后,执行setMeasuredDimension()方法时,需要对这种测量模式进行兼容,返回计算好的高度。

版权声明:本文为博主原创文章,未经博主允许不得转载。

数据库的持续集成和版本控制

数据库的持续集成和版本控制 http://database.51cto.com   2008-02-26 10:57   张海龙   InfoQ中文站 我要评论(0) 摘要:版本...
  • weizhiai12
  • weizhiai12
  • 2013年01月24日 16:27
  • 384

java 时间操作 --持续更新

1、时间戳转为日期格式 public class Time{ public static void main(String args[]){ String time="138173032...
  • smile0198
  • smile0198
  • 2013年11月14日 19:36
  • 1169

Android 适配 (持续更新)

1. 程序启动图标: LDPI (Low Density Screen,120 DPI),其图标大小为 36 x 36 px。 MDPI (Medium Density Screen, 1...
  • bat1992
  • bat1992
  • 2017年02月07日 16:00
  • 76

Android 面试题,持续更新!

四大组件----------------------------- 一、 Activity 1. 什么是Activity? 四大组件之一,一般的,一个用户交互界面对应一个 activity setCo...
  • jinhui157
  • jinhui157
  • 2017年03月12日 13:29
  • 178

Android最基础知识(持续更新)

摘录了网上一些开发者的小知识,作为开发者必须要知道: 1.防止布局被弹起的键盘挤掉 安卓开发当中经常会碰到打开键盘时,通常会把布局文件挤上去,这样的应用估计100%=卸载率,其实要解决这个问题只需要在...
  • jielundewode
  • jielundewode
  • 2015年03月10日 09:42
  • 1300

android大道理(持续更新)

1. SharedPreferences存储的数据是以XML的格式以文件的方式自动保存的,在DDMS中的File Explorer中展开到/data/data//shared_prefs下,以上面这个...
  • u012369385
  • u012369385
  • 2017年02月27日 20:30
  • 226

Android 7.0 的改动(持续更新)

今天Google提供了Android 7.0正式版的推送,那么Android 7.0到底有哪些改动和特点呢,下面我将根据自己查阅的资料做一个笔记,主要是记录对我个人来说比较有感觉的改动。 Andro...
  • y505772146
  • y505772146
  • 2016年08月25日 16:24
  • 952

Android面试总结持续更新中

Android面试总结以下是自己在面试过程中经常遇到的一些面试问题,特总结一下高频会问到的: Handler机制,这个问题问的频率是非常的高 App内存优化 App内存泄露,你常用的内存泄露检测工具,...
  • speverriver
  • speverriver
  • 2016年04月14日 10:32
  • 340

Android 学习记录(持续更新)

Android 学习记录(持续更新)
  • huyu0410
  • huyu0410
  • 2016年07月12日 16:57
  • 203

Android 开发问题解决(持续更新...)

开发app过程中所遇到的问题将在此文章中进行记录。
  • TimLoving
  • TimLoving
  • 2017年07月12日 09:53
  • 211
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Android各种小技巧(持续更新)
举报原因:
原因补充:

(最多只允许输入30个字)