Android初级躲不开的那些坑

Android初级躲不开的那些坑

Android_Note

这里是做者(OCN.Yang)在Android初级阶段遇到的那些坑坑洼洼,有些仍是开发中要知道的小技巧。相信大多数初学者不免也会遇到相同的坑,你们大概看看有者避之,还没遇到的就躲之。大牛和已经进阶的朋友能够绕道(相信大家很忙的)。java

这篇博客首发在个人我的博客网站 www.ocnyang.comandroid

原文地址git

一、Ctrl + O快捷键

查看代码的大纲 即类的方法列表。正则表达式

二、layout_weight

  • android:layout_weight的真实含义是:
    一旦View设置了该属性(假设有效的状况下),那么该 View的宽度等于原有宽度(android:layout_width)加上剩余空间的占比!
  • 若是width设置了match_parent ,那么,加上的是负的长度(至关于减去一部分长度)
  • 若是width设置了warp_content ,那么,剩余空间是“父容器总长度”减去“组件的内容占的长度”,而后再按比重值分。

三、Background=”@null”

能够给背景设置一个null值,在必定状况下这样作是有必要的。apache

四、判断String是否为空

TextUtils.isEmpty(String str) 
复制代码

五、Int/int 仍是等于整型,太容易出错了。

六、LinearLayout中的orientation & gravity

当LinearLayout布局中设置**orientation="vertical"**属性:数组

  • 若是子组件设置**layout_gravity="center_vertical"**是无效的;
  • 若是LinearLayout中设置**gravity="center_vertical"**是能够起到做用将子组件垂直居中的。水平布局同理

七、单实例模式的Activity

设置为单实例模式(singleInstance)的Activity,会单独开一个任务栈单独存放这个activity,这个任务栈只会在程序退出后消除。缓存

八、选择手机中的图片并显示在ImageView上

Intent intent = new Intent();  
/* 开启Pictures画面Type设定为image */  
intent.setType("image/*");  
/* 使用Intent.ACTION_GET_CONTENT这个Action */  
intent.setAction(Intent.ACTION_GET_CONTENT);   
/* 取得相片后返回本画面 */  
startActivityForResult(intent, 1);  
            
  
@Override  
protected void onActivityResult(int requestCode, int resultCode, Intent data) {  
    if (resultCode == RESULT_OK) {  
        Uri uri = data.getData();  
        ContentResolver cr = this.getContentResolver();  
        try {  
            Bitmap bitmap = BitmapFactory.decodeStream(cr.openInputStream(uri));  
            ImageView imageView = (ImageView) findViewById(R.id.iv01);  
            /* 将Bitmap设定到ImageView */  
            imageView.setImageBitmap(bitmap);  
        } catch (FileNotFoundException e) {  
            Log.e("Exception", e.getMessage(),e);  
        }  
    }  
    super.onActivityResult(requestCode, resultCode, data);  
} 
复制代码

九、notifyDataSetChanged() 刷新Adaper.

十、ListView 的优化

主要方法:网络

  1. ListView设置固定高度,
  2. convertView判空,
  3. SetTag:convertView.setTag(viewHolder),
  4. 内部类ViewHolder,
  5. 分页加载

十一、R文件编译报错 & 找不到ID报错

R文件的编译原理:当资源文件或id命名中其中一个文件的命名不知足规范时,R文件总体就不会再编译。app

十二、列表里的CheckBox

注意: Spinner:若是item中有可以得到焦点的控件(例如CheckBox),则在item得到点击事件以后会继续传递给可以得到焦点的控件.
想让item在被点击后Spinner收回去,须要在布局(例如LinearLayout)中加上属性后代是否能够得到焦点:

android:descendantFocusability="blocksDescendants"//阻止后代得到焦点  
复制代码

1三、获取xml资源文件中定义的数组

getResources().getStringArray(R.array.city)  
复制代码

1四、安卓默认字体大小:

