android 第一行代码 阅读记录
activity
基本用法
AndroidManifest.xml
文件中,android:label
决定了 app 的名称- menu
intent
- 隐式 intent 注意 category 和 action 的名称都要匹配, category 在 xml 文件中可以是多个。
- 隐式 intent 还能调用系统提供的功能,比如浏览器 view,拨号 dial 等等
- intent 通过 putExtra 和 get*Extra 来传递数据
- startActivityResult 可以获得返回值的打开新 activity
life cycle
onCreate
onDestory
,onStart
onStop
,onResume
onPause
,onRestart
- 暂停状态 一般只有在对话框的情况下出现,对话框处于栈顶,原来的 activity 不处于栈顶,但是仍然可见。所以只会调用
onPause
而不会进入onStop
- 为了防止 activity 被回收后数据丢失,所以使用
onSaveInstanceState
来储存临时数据。
start mode
standard
每次 startActivity 都会创建一个新的。singleTop
每次非栈顶的情况就会创建新的。singleTask
每次栈里面没有才会创建新的。singleInstance
所有标记为这个的都会被放到一个单独的栈里面,这个单独的栈里面的是可以被多个程序进行调用的。
优化
BaseActivity
继承AppCompatActivity
,每次onCreate
的时候, logd 打印当前是哪个 activityAcitvityCollector
里面使用类静态列表,储存 activity,每次创建和删除都在列表中进行操作,额外再用一个finishAll
来一次性关闭所有 activity 并清空列表,这样可以避免需要多次后退才能退出的问题。- 在被调用的 activity 里面增加
actionStart(Content content, String data1, String data2)
这样的函数,是的调用者可以很容易看出需要传入哪些数据,用来启动 activity.
UI
common
android:textAllCaps
这个默认是 true 会让 button 上面的文字默认全部大写。- editText 属性
android:hint
用来提示文字,android:maxLines
用来设置最多显示几行,多了就滚动显示。 - imageView 大小属性都选择
wrap_content
比较好,android:src
和setImageResource
分别是 xml 和 java 中设置图片的方法。 - 旋转等待图标一般是使用
visiable
invisiable
gone
这三种来控制显示 - 水平进度条在 xml 中设置
style
和android:max
,然后在 java 中通过getProgress
setProgress
来控制进度条。 AlertDialog
用于警告对话框.ProgressDialog
用于长时间加载对话框,如果setCancelable
设置为 false,那么 后面需要使用dimiss()
来关闭对话框。
layout
- layout_gravity 决定是布局时候的位置,当水平布局时,只能选择
top
center_vertical
bottom
,当垂直布局的时候,只能选择left
center_horizontal
end
. gravity 决定的时内部文字的位置。 - 如果使用
layout_weight
, 那么相应的layout_width
或者layout_height
应该设置为"0dp"
。可以部分空间使用wrap_content
另外一部分使用layout_weight
来分空间。 RelativeLayout
中可以使用alignParentTop
这样的布置到父界面的边角处的,也可以用layout_above
layout_toLeftOf
这样的布置到其他空间的相对位置的,也可以用layout_alignTop
这样的和其他空间边缘对其的。FrameLayout
使用场景很少,一般也就用layout_gravity = "left"
之类的。- 可以通过引入
percent
来扩展FrameLayout
和RelativeLayout
。
custom
- 可以把复用的部分写入一个 xml 布局文件里面,比如说标题栏。然后再其他布局里面通过
<include layout="@layout/title"
这样的形式引入这个复用的部分。 - 原来的标题栏可以通过
getSupportActionBar
和hide
来进行隐藏. - 如果复用的还需要响应用户操作,并且在多个 activity 中响应动作时一样的,那么就需要自定义控件,新建类继承自
LinearLayout
,然后重写他的构造函数,主要是LayoutInflater.from(context).inflate(R.layout.title, this)
用来动态加载title.xml
。 修改调用的 xml 代码,<com.example.uicustomviews.TitleLayout ...
。 然后在子类里面写上响应的代码即可。
ListView
- 简单的字符串列表,直接使用
ArrayAdapter
android.R.layout.simple_list_item_1
即可。 - 定制创建新的类,包含 list 中 item 需要的内容。然后需要继承
ArrayAdapter
写一个相应的 adapter 类专门处理这个 item。还要创建一个新的 xml 专门描述这个 item 内容。最后就可以把这些合起来,使用自定义的 ListView 了。 - 优化提升效率,使用
convertView
避免每次都要LayoutInflater
,新建一个类保存findViewById
返回的内容,然后把这个类使用setTag
保存到convertView
中。 - 点击事件,直接使用
setOnItemClickListener
即可。
RecyclerView
build.gradle
的dependencies
里面可以不增加implementation 'androidx.recyclerview:recyclerview:1.1.0'
- 如果出现一行占据一个屏幕的现象,那就检查
fruit_item.xml
看看里面的 root 节点下的layout_height
是不是match_parent
。 奇怪的是,这样的设置在ListView
中就没有问题。 - 想要横向滚动,只要修改 xml 文件,并且使用
setOrientation(LinearLayoutManager.HORIZONTAL)
即可。 - 想要瀑布,只要使用
StaggerredGridLayoutManager
即可。 - 点击事件,针对需要的使用
setOnClickListener
即可。
参考: https://www.cnblogs.com/rustfisher/p/12254732.html
paractise
- 在 androidstudio 中,右键 png 图片,选择 create 9-patch file,即可创建9图片,然后在需要拉伸的地方用鼠标在边框上描黑,保存即可。然后删除原来的 png 文件就行了。
- 使用
RecyclerView
时,有新的数据,可以使用notifyItemInserted
来通知列表插入新数据,使用scrollToPosition
来让列表滚动到需要的位置。
fragment
usage
- fragment 直接使用 xml,然后新建类继承
Fragment
即可。 - 动态加载,那么 xml 里面需要使用
FrameLayout
来预先占据 fragment 的位置。使用getSupportFragmentManager
beginTransaction
replace
commit
来把 fragment 动态加载到这个 frame layout 里面去。 - 按后退键能够类似 activity 一样,可以使用
addToBackStack
这个方法。 - activity 调用 fragment 中的方法,首先使用
getSupportFragmentManager().findFragmentById(R.id.right_fragment
这样的方法获取到 fragment 实例,然后就可以调用方法了。 - fragment 获取 activity 方法,可以使用
getActivity
来获取到 activity 实例,然后就可以调用方法了。
life
- activity 进入停止状态,fragment 也会自动停止。或者使用
FragmentTranscation
的 remove, replace 方法移除 fragment。 - fragment 专门的回调函数,
onAttach
onDetach
是 fragment 和 activity 建立解除关联时调用。onCreateView
onDestoryView
是创建视图加载布局或者相反时调用。onActivityCreated
和 fragment 相关联的 activity 一定已经创建完毕时调用。 - 添加 fragment -> onAttach -> onCreate -> onCreateView -> onActivityCreated -> onStart -> onResume + onPause -> onStop -> onDestoryView -> onDestory -> onDetach -> 销毁。
- onDestoryView -> onCreateView.
- 如果使用了
addToBackStack
,那么切换 fragment 的时候,可以让当前的 fragment 只执行onDestoryView
而不执行onDestory
,使用返回键的时候跳过onCreate
直接进入onCreateView
。 onSaveInstanceState
可以用来保存临时数据,防止被系统因为内存问题直接回收了。
trick
- 可以新建文件夹
layout-large
,当系统认为当前设备是 large 的时候,就会调用这个文件夹下面的布局文件,否则调用layout
文件夹下面的布局文件。 具体可以看 P158 - 还可以手动指定最小宽度,新建
layout-sw600dp
,当屏幕宽度大于等于 600dp 的时候,就会加载这个文件夹下面的布局文件。 具体可以看 P159
practice
android:ellipsize
文本超过控件宽度,文本从尾部进行缩略。Configurations for activity_main.xml must agree on the root element's ID.
这个报错是因为在多个layout
中activity_main.xml
中 root 节点的android:id
必须一致。