jinhucheung / blog

学习笔记

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

Android 学习之FQA

jinhucheung opened this issue · comments

commented

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的控件

commented

2. Android程序级权限与组件级权限的区别

1. 程序组权限

程序运行时所需要的权限 通过在<manifest>元素下添加<usespermission>为程序本身声明权限

2. 组件级权限

程序各组件可以被其他程序调用,此时该组件声明所需的权限.通过在<activity>``<service>等元素下添加<usespermission>为组件声明权限.

commented

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这个载体上面

commented

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出来的红色线区)

commented

5. ListView怎么隐藏滚动条?

设置andriod:scrollbars="none"即可

6. 关于同区域两个组件设置了类似的监听器,哪个作用?

是最上层的组件的监听器响应.
比方说,父组件设置点击监听,子组件也设置了点击监听,在子组件的区域里,点击是子组件响应,在子组件外的区域里,点击是父组件响应

7. 怎么引用当前主题的属性值

要引用样式属性,名称语法几乎与普通资源格式完全相同,只不过将 at 符号 (@) 改为问号 (?),资源类型部分为可选项。比如,下面例子中,Android将会使用当前主题的android:textColorSecondary的属性值设置组件的textColor

android:textColor="?android:textColorSecondary"