1五、java 字符串split有不少坑

Java代码ide

System.out.println(":ab:cd:ef::".split(":").length);//末尾分隔符所有忽略    
System.out.println(":ab:cd:ef::".split(":",-1).length);//不忽略任何一个分隔符    
System.out.println(StringUtils.split(":ab:cd:ef::",":").length);//最前面的和末尾的分隔符所有都忽略,apache commons    
System.out.println(StringUtils.splitPreserveAllTokens(":ab:cd:ef::",":").length);//不忽略任何一个分隔符 apache commons     
输出:    
4    
6    
3    
6    
复制代码

看了下jdk里String类的**public String[] split(String regex,int limit)**方法,感受平时不太会用这方法,觉得在用正则表达式来拆分时候,若是匹配到的字符是最后一个字符时,会拆分出两个空字符串,
例如"o"split("o",5) or "o"split("o",-2)时候 结果是"" "" 也就是下图中红框里的内容,因此平时通常都用split(String regex) 方法,其实也就等同于split(String regex,0)方法,把结尾的空字符串丢弃!

1六、Android Studio 的全局变量和强转的快捷键

  • Findviewbyid(R.id.XXX).cast(强转转换) 强转后点击回车回到行尾
  • .field 全局变量
  • .var 局部变量

1七、TextView添加滚动条

1八、数组适配器

////xListView上滑刷新,下滑加载更多///swapListView侧滑删除/

1九、Viewstub

只能inflatay一次。否则会报错。

20、补间动画的旋转的圆心计算方法

以图片的左上角为坐标(0,0),分别计算出pivotX和pivotY的数值:50%是图片自己大小的一半,50%p是父窗体宽高的一半长度。而后在图片的左上角的基础上加上这两个数组

位移也是一样的计算方式

2一、插件

ButterKnife Gosn android.selector.generat

2二、margin & padding

android 中的控件的margin 和 padding 都是不会影响控件的设置宽高。(这点和网页设计是不同的)

2三、R文件出错。

当布局或id报找不到的错时,可能就是R文件出错。

  • 一种多是你导入了命名不规范的资源文件,致使R文件不能自动编译了。
  • 一种多是你导入了import android.R系统的R文件致使报错

2四、ListView的多类型item

自定义ListView中,若是item采用多种类型的布局。那么在getItemType中的下标必定要从0开始。否则会报下标越界异常。

2五、java怎么在一个字符串里截取一个正则表达式字段

public static void main(String[] args) {
    String str = "<div><h3 ..>dsijiswer*dfhjgf</h3></div><table><h3>sdsd</h3></table>";
    Pattern p = Pattern.compile("<h3.*?/h3>");
    Matcher m = p.matcher(str);
    while (m.find()) {
        System.out.println(m.group());
    }
}
复制代码

2六、事件机制:分发 消费 电梯机制:向上分发 ,向下消费

2七、LinearLayout内部子控件之间的间隔 设置为等同的

在drawer文件夹下建立一个shape的图形文件

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="rectangle" >
    <size android:width="15dp" />
    <solid android:color="@android:color/transparent" />
</shape>  
复制代码

在linearLayout里设置属性divider为上图形,同时设置showdivider属性

2八、TextView 上设置的图片 设置图片大小的方法:

txtZQD = (TextView) findViewById(R.id.txtZQD);  
Drawable[] drawable = txtZQD.getCompoundDrawables();  //获取它先后左右的图片
// 数组下表0~3,依次是:左上右下  
drawable[1].setBounds(100, 0, 200, 200);  
txtZQD.setCompoundDrawables(drawable[0], drawable[1], drawable[2],drawable[3]);  
复制代码

2九、android中内部存储和外部存储的理解和路径获取

30、自定义组合控件

在加载布局的时候要用 View.inflate(context,R.layout.img_share,this);
或者 LayoutInflater.from(context).inflate(R.layout.img_share,this);
不能用 LayoutInflater.from(context).inflate(R.layout.img_share,null);这样加载不上。

