activity
基本用法
AndroidManifest.xml文件中,android:label决定了 app 的名称- menu
intent
- 隐式 intent 注意 category 和 action 的名称都要匹配, category 在 xml 文件中可以是多个。
- 隐式 intent 还能调用系统提供的功能,比如浏览器 view,拨号 dial 等等
- intent 通过 putExtra 和 get*Extra 来传递数据
- startActivityResult 可以获得返回值的打开新 activity
life cycle
onCreateonDestory,onStartonStop,onResumeonPause,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 中设置图片的方法。 - 旋转等待图标一般是使用
visiableinvisiablegone这三种来控制显示 - 水平进度条在 xml 中设置
style和android:max,然后在 java 中通过getProgresssetProgress来控制进度条。 AlertDialog用于警告对话框.ProgressDialog用于长时间加载对话框,如果setCancelable设置为 false,那么 后面需要使用dimiss()来关闭对话框。
layout
- layout_gravity 决定是布局时候的位置,当水平布局时,只能选择
topcenter_verticalbottom,当垂直布局的时候,只能选择leftcenter_horizontalend. gravity 决定的时内部文字的位置。 - 如果使用
layout_weight, 那么相应的layout_width或者layout_height应该设置为"0dp"。可以部分空间使用wrap_content另外一部分使用layout_weight来分空间。 RelativeLayout中可以使用alignParentTop这样的布置到父界面的边角处的,也可以用layout_abovelayout_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
- 简单的字符串列表,直接使用
ArrayAdapterandroid.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 的位置。使用getSupportFragmentManagerbeginTransactionreplacecommit来把 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 专门的回调函数,
onAttachonDetach是 fragment 和 activity 建立解除关联时调用。onCreateViewonDestoryView是创建视图加载布局或者相反时调用。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必须一致。