该笔记主要是通过学习《第一行代码》中的各种知识点以及实例,进行的个人学习记录,感谢图书作者郭霖大神
android:label 指定活动中标题栏的内容,标题栏是显示在活动最 顶部的* 标题栏隐藏 ——在onCreate中使用 requestWindowFeature(Window.FEATURE_NO_TITLE)的意思就是不在活动中显示标题栏,注意这句代码一定要在 setContentView()之前执行Activity生命周期,结束当前活动用finish
- 新学控件
- AlertDialog(主要属性:标题Title,内容Message,按钮事件positive/negative,是否可以返回Cancelable)需要代码中用show显示到屏幕
- ProgressBar(主要属性:圆形或长条style,进度值max,可见性visible)不需要代码中用show显示到屏幕
- ProgressDialog与AlertDialog相似,但是xuyongD调用dismiss关闭
- 布局复习 * LinearLayout(2个重要属性)
- layout_gravity 根据LinearLayout的水平/垂直属性,再决定控件的垂直/水平位置
- layout_weight 可以去除layout_width的依赖,规范做法是将控件的width设置为0dp,然后对控件的layout_weigth设置即可,当然也可以width weight一起使用在不同控件中
- RelativeLayout
主要是align为前缀的属性,相对位置可以是相对于父控件的位置,也可以是同级控件的位置,主要有这些:alignParentLeft/Right/Bottom,centerInParent,align_toRightOf/toLeftOf/below/above
- FrameLayout
只是将所有控件放置在布局左上角,在讨论碎片时将使用到,其他情形下很少用
-
TableLayout
- 使用表格的方式排列控件,主要是行列的设置,通常对不同行,列数不同时,通过合并单元格的方式解决
- TableLayout中每个TableRow代表一行。TableRow中每加一个控件,就是添加一列。使用属性layout_span=2,可以合并2列,这样就对齐了。为了填补一行的其余空白位置,使用strechColumns属性,将某个行内控件拉伸自适应屏幕。strechColumns = 0表示拉伸从左往右的第0个控件
-
引入布局到其他布局,自定义控件
- 在需要引入的布局文件中添加<include layout=""/>即可将目标布局放入其中
- 自定义控件的一个优点是,避免在其他代码中重复实现布局中控件的某些功能 * 单位问题 > px表示像素,pt用于文字大小的表示
- android中的对应单位按比例可以适用于不同的屏幕dpi,dp=dip(px的升级版),sp(pt的升级版,用于文字大小配置)
- 聊天功能的界面实现
- 首先需要用sdk自带的drawPatch将图片配置成拉伸合理的素材图片
- 基本由一个listview,一个textview和一个button组成,需要注意的是“如何自动更新信息同时看到最新发出或收到的信息”,对listview进行实时更新——利用适配器所带函数notifyDataChanged()通知listview数据产生变化,使用listView的setSelection(dataCollection.size)函数,将显示的数据定位到最后一行
-
Fragment(总是依附activity存在)
- 不同一般控件,它的添加需要一般控件作为内容,同时需要一个java类完成fragment控件的自定义绘制,因此接下的学习才能体会到fragment具有类似自定义控件的性质
- 生命周期
- 运行,暂停,停止,销毁
- 进入停止状态的所有fragment都是不可见的,使用addtoBackStack能够使fragment进入停止,但也可能被系统回收 * 静态加载fragment
- 首先需要针对每一个fragment设置f.xml布局文件,之后再对应fragment布局文件对应新建Fragment类F.java > * 该Fragment类继承自android.app.Fragment,重写onCreateView方法,在方法中通过调用LayoutInflate.inflate方法将定义的fragment布局文件f.xml作为参数传递进来,相当于类与布局的绑定,在个人看来这种做法与自定义控件十分相似
- 最后,在需要加载fragment控件的主xml中,用以下代码方式将fragment加载入主xml的布局中加以显示,需要留意的是android.name属性,必须对控件fragment的该属性指定包名+类名才能够找到并加载对应的fragment布局对象
<fragment
android:id="@+id/fragment"
android:layout_width="match_parent"
android:name="com.example.young.***"
android:layout_height="match_parent" />
- 动态加载fragment
- 必要步骤与静态加载相同,新建f.xml并新建F.java
- 在需要动态加载/替换不同fragment的位置,添加 FrameLayout 标签,因为该标签特性是所有控件都覆盖在左上角,这样就使得新加载的控件能够覆盖之前的控件,达到替换不同fragment的作用,演示代码如下:
<FrameLayout
android:id="@+id/right_layout"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1">
<fragment
android:id="@+id/right_fragment"
android:layout_width="match_parent"
android:name="包名+fragment类名"
android:layout_height="match_parent" />
</FrameLayout>```
> * 动态加载说明需要根据输入来改变界面显示,因此使用一个按钮点击按钮的方式替换加载不同fragment作为实例,说明如何动态加载fragment,具体只需要在button的监听事件中编写fragment相关逻辑
```java
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
AnotherRightFragment fragment = new AnotherRightFragment();
FragmentManager fragmentManager = getFragmentManager();
FragmentTransaction transaction =
fragmentManager.beginTransaction();
transaction.replace(R.id.right_layout, fragment);
transaction.addToBackStack(null);
transaction.commit();
}
});
- 分析动态加载过程,使用到的对象有:fragment布局对应的类实例fragment,FragmentmanagerFragmentTransaction 需要先得到一个新fragment实例(目的是用于之后的加载),然后得到FragmentManager实例(Activity中可直接调用getFragmentManager()获取),之后的操作就是利用manager开始一次事物操作,manager实例调用beginTransaction()得到一个事物transaction实例对象(个人感觉该操作类似数据库一次事物),通过transaction进行需要的操作(replace,remove等),记得需要提交conmmit。这里提交之前的一句addToBackStack(null)是为了保存懂动态加载之前的一个状态,模拟activity返回栈的操作,使得动态加载之后,点击back键就能返回上一次的状态,而不是直接退出(这一步经过实践并没实现预期结果,还未找到问题暂时搁置)
Bundle对象实例,可用于保存恢复某些数据(2.4.5 小节)
- Bundle对象能够保存多种对象,例如bundle.putString(String key,String value),bundle.putInt(String key,int value),在内存不足可能回收停止状态的活动时,重写onSaveInstanceState(Bundle bundle)能够将数据保存在bundle中,再次启动活动时,通过onCreate的Bundle参数获取相关数据
- Bundle可以通过intent在不同活动中传递,将数据保存在Bundle中,再将Bundle保存在intent中传递也是一种传递数据的方式
- 限定符(作用是自动判定该如何显示fragment,双页还是单页显示)
- 新建不同大小的适配的文件夹(这里有统一的格式规定),例如在res目录下新建layout-large文件夹(用于适配双页)放置显示双页格式的布局xml文件
- 最小限定符(Smallest-width Qualifier):灵活适配不同宽度大小的屏幕,单位是dp,举例layout-sw600dp表示屏幕宽度大于600dp的时候就使用该文件夹中的布局xml文件,小于就适配其他布局文件(该功能由Android 3.2 引入)
网友评论