单位和尺寸
px 是像素的意思,即屏幕中可以显示的最小元素单元,我们应用里任何可见的东西都是由一个个像素点组成的。单独一个像素点非常的微小,肉眼是无法看见的。不同分辨率的手机上同样的像素数所占尺寸不同
dp 是密度无关像素的意思,也被称作dip,和px 相比,它在不同密度的屏幕中的显示比例将保持一致。
sp 是可伸缩像素的意思,它采用了和dp 同样的设计理念,解决了文字大小的适配问题。
密度 是屏幕每英寸所包含的像素数,通常以dpi 为单位。比如一个手机屏幕的宽是2 英寸长是3 英寸,如果它的分辨率是320*480 像素,那这个屏幕的密度就是160dpi,如果它的分辨率是640*960,那这个屏幕的密度就是320dpi,因此密度值越高的屏幕显示的效果就越精细。
动态获取当前屏幕的密度值的方法:
float xdpi = getResources().getDisplayMetrics().xdpi; float ydpi = getResources().getDisplayMetrics().ydpi; Log.d("MainActivity", "xdpi is " + xdpi); Log.d("MainActivity", "ydpi is " + ydpi);
160dpi 的屏幕上,1dp 等于1px,而在320dpi 的屏幕上,1dp就等于2px。大多使用dp 来指定控件的宽和高
制作Nine-Patch 图片
在Android sdk 目录下有一个tools 文件夹,在这个文件夹中找到draw9patch.bat 文件
在图片的四个边框绘制一个个的小黑点,在上边框和左边框绘制的部分就表示当图片需要拉伸时就拉伸黑点标记的区域,在下边框和右边框绘制的部分则表示内容会被放置的区域
ListView 中android:divider属性,可以指定ListView 分隔线的颜色,#0000 表示将分隔线设为透明色。
对qq微信之类聊天界面的理解:
1:实际上是一个ListView,
2:用.9图绘制聊天气泡框
3:每一行都有两个方向的聊天框,可以在适配器里getView()方法里通过判断消息类型用.setVisibility(View.VISIBLE);.setVisibility(View.GONE);控制气泡是否可见
4:adapter.notifyDataSetChanged(); // 当有新消息时,刷新ListView中的显示
msgListView.setSelection(msgList.size()); // 将ListView定位到最后一行
inputText.setText(""); // 清空输入框中的内容
Fragment
将一个fragment代替另一个fragment,用FramLayout,比如一个FramLayout里只有一个right_layout,要用AnotherRightFragment代替掉,可以用如下代码:
AnotherRightFragment fragment = new AnotherRightFragment(); FragmentManager fragmentManager = getFragmentManager(); FragmentTransaction transaction = fragmentManager.beginTransaction(); transaction.replace(R.id.right_layout, fragment); transaction.commit();
FramLayout...嗯...
按下Back 键可以回到上一个碎片:
FragmentTransaction 中提供了一个addToBackStack()方法,可以用于将一个事务添加到返回栈中,它可以接收一个名字用于描述返回栈的状态,一般传入null 即可。
在transaction.commit();上一行添加transaction.addToBackStack(null);
Fragment和Activity之间进行通信
都是各自存在于一个独立的类当中的,它们之间并没有那么明显的方式来直接进行通信。
FragmentManager 提供了一个类似于findViewById()的方法,专门用于从布局文件中获取碎片的实例,即调用FragmentManager 的findFragmentById()方法,可以在Activity中得到相应Fragment的实例,然后就能轻松地调用Fragment里的方法了。
RightFragment rightFragment = (RightFragment) getFragmentManager().findFragmentById(R.id.right_fragment);
在每个碎片中都可以通过调用getActivity()方法来得到和当前碎片相关联的活动实例:
MainActivity activity = (MainActivity) getActivity();
Fragment之间的通讯的思路:
首先在一个Fragment中可以得到与它相关联的Activity,然后再通过这个Activity去获取另外一个Fragment的实例
暂时木有代码,以后用到了再查,挖一个坑以后填.........
Fragment的状态和回调
1. 运行状态当一个碎片是可见的,并且它所关联的活动正处于运行状态时,该碎片也处于运行状态。
2. 暂停状态当一个活动进入暂停状态时(由于另一个未占满屏幕的活动被添加到了栈顶),与它相关联的可见碎片就会进入到暂停状态。
3. 停止状态当一个活动进入停止状态时,与它相关联的碎片就会进入到停止状态。或者通过调用FragmentTransaction 的remove()、replace()方法将碎片从活动中移除,但有在事务提交之前调用addToBackStack()方法,这时的碎片也会进入到停止状态。总的来说,进入停止状态的碎片对用户来说是完全不可见的,有可能会被系统回收。
4. 销毁状态碎片总是依附于活动而存在的,因此当活动被销毁时,与它相关联的碎片就会进入到销毁状态。或者通过调用FragmentTransaction 的remove()、replace()方法将碎片从活动中移除,但在事务提交之前并没有调用addToBackStack()方法,这时的碎片也会进入到销毁状态。
Activity中有的回调方法,Fragment中几乎都有,不过Fragment还提供了一些附加的回调方法:
1. onAttach()
当碎片和活动建立关联的时候调用。
2. onCreateView()
为碎片创建视图(加载布局)时调用。
3. onActivityCreated()
确保与碎片相关联的活动一定已经创建完毕的时候调用。
4. onDestroyView()
当与碎片关联的视图被移除的时候调用。
5. onDetach()
当碎片和活动解除关联的时候调用。
碎片完整的生命周期示意图可参考下图,图片源自Android 官网。
当RightFragment 第一次被加载到屏幕上时,会依次执行
onAttach()、
onCreate()、
onCreateView()、
onActivityCreated()、
onStart()、
onResume()
然后点击LeftFragment 中的按钮,由于AnotherRightFragment 替换了RightFragment,此时的RightFragment 进入了停止状态,因此
onPause()、
onStop()、
onDestroyView()
当然如果在替换的时候没有调用addToBackStack()方法,此时的RightFragment 就会进入销毁状态,
onDestroy()
onDetach()
接着按下Back 键,RightFragment 会重新回到屏幕,由于RightFragment 重新回到了运行状态, 因此
onActivityCreated() 、
onStart() 、
onResume()
注意此时onCreate()和onCreateView()方法并不会执行,因为我们借助了addToBackStack()方法使得RightFragment 和它的视图并没有销毁。再次按下Back 键退出程序,依次会执行
onPause()、
onStop()、
onDestroyView()、
onDestroy()、
onDetach()最终将活动和碎片一起销毁。
可以通过onSaveInstanceState()方法来保存数据,保存下来的数据在onCreate()、onCreateView()和onActivityCreated()这三个方法中你都可以重新得到,它们都含有一个Bundle 类型的savedInstanceState 参数。
172页...............172/555=?
哦,我是数学系的,可是我懒得算了.......
明天回家可能要不看书停更啦
.........回家看笔记
明天的工作依旧迷茫,php那边太不给力了!