Android 学习之FQA
jinhucheung opened this issue · comments
1. Android:id设置的三种方式区别?
对Android控制设置id,通常有以下三种方式:
- android:id="@+id/btn"
- android:id="@id/btn"
- android:id="@android:id/button1"
1. android:id="@+id/btn"
表示在R.java资源文件中新增一个id为btn的控件索引
public static final class id {
public static final int btn =0x7f0b0056;
}
代码获取方式:findViewById(R.id.btn);
2. android:id="@id/btn"
表示使用R.java资源文件中已存在的id为btn的索引
代码获取方式:跟1一样
3. android:id="@android:id/button1"
表示使用的是系统已有的ID,在对应的sdk目录下的ids.xml里面(如Sdk/platforms/android-21/data/res/values/ids.xml) ,一般只去引用其ID,不直接使用其ID作为自己App控件索引
代码中获取方式:android.R.id.button1
4. 在ids.xml中添加自己的Id组
我们可以在values下新建ids.xml,然后写入id项,便于方式2使用.
<resources>
<item name="btn_1" type="id"></item>
<item name="btn_2" type="id"></item>
</resources>
5. 当同个layout布局文件中,多个组件使用同一个id的问题
当我们调用findViewById(int id)
被引用的是第一个使用此id的控件
2. Android程序级权限与组件级权限的区别
1. 程序组权限
程序运行时所需要的权限 通过在<manifest>
元素下添加<usespermission>
为程序本身声明权限
2. 组件级权限
程序各组件可以被其他程序调用,此时该组件声明所需的权限.通过在<activity>``<service>
等元素下添加<usespermission>
为组件声明权限.
3. Activity、Window、View的关系
详细问题描述:原文链接
1. View和ViewGroup
Android系统中的所有UI类都是建立在View和ViewGroup这两个类的基础上的。所有View的子类成为”Widget”,所有ViewGroup的子类成为”Layout”。View和ViewGroup之间采用了组合设计模式,可以使得“部分-整体”同等对待。ViewGroup作为布局容器类的最上层,布局容器里面又可以有View和ViewGroup。
2. LayoutInflater,LayoutInflater.inflate()
LayoutInflater是一个用来实例化XML布局文件为View对象的类
LayoutInflater.infalte(R.layout.test,null)用来从指定的XML资源中填充一个新的View
3. Activity、Window、View之间的关系
而当我们运行程序的时候,有一个setContentView()方法,Activity其实不是显示视图(直观上感觉是它),实际上Activity调用了PhoneWindow的setContentView()方法,然后加载视图,将视图放到这个Window上,而Activity其实构造的时候初始化的是Window(PhoneWindow),Activity其实是个控制单元,即可视的人机交互界面。
打个比喻:
Activity是一个工人,它来控制Window;Window是一面显示屏,用来显示信息;View就是要显示在显示屏上的信息,这些View都是层层重叠在一起(通过infalte()和addView())放到Window显示屏上的。而LayoutInfalter就是用来生成View的一个工具,XML布局文件就是用来生成View的原料
再来说说代码中具体的执行流程
setContentView(R.layout.main)其实就是下面内容。
getWindow().setContentView(LayoutInflater.from(this).inflate(R.layout.main, null))
即运行程序后,Activity会调用PhoneWindow的setContentView()来生成一个Window,而此时的setContentView就是那个最底层的View。然后通过LayoutInflater.infalte()方法加载布局生成View对象并通过addView()方法添加到Window上,(一层一层的叠加到Window上)
所以,Activity其实不是显示视图,View才是真正的显示视图
注:一个Activity构造的时候只能初始化一个Window(PhoneWindow),另外这个PhoneWindow有一个”ViewRoot”,这个”ViewRoot”是一个ViewGroup,是最初始的根视图,然后通过addView方法将View一个个层叠到ViewRoot上,这些层叠的View最终放在Window这个载体上面
4. 关于9-patch的使用
学习9-pathch笔记
从上面的文章,我们可以知道Android显示9-patch的内容区域是在图片上设置padding,如果我们在引用这张图片的组件上再设置padding的话,9-patch的padding就会失效,达不到需要的效果.
注意:Android Studio使用minmap代替drawable目录,9-patch图片在minmap目录,引用9-patch图片时会报错(AS支持问题)
解决方法1:9-patch图片放在drawable
解决方法2:修复9-patch的bad-patches区域(show bad patches出来的红色线区)
5. ListView怎么隐藏滚动条?
设置andriod:scrollbars="none"即可
6. 关于同区域两个组件设置了类似的监听器,哪个作用?
是最上层的组件的监听器响应.
比方说,父组件设置点击监听,子组件也设置了点击监听,在子组件的区域里,点击是子组件响应,在子组件外的区域里,点击是父组件响应
7. 怎么引用当前主题的属性值
要引用样式属性,名称语法几乎与普通资源格式完全相同,只不过将 at 符号 (@) 改为问号 (?),资源类型部分为可选项。比如,下面例子中,Android将会使用当前主题的android:textColorSecondary的属性值设置组件的textColor
android:textColor="?android:textColorSecondary"