• Android 偶遇小问题解决方案集合


    1、Android 如何让EditText不自动获取焦点

     

    解决方案:找一个EditText的父级控件把EditText默认的行为截断了!设置

    android:focusable="true"
    android:focusableInTouchMode="true">

    示例:

    <LinearLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:focusable="true"
    android:focusableInTouchMode="true">

    <EditText
    android:layout_width="match_parent"
    android:layout_height="wrap_content"/>
    </LinearLayout>
     

    2、程序运行在后台最小化

    主要调用moveTaskToBack(true)方法,简单的来说类似于点击home键,具体理解请移步http://www.cnblogs.com/yishujun/p/5394518.html

    (1)此种方式通过Home键效果强行影响到Back键对Activity生命周期的影响

    @Override
    public void onBackPressed() {
        Intent home = new Intent(Intent.ACTION_MAIN);
        home.addCategory(Intent.CATEGORY_HOME);
        startActivity(home);
    }

    (2)Android的moveTasktoBack()就是说让进程activity栈在后台去运行,类似最小化。可以使用这个方法,不让我们的应用退出。

    @Override

    public void finish() {

    //super.finish(); //记住不要执行此句

    moveTaskToBack(true); //设置该activity永不过期,即不执行onDestroy()

    (3)按返回键的时候不希望退出(默认就finish了),而是只希望置后台,就可以调这个方法

    @Override

    public boolean onKeyDown(int keyCode, KeyEvent event) {

    if(keyCode == KeyEvent.KEYCODE_BACK){

    moveTaskToBack(true);

    return true;

    }

    return super.onKeyDown(keyCode, event);

    }

    (4)TabActivity中,要复写Tab中的onfinish方法:
    public void finish()
    {
    this.moveTaskToBack(true);
    }

    3、从eclipse转到Android Studio后,Button的文本中,英文字母全部显示为大写,不管text中写的是大写还是小写

    解决方案:在Button的属性里加上android:textAllCaps="false"就行了

     

    4、 Android根据字符串型的资源名获取对应资源id

    解决方案:

    方法一:

    利用getResources().getIdentifier(String name,String defType,String defPackage) 获取

    public int  getResource(String imageName){
         Context ctx=getBaseContext();
         int resId = getResources().getIdentifier(imageName, "mipmap", ctx.getPackageName());
         //如果没有在"mipmap"下找到imageName,将会返回0
         return resId;
    }
    方法二:

    使用反射机制获取

    public int  getResource(String imageName){
        Class mipmap = R.mipmap.class;
        try {
            Field field = mipmap.getField(imageName);
            int resId = field.getInt(imageName);
            return resId;
        } catch (NoSuchFieldException e) {//如果没有在"mipmap"下找到imageName,将会返回0
            return 0;
        } catch (IllegalAccessException e) {
            return 0;
        }
    
    }
    

    PS:根据资源id获取资源名称:

    String resName = getResources().getResourceName(resId);

    5、getDrawable过时的替代方法

    mDrawable = getResources().getDrawable(resourcesId); 方法过期
     
    解决方案:
     
    方法一:public Drawable getDrawable(int id, @Nullable Theme theme) 
     
    方法二: mDrawable = ContextCompat.getDrawable(this,resourcesId); 
     

    6、获取版本号

    解决方案:Build.VERSION.SDK_INT 

    7、字节大小相互转换

    解决方案:

    1 byte = 8 bit

    1 KB = 1024 bytes

    1 MB = 1024 KB

    1 GB = 1024 MB

    1 TB = 1024 GB

    位:“位(bit)”是电子计算机中最小的数据单位。每一位的状态只能是0或1。
      字节:8个二进制位构成1个“字节(Byte)”,它是存储空间的基本计量单位。1个字节可以储存1个英文字母或者半个汉字,换句话说,1个汉字占据2个字节的存储空间。
      字:“字”由若干个字节构成,字的位数叫做字长,不同档次的机器有不同的字长。例如一台8位机,它的1个字就等于1个字节,字长为8位。如果是一台16位机,那么,它的1个字就由2个字节构成,字长为16位。字是计算机进行数据处理和运算的单位。
      KB:在一般的计量单位中,通常K表示1000。例如:1公里= 1000米,经常被写为1km;1公斤=1000克,写为1kg。同样K在二进制中也有类似的含义。只是这时K表示1024,也就是2的10次 方。1KB表示1K个Byte,也就是1024个字节。
      MB:计量单位中的M(兆)是10的6次方,见到M自然想起要在该数值的后边续上六个0,即扩大一百万倍。在二进制中,MB也表示到了百万级的数量级,但1MB不正好等于1000000字节,而是1048576字节,即 1MB = 2E+20 Bytes = 1048576Bytes。

    public static String convertFileSize(long size) {
    long kb = 1024;
    long mb = kb * 1024;
    long gb = mb * 1024;
    if (size >= gb) {
    return String.format("%.1f GB", (float) size / gb);
    } else if (size >= mb) {
    float f = (float) size / mb;
    return String.format(f > 100 ? "%.0f MB" : "%.1f MB", f);
    } else if (size >= kb) {
    float f = (float) size / kb;
    return String.format(f > 100 ? "%.0f KB" : "%.1f KB", f);
    } else
    return String.format("%d B", size);
    }

    8、Android TextView 中间省略

    解决方案:设置 android:ellipsize

    android:ellipsize属性的具体值介绍如下:
    android:ellipsize = "end"   省略号在结尾
    android:ellipsize = "start"   省略号在开头
    android:ellipsize = "middle"     省略号在中间
    android:ellipsize = "marquee"  跑马灯
    添加了android:ellipsize这个属性后,最好还是添加上:
    android:singleline = "true"

    9、Listview item 包含CheckBox、CheckBox、Button等点击该项无效

    简而言之,这是一个View的焦点抢占问题。由于里面有Item里面包含了一个CheckBox(类似情况还包括Button、ImageButton等本身带有click等事件的View)

    我们要做的,就是处理好Adapter里面布局的XML根布局的descendantFocusability属性,该属性是当一个为view获取焦点时,定义viewGroup和其子控件两者之间的关系。

    android:descendantFocusability
    Defines the relationship between the ViewGroup and its descendants when looking for a View to take focus.
    Must be one of the following constant values:
    beforeDescendants:viewgroup会优先其子类控件而获取到焦点
    afterDescendants:viewgroup只有当其子类控件不需要获取焦点时才获取焦点
    blocksDescendants:viewgroup会覆盖子类控件而直接获得焦点

    一般来说我们使用第三种 blockDescendants,简单的解决办法就是在自定义item的布局中的根布局中指定 android:descendantFocusability="blocksDescendants"

     

    
    
  • 相关阅读:
    转专业不设门槛 浙江工商职院把选择权交给学生
    软件开发方法:
    抽签系统
    软件生命周期。
    软件测试的意义!
    课程不明白的问题?
    目前流行的源程序版本管理软件和项目管理软件有哪些,各有什么缺点?
    自我介绍
    结对编程的利与弊
    第三周目标随笔
  • 原文地址:https://www.cnblogs.com/yishujun/p/5392608.html
Copyright © 2020-2023  润新知