目录:
- float 、double 取整
- event.getX()、event.getY()与event.getRawX()、event.getRawY()的区别
- 获取状态栏的高度
- Fragment 与 Fragment 相互切换之间的生命周期方法
float 、double 取整:
Math.ceil()执行向上舍入,即它总是将数值向上舍入为最接近的整数;
Math.floor()执行向下舍入,即它总是将数值向下舍入为最接近的整数;
Math.round()执行标准舍入,即它总是将数值四舍五入为最接近的整数(这也是我们在数学课上学到的舍入规则)。
event.getX()、event.getY()与event.getRawX()、event.getRawY()的区别:
红边框表示手机屏幕,蓝边框表示控件,红点表示点击的位置
getRawX() :点击的位置距离屏幕的坐标
getX():点击位置相对于组件本身的坐标
获取状态栏的高度
/**
* 用于获取状态栏的高度。
*
* @return 返回状态栏高度的像素值。
*/
private int getStatusBarHeight() {
if (statusBarHeight == 0) {
try {
Class<?> c = Class.forName("com.android.internal.R$dimen");
Object o = c.newInstance();
Field field = c.getField("status_bar_height");
int x = (Integer) field.get(o);
statusBarHeight = getResources().getDimensionPixelSize(x);
} catch (Exception e) {
e.printStackTrace();
}
}
return statusBarHeight;
}
Fragment 与 Fragment 相互切换之间的生命周期方法
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal">
<FrameLayout
android:id="@+id/fl_containers"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="26">
</FrameLayout>
</LinearLayout>
public void setFragment(Fragment fragment){
FragmentManager fragmentManager = getSupportFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
fragmentTransaction.add(R.id.fl_containers,fragment);
fragmentTransaction.commit();
}
public void replaceFragment(Fragment fragment){
FragmentManager fragmentManager = getSupportFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
fragmentTransaction.replace(R.id.fl_containers,fragment);
fragmentTransaction.commit();
}
add 和 replace 区别:
add:把一个 fragment 添加到一个容器 container 中
replace:先 remove 掉相同 id的所有 fragment, 然后再add 当前的这个 fragment
Fragment1 切换到 Fragment2 时生命周期的变化
1、通过 add hide show 方式来切换 Fragment
- Fragment1 的生命周期变化为: onCreate()、 onCreateView()、 onStart()、 onResume(),回调 onHiddenChanged() 方法
- Fragment2 的生命周期变化为: onCreate()、 onCreateView()、 onStart()、 onResume()
- Fragment2 再次返回到 Fragment1: 不走任何生命周期方法但回调 onHiddenChanged()
总结:
当以这种方式进行 Fragment1 与 Fragment2 的切换时,Fragment隐藏的时候并不走 onDestoryView,所有的显示也不会走 onCreateView,所有的view都会保存在内存中
2、使用 replace 进行切换
- 载入 Fragment1 时:
Fragment1 的生命周期:onCreate()、 onCreateView()、 onStart()、 onResume()
- 切换到 Fragment2 时:Fragment1
Fragment1 的生命周期:onPause()、 onStop()、 onDestoryView()、onDestory()
Fragment2 的生命周期:onCreate()、 onCreateView()、 onStart()、 onResume()
- Fragment2 切换回 Fragment1时:
Fragment2 的生命周期:onPause()、 onStop()、 onDestoryView()、 onDestory()
Fragment1 的生命周期:onCreate()、 onCreateView()、 onStart()、 onResume()
总结:
通过 replace 方法进行替换的时候,Fragment 都是进行了销毁,重建的过程,相当于走了一整套的生命周期
3、使用 ViewPager 进行切换时
当使用 ViewPager 与 Fragment 进行切换时,Fragment 会进行预加载操作
所有的 Fragment 都会提前初始 --> 预加载
初始化时 Fragment 们的生命周期:
Fragment1 的生命周期: onCreate()、 onCreateView()
Fragment2 的生命周期: onCreate()、 onCreateView()
Fragment1 切换到 Fragment2 的生命周期:
Fragment1: 不走任何生命周期
Fragment2: 走 setUserVisibleHint() 方法
切回去也是一样
注:
setUserVisibleHint() 方法在 Fragment1 第一次加载的时候不走,只有在切换的时候走该方法
/**
* 标志位,标志已经初始化完成
*/
private boolean isPrepared;
/**
* 第一个 Fragment 需要处理 setUserVisVleHint()方法,设置为 setUserVisibleHint(true);
* 否则会产空指针异常,因为 setUserVisVleHint()方法的优先级高于 onCreate()方法。
*
* @param savedInstanceState
*/
@Override
public void onActivityCreated(Bundle savedInstanceState) {
setUserVisibleHint(true);
super.onActivityCreated(savedInstanceState);
}
/*
主动调用 setUserVisibleHint()方法来控制第一次不会调用setUserVisibleHint方法的问题。
setUserVisibleHint()方法优先onCreateView方法,当onCreateView方法调用后还会再次调用
setUserVisibleHint方法。
此时要对是否调用了onCreateView()方法进行标记判断。
*/
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = LayoutInflater.from(getActivity()).inflate(R.layout.fragment_a, container, false);
//已经初始化
isPrepared = true; return view;
}
@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
super.setUserVisibleHint(isVisibleToUser);
//可见的并且是初始化之后才加载
if (isPrepared && isVisibleToUser) {
getList();
}
}
4、 Activity切换到 Fragment 的生命周期变化
Fragment 的生命周期变化为 : onStart()、 onResume()
5、 从 Fragment1 进行锁屏操作
Fragment 的生命周期方法: onPause()、 onSaveInstanceState()、 onStop()
6、 从解锁到 Fragment1 的生命周期
onStart()、 onResume()