3一、foreground 前景色生效

3二、添加第三方依赖报错

配置错误缘由:一、导包有误。二、少导包。三、重复导包。

3三、布局里的ListView|GridView抢占焦点

Scrollview里嵌套Gridview,Gridview抢焦点问题(显示布局的时候总是先从Gridview的第一个item显示)

解决方法:在获取inflate view以后,代码给GridView.setFocusable(false)就能够了

这里的listview的item里嵌套了横向滑动的scrollview的gridview,

一样的问题,一样的解决方案:在listview的adapter中在加载完item以后对gridview设置setFocusable(false)。 这里须要注意的是,是在抢焦点的列表的父容器创建以后就对列表设置取消焦点。

例如:
在ListView中嵌套GridView中:

convertView = LayoutInflater.from(mContext).inflate(R.layout.item_listview_home, null);
viewHolder = new ViewHolder(convertView);
viewHolder.mGridIilh.setFocusable(false);  
复制代码

在fragment布局中存在列表抢占焦点:

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.fragment_cheapsale, null);
    ButterKnife.inject(this, view);
    mGridFragmentCheapsale.setFocusable(false);  
复制代码

在Activity布局中存在列表抢占焦点:

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_sale);
    ButterKnife.inject(this);
    mListviewHome.setFocusable(false);
复制代码

3四、列表抢占焦点问题

在gridview和listview初始化数据时自动调用或者咱们显示调用notifyDataSetChanged的时候第一个item会被选中并会抢焦点。
android4.4在调用notifyDataSetChanged的时候注释掉了判断touchmode的代码,致使一调用notifyDataSetChanged就模拟用户点击了gridview。
咱们继承gridview或者listview重写里面的isInTouchMode方法:

[java] view plaincopy
/** 
 * 屏蔽android4.4 setAdapter时View抢焦点的BUG 
 */  
@Override  
public boolean isInTouchMode() {  
    if(19 == Build.VERSION.SDK_INT){  
        return !(hasFocus() && !super.isInTouchMode());  
    }else{  
        return super.isInTouchMode();  
复制代码

3五、去除Listview滚动背景变黑,item点击默认背景

listview默认背景和系统窗口同样是透明的,若是给listview加上背景图片,或者背景颜色时,滚动时listview会黑掉,由于滚动时,列表里面的view重绘用的依旧是系统默认的透明色,颜色值为#FF191919
解决办法:

  • 调用listview的setCacheColorHint(0),颜色值设置为0
  • 设置xml文件中listView的属性
    Android:cacheColorHint="#00000000",滚动时,重绘View的时候就不会有背景颜色。
    android:listSelector="#00000000" 进行上面的设置以后,ListView点击item时就没有任何现象了

36. 开启Android系统程序设置页面

Intent intent = new Intent();
intent.setClassName("com.android.settings","com.android.settings.ManageApplications");
intent.setAction("android.intent.action.MAIN");
try {
    startActivity(intent);
} catch (Exception e) {
    e.printStackTrace();
}  
复制代码

3七、禁止EditText自动获取布局焦点

解决之道:在EditText的父级控件中找一个,设置成

android:focusable="true"  
android:focusableInTouchMode="true"  
复制代码

这样,就把EditText默认的行为截断了!

3八、RadioButton设置默认选中

若是RadioGroup中设置默认选中一个RadioButton后,在选择时会选中两个的问题
解决方法:
不须要设置RadioButton的默认选中, 这样会使RadioButton一直处于选中状态.
咱们应该给RadioGroup设置选中的RadioButton,
也就是说把radioButton.setCheck(true);
更改成radioGroup.check(radioButton.getId());

3九、实现ImageView宽度填满屏幕,高度自适应

一、自定义ImageView重写View的onMeasure方法

public class ResizableImageView extends ImageView {  
  
    public ResizableImageView(Context context) {  
        super(context);  
    }  
  
    public ResizableImageView(Context context, AttributeSet attrs) {  
        super(context, attrs);  
    }  
  
    @Override  
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec){  
        Drawable d = getDrawable();  
  
        if(d!=null){  
            // ceil not round - avoid thin vertical gaps along the left/right edges  
            int width = MeasureSpec.getSize(widthMeasureSpec);  
            //高度根据使得图片的宽度充满屏幕计算而得  
            int height = (int) Math.ceil((float) width * (float) d.getIntrinsicHeight() / (float) d.getIntrinsicWidth());  
            setMeasuredDimension(width, height);  
        }else{  
            super.onMeasure(widthMeasureSpec, heightMeasureSpec);  
        }  
    }  
  
}  
复制代码

二、设置ImageView的属性

//宽度填满屏幕
android:layout_width=”match_parent”
android:scaleType=”fitXY”
android:layout_height=”wrap_content”
//保持比例,必定要设置
android:adjustViewBounds=”true”
复制代码

40、Glide加载网络图片填充到39中的ImageView中

由于Glide加载图片的规则是根据imageview的大小调整图片。可是ImageView的大小为ImageView宽度填满屏幕,高度自适应的时候,Glide加载的图片就会显示不出来,为此咱们选择了一种迂回的方式加载:先请求图片为bitmap,这个时候图片就有必定的尺寸了,再设置到ImageView中就能够自适应了:

Glide.with(GraphicDetailsFragment.this)
                    .load((new StringBuffer(Const.URL_HEAD).append(mStringList.get(position))).toString())
                    .asBitmap()
                    .into(new SimpleTarget<Bitmap>() {
                        @Override
                        public void onResourceReady(Bitmap resource, GlideAnimation<? super Bitmap> glideAnimation) {
                            viewHolder.mImageView.setImageBitmap(resource);
                        }
                    });
复制代码

4一、Android GridView组件如何去除四周的空隙

设置GridView的android:listSelector属性 android:listSelector="@null" 设置后四周空隙就消除了

4二、主题文件设置的颜色


4三、ListView设置item的行间距,以及去掉分割线

1.设置item的行间距:
能够在xml布局文件中的listView下设置xml属性:
android:divider="#00000000"
android:dividerHeight="18dp"

解释:分隔线透明,高度为18dp。

2.去掉item之间的分割线:
每一个item之间都有分割线,若是单纯想去掉分割线,方法仍是不少的:

  • 法1:设置android:divider="@null"
  • 法2:android:divider="#00000000"
  • 法3:setDividerHeight(0);高度设为0 || ListView.setDivider(null);
  • 法4:android:divider="@drawable/listview_horizon_line"

3.隐藏头部分隔线
listview分割线会在头部、数据item、及根部的底部打印,若是要取消头部分割线必须 先设置其方法

addHeaderView(headView, null, true);
addFooterView(footView, null, true);  
复制代码

注意:第三个参数必须为true,不然无效

//显示头部出现分割线
listview.setHeaderDividersEnabled(true);
//禁止底部出现分割线 
listview.setFooterDividersEnabled(false);  
复制代码

4四、Error:Failed to create directory

今天android stutio出现
Error:Failed to create directory'C:\Users\Administrator\.gradle\caches\2.8\scripts\ijinit7_5jx13p26aqkoramvuhfn0lqca\init\classes'
这个问题,解决的办法是:
File 下面有个 Invalidate Caches/Restart ,弹出一个框,点击 Invalidate and Restart 按钮,等待重启就OK了。

4五、TextView追加字符串

TextView.append(CharSequence text);//在现有字符串的基础上向字符串缓存区追加字符串;(本身想法:可能会在刷新页面的时候形成屡次重复追加,因此不提倡使用)  
复制代码

4六、Fragment嵌套Fragment要用getChildFragmentManger();

疑问:两个嵌套,fragment给第二个Fragment经过setArguments(bundle)传值,传递不过去。

4七、隐藏ListView滚动条

setScrollbarFadingEnabled(true);
//不活动的时候隐藏,活动的时候显示

setVerticalScrollBarEnabled(true);
//不活动的时候隐藏,活动的时候也隐藏
复制代码

android: scrollbars="none"与 setVerticalScrollBarEnabled(true); 效果同样。

4八、解决滑动冲突带来的问题

重写ListView的onMeasure的方法来解决滑动冲突的应用中,ListView是不能设置divider和高度的,若是设置了,最后一个item显示不全,这是由于onMeasure在根据条目设置ListView的高度时并无把divider的高度设置进去。

4九、导入第三方库的错误

Error:Cannot change dependencies of configuration ':app:_debugAnnotationProcessor' after it has been resolved.

当导入一个第三方库的时候报的错误。是由于这个库依赖的某些库版本太高而你的Android studio没有下载这个库。

50、ScrollView的高度

ScrollView中没有match_parent这么一说,至关于它内部的控件高度是没有参考物的。match_parent的失效,它会表现成为wrap_content。

5一、Java思惟导图

Java思惟导图

5二、Rxjava思惟导图

Rxjava思惟导图

5三、MVP结构图

MVP简单结构图

5五、onPrepareOptionsMenu 和onCreateOptionsMenu 的区别

在android中建立菜单menu时须要重写Activity的onCreateOptionsMenu(Menumenu)方法,这个方法只在第一次建立的时候调用一次,因此若是以后想对menu进行动态的修改,那么就不能再对onCreateOptionsMenu作什么手脚,就要用到onPrepareOptionsMenu(Menumenu)方法了。

onPrepareOptionsMenu与onCreateOptionsMenu不一样的是,他在每次按下menu硬键以前会被调用,因此能够在这里动态的改变menu。

注意:在onPrepareOptionsMenu(Menumenu)函数中,首先须要调用:

super.onPrepareOptionsMenu(menu);
menu.clear();
复制代码

若是没有clear而直接add的话,那么菜单中菜单项是会“追加”的,这样随着你不停的点menu键,菜单项就不停的增长。

另外,android系统默认的菜单样式是支持最多3个一行,若是有4项就每行2个有2行...若是想自定义样式,可使用xml文件定义样式。

5六、android:parentActivityName

一个Activity在manifet里声明了Android:parentActivityName;这时候经过Activity左上角的返回按钮点击返回,启动声明的父Activity,而且总会先调用父Activity的OnDestroy方法,点击子Activity的左上角返回按钮的时候,调用逻辑以下:

MainActivity.onDestroy();
MainActivity.onCreate(null);
MainActivity.onStart();
复制代码

解决方案是: 为设置MainActivity属性android:launchMode=singleTop (这个大概的意思是,消除先调用Destroy方法的解决方案)

顺便脑补android:parentActivityName的做用,就是为了左上角给子Activity加一个返回按钮,具体信息以下:

Android 4.1 提升性能、加强用户体验
  App 栈导航:经过设置 android:parentActivityName 改变回退栈的内容,若是栈中没有 parentActivity,则合成栈,经过 onPrepareNavigateUpTaskStack() 改变 parentActivity 中的内容。

5七、条件编译

条件编译(C里面的概念)是个好东西,可是在java体系中却没有这样的预约义。可是咱们能够根据java编译时对代码的优化机制实现条件编译。
java在编译中有这样一条原则:“编译器会对代码进行优化,对于条件永远为false的语句,JAVA编译器将不会对其生成字节码。”
这样一来,咱们只须要在Const(静态变量类)中定义一个isDebug的布尔变量,而后对想要进行条件编译的代码用

if(isDebug){
    ...代码语句...
}  
复制代码

包含起来。这样你能够经过控制isDebug的值实现条件编译。当isDebug为false时,if条件内的...代码语句...会被编译器忽略,也就是不会生成对应的字节码。

5八、动态设置ImageView的图片路径

//实现的原理是 java的反射?
int resId = (Integer) R.drawable.class.getField("icon").get(null);  
holder.img.setImageResource(resId);    
复制代码

须要明白的一点就是 每一张图片的name 都是 R.drawable的一个字段

5九、颜色列表的静态保存

在Values下建立数组文件:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <!--适合白色字体的彩虹色-->
    <integer-array name="itemcolor">
        <item>0xFF79429D</item>
        <item>0xFF5691F5</item>
        <item>0xFF76BA55</item>
        <item>0xFFB3E0E0</item>
        <item>0xFF27C9C2</item>
        <item>0xFF92AD6B</item>
        <item>0xFFEC4F4F</item>
        <item>0xFFEE6593</item>
        <item>0xFFFFAC5A</item>
        <item>0xFF6296AF</item>
        <item>0xFFBF8A28</item>
        <item>0xFF319388</item>
    </integer-array>
</resources>
复制代码

这里须要注意的是颜色的数值必须是8位,即前两位的透明位不能省略。 而后就能够获取

Resources resources = context.getResources();
mColorArray = resources.getIntArray(R.array.itemcolor);
...
setBackgroundColor(R.id...., mColorArray[Position % mColorArry.length]);
复制代码

60、ScrollView 显示不全

有时候 ScrollView 嵌套 LinearLayout 时会有显示不全的状况,这个时候应该看看 ScrollView 的父布局是否是用的 CoordinatorLayout。
当外部用 CoordinatorLayout 时,内部应该用 NestedScrollView ,否则会产生不肯定的 bug。
一样在 CoordinatorLayout 内部使用 ViewPager & TabLayout 来显示不一样的 Fragment 时,若是 Fragment 内使用 ScrollView 也会有显示不全的状况。

6一、神奇的 * / 运算优先级

double sin20 = Math.sin(Math.PI * 20 / 180); //0.3420201433256687 double sin201 = Math.sin(20 / 180 * Math.PI); //0.0

找到缘由了,当先计算20/180的时候是按int类型运算的,获得的结果是0。因此最后结果为0.

6二、Alertdialog对话框,设置点击其余位置不消失

Android4.0 以上 AlertDialog 在触摸对话框边缘外部,对话框消失
能够设置这么一条属性,固然必须先AlertDialog.Builder.create()以后才能调用这两个方法
方法一:
setCanceledOnTouchOutside(false); 调用这个方法时,按对话框之外的地方不起做用。按返回键还起做用
方法二:
setCancelable(false); 调用这个方法时,按对话框之外的地方不起做用。按返回键也不起做用

6三、关于 Vector 你须要注意的事情

当你的项目中用到用 Vector 图形时,请注意事项能够参考www.jianshu.com/p/e3614e7ab…
另外值得注意的是

//mDrawableActive = ContextCompat.getDrawable(context, R.drawable.vec_checkbox_fill_circle_outline);
//mDrawable = ContextCompat.getDrawable(context, R.drawable.vec_checkbox_blank_circle_outline);

//解决 vector “资源未找到” 错误,能够考虑用一下方法代替
try {
    mDrawableActive = AppCompatDrawableManager.get()
            .getDrawable(context, R.drawable.vec_checkbox_fill_circle_outline);
    mDrawable = AppCompatDrawableManager.get()
            .getDrawable(context, R.drawable.vec_checkbox_blank_circle_outline);
} catch (Resources.NotFoundException notFoundException) {
    Logger.e(notFoundException.getMessage());
} catch (Exception e) {
    Logger.e(e.getMessage());
} finally {
    mDrawableActive = context.getResources().getDrawable(R.drawable.vec_checkbox_fill_circle);
    mDrawable = context.getResources().getDrawable(R.drawable.vec_checkbox_empty_circle);
}  
复制代码

同时须要注意的是:使用Vector时好像不能关闭硬件加速:

android:hardwareAccelerated="false"//不要在配置文件中使用这个设置
复制代码

6四、OOM 内存溢出

当你在测试应用时,若是在部分机型上运行正常,而在部分机型上出现 OOM ,除了对应用再次作各类优化外,你能够在配置文件中加上:

<application
    ...
    android:largeHeap="true"
    ...
    />
复制代码

说不定就行了呢。

6五、Toolbar 左侧有空白(内边距)

引发缘由:
在V7包下,Wiget.AppCompat.Toolbar的parent中,contentInsetStart(默认的有值)这个属性就是引发自定义ActionBar不能彻底填充的缘由。

<style name="ClubToolbar" parent="Widget.AppCompat.Toolbar">  
        <item name="contentInsetStart">0dp</item><!-- 设置该属性解决空白部分-->  
</style>  
复制代码

而后在AppStyle中(必定在这,单独在Toolbar的style中设置不起做用)重写Toolbar的属性:

<item name="toolbarStyle">@style/ClubToolbar</item>  
复制代码

6六、DrawerLayout 的使用小点

DrawerLayout.setDrawerListener(new ActionBarDrawerToggle);//有动画效果的菜单图标 DrawerLayout.setScrimColor(Color.TRANSPARENT) //去除侧滑时的阴影遮罩效果

在必定版本中的NavigationView的都是有半透明效果的
若是不须要能够经过设置下面属性去除:

app:insetForeground="@android:color/transparent"
复制代码

同时若是想要Nav在使用中没有背景全透明直接设置背景为#00000000;同时去除 headerLayout 的背景便可。

6七、TextView 一个原生的Bug

使用 SDK:15~25 测试版本:Android 6.0;Android 4.3(在这两个版本上都存在,中间版本必定也存在)

<!--这里只给父布局 LinearLayout 设置的点击事件,其余控件没有设置任何监听事件-->
<LinearLayout
    android:id="@+id/linearlayout"
    android:layout_width="match_parent"
    android:layout_height="35dp"
    android:orientation="horizontal">

    <TextView
        android:id="@+id/time"
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:text="Time"/>

    <TextView
        android:id="@+id/time_value"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:inputType="date"/>
</LinearLayout>
复制代码

一次无心中发现的。若是给 TextView 设置一个 inputType 属性,按理说,inputType 应该是不起做用的,可是这里将会存在一个神奇的事情(不知道算不算一个原生bug):

  1. 若是此时你给父布局(如上面的 @id/linearlayout)设置点击事件,当你在 @id/time_value 区域点击的话,不会有任何反应,点击在其余区域好比 @id/time 正常。(其余控件没有设置任何监听事件)
  2. 若是长按 @id/time_value 区域,将会出现光标(不能编辑)同时出现粘贴按钮提示,点击粘贴按钮,可以粘贴上并显示粘贴的文字。(除父布局没有设置其余任何监听事件)

6八、ListView、RecyclerView、ScorllView、Viewpager 等等,取消顶部半圆形的拉力纹

android:overScrollMode="never"
复制代码

6九、EditText 显示两行的高度

android:inputType="textMultiLine" //能够显示多行
android:gravity="left|top" //输入时光标左上角
android:minLines="6" //最小显示6行
复制代码

70、.9图片

左边和上边的黑边表示拉伸区域。右边和下边的黑边表示填充区域

7一、NavigationView 获取 HeaderLayout 布局里的控件

其实,NavigationView是一个RecyclerView(在23.1.0版本以前是ListView),header布局一般是0号元素。在Support Library v23.1.1版本中,可使用以下方法很方便地获取到header中的view:

View headerLayout = navigationView.getHeaderView(0); // 0-index header
复制代码

而在23.1.0版本中,就须要经过这种方法:

View headerLayout =
navigationView.inflateHeaderView(R.layout.navigation_header);
panel = headerLayout.findViewById(R.id.viewId);
// panel won't be null
复制代码

7二、Edittext 输入的限制

限制只输入某些值包括数字、字母等

android:digits="0123456789abcdefghigklmnopqrstuvwxyz"  
复制代码

上面这行代码能够是你任何的限制,只能输入什么就到里面写就能够了,上面写的是只能够输入数字和字母。

android:inputType="textPassword"  
android:digits="0123456789abcdefghigklmnopqrstuvwxyz"  
复制代码

这里是只能输入数字和字母而且是密码格式,这两个设置并无冲突, android:inputType="textPassword" 这里是文本,是能够输入中文的,可是要是你加了 android:digits="0123456789abcdefghigklmnopqrstuvwxyz" ,inputType 这里的中文就会失效了,可是 password 不会失效,这里只是打个比方,你们都懂的。

inputType的属性值

android:inputType="none"  
android:inputType="text"  
android:inputType="textCapCharacters" 字母大写  
android:inputType="textCapWords" 首字母大写  
android:inputType="textCapSentences" 仅第一个字母大写  
android:inputType="textAutoCorrect" 自动完成  
android:inputType="textAutoComplete" 自动完成  
android:inputType="textMultiLine" 多行输入  
android:inputType="textImeMultiLine" 输入法多行(若是支持)  
android:inputType="textNoSuggestions" 不提示  
android:inputType="textUri" 网址  
android:inputType="textEmailAddress" 电子邮件地址  
android:inputType="textEmailSubject" 邮件主题  
android:inputType="textShortMessage" 短讯  
android:inputType="textLongMessage" 长信息  
android:inputType="textPersonName" 人名  
android:inputType="textPostalAddress" 地址  
android:inputType="textPassword" 密码  
android:inputType="textVisiblePassword" 可见密码  
android:inputType="textWebEditText" 做为网页表单的文本  
android:inputType="textFilter" 文本筛选过滤  
android:inputType="textPhonetic" 拼音输入 //数值类型  
android:inputType="number" 数字  
android:inputType="numberSigned" 带符号数字格式  
android:inputType="numberDecimal" 带小数点的浮点格式  
android:inputType="phone" 拨号键盘  
android:inputType="datetime" 时间日期  
android:inputType="date" 日期键盘  
android:inputType="time" 时间键盘  
复制代码

7三、跳转activity,清空以前activity栈

问题描述:
开发中,遇到退出登陆时,须要将界面跳转到登陆界面,并将栈中全部Activity清空。

解决办法

Intent intent = new Intent(A.this,B.class).setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NEW_TASK);  
startActivity(intent);  
复制代码

startActivity 的时候传递 FLAG_ACTIVITY_CLEAR_TASK 这个标志,那么这个标志将会清除以前全部已经打开的 activity .而后将会变成另一个空栈的 root ,而后其余的 Activitys 就都被关闭了.这个方法必须跟着 {@link #FLAG_ACTIVITY_NEW_TASK} 一块儿使用.

7四、LayoutInflater.from(...).inflate(...) 的参数讲解

inflate(int resource, ViewGroup root, boolean attachToRoot)  
复制代码
  1. 若是root为null,attachToRoot将失去做用,设置任何值都没有意义。
  2. 若是root不为null,attachToRoot设为true,则会给加载的布局文件的指定一个父布局,即root。
  3. 若是root不为null,attachToRoot设为false,则会将布局文件最外层的全部layout属性进行设置,当该view被添加到父view当中时,这些layout属性会自动生效。
  4. 在不设置attachToRoot参数的状况下,若是root不为null,attachToRoot参数默认为true。

大大小小的坑,无处不在,防不胜防。后续会继续更新这篇博文的。

点击查看更多Android技术文章

本博客是做者(OCN.Yang)原创
转载请标明原地址:ocnyang.com/2016/08/31/…

相关文章
相关标签/搜索