问1:在子线程中能不能弹Toast?
解析:我们知道在子线程中弹Toast会崩掉;
但是只要加入Looper就可以了:
Looper.prepare();
.......
Toast.makeText(...).show();
Handler handler=new Handler(){
...handleMessage(){.....}
};
.......
Looper.loop();
一般都是在子线程中发消息,主线程来处理;加入Looper之后,就能主发,子线程处理,或子线程发子线程处理(好像没啥意义)。
Handler发送消息和处理消息,Looper从消息队列取出消息给Handler处理。
问2:ViewPager适配数据时,什么时候 extends PagerAdapter,什么时候继承自FragmentStatePagerAdapter?
解析:①如果ViewPager中填充View时用PagerAdapter。
② 如果ViewPager中填充Fragment时,用FragmentStatePagerAdapter,它是PagerAdapter的一个子类。
创建adapter对象时需要传入FragmentManager,可以用getSupportFragmentManager() 获取,它向下兼容。
问2.1:FragmentStatePagerAdapter与FragmentPagerAdapter的区别?
解析:数据量比较小时用FragmentPagerAdapter;
数据量大时用FragmentStatePagerAdapter,它会保存Fragment的状态(推荐用这个)
问3:自定义控件要实现哪些方式?
解析:如自定义ViewGroup,需实现主要的两个方法:
① onMeasure:测量自己的宽和高,及测量子View的宽和高
② onLayout:设置子View的位置
onMeasure:根据子View的布局文件,为子View设置测量模式和测量值。
测量=测量模式 + 测量值 ;
测量模式:3种 --->EXACTLY(很精确的):100dp, match_parent
AT_MOST(根据子View情况而定):wrap_content
UNSPCIDIED(子View想要多大就多大):很少见
问4:自定义控件时,有3个构造函数,分别什么时候调用?
public GamePintuLayout(Context context) {}
public GamePintuLayout(Context context, AttributeSet attrs) {}
public GamePintuLayout(Context context, AttributeSet attrs, int defStyleAttr) {}
解析:当new这个自定义控件,只传入context时,调用第一个;
当在xml布局中加入这个自定义控件时,一般调用第二个;
第三个一般系统不会调用,要在代码中显示的调用。
5. fragment生命周期: 与Activity生命周期对应关系:
created -- >onAttach(),onCreate(),onCreateView(),onActivityCreated().
started -- > onStart();
resumed -- > onResume();
paused -- > onPause();
stopped -- > onStop();
destroyed -- > onDestroyView(),onDestroy(),onDetach().
oncreateView() 想当于 setcontentview(xml);
问6:渐变动画跟属性动画的区别?
解析:在Android 3.0中,新引入了除补间动画Tween Animation、帧动画Frame Animation以外的第三种动画,属性动画Property Animation就是ValueAnimator类.特点:ValueAnimator通过改变对象的属性值来实现界面的改变,而其他动画,只是界面显示上的改变,动画结束后,你会发现,即使view已经运动到别的位置,但click事件还是在原来的地方,ValueAnimator不会有这个问题。
ValueAnimator有两个子类,一个是TimeAnimator,一个是ObjectAnimator。
TimeAnimator在api 16才引入,它并不能直接实现动画效果,而是在TimeListener里返回动画持续的时间,与上次调用的间隔时间,要怎么改变view,需要自己操作。
ObjectAnimator可以直接改变对象的属性值,比如,我们可以通过改变ProgressBar的progress属性,实现进度的改变.
摘自: Android开发:使用ValueAnimator动画
使用方法查看鸿洋的: Android 属性动画 源码解析 深入了解其内部实现
问7:Fragment有哪些API?哪个会销毁视图,哪个会销毁实例,哪个仅仅只是隐藏?
解析:
1.常用的3个类:Fragment--定义Fragment ;FragmentManager --用于在Activity中操作Fragment; FragmentTransaction -- 事务,保证一些列Fragment操作的原子性
2. 获取FragmentManage
v4中,getSupportFragmentManager
3. FragmentTransaction的方法
① benginTransatcion
FragmentTransaction transaction = fm.benginTransatcion();//开启一个事务
② transaction.add() 往Activity中添加一个Fragment
③ transaction.remove()
从Activity中移除一个Fragment,如果被移除的Fragment没有添加到回退栈(BackStack),这个Fragment实例将会被销毁。
④ transaction.replace()
使用另一个Fragment替换当前的,实际上就是remove()然后add()的合体~
⑤ transaction.hide()
隐藏当前的Fragment,仅仅是设为不可见,并不会销毁,对应的操作是:transaction.show()
⑥ detach()
会将view从UI中移除,和remove()不同,此时fragment的状态依然由FragmentManager维护。
⑦ attach() 重建view视图,附加到UI上并显示。
⑧ transatcion.commit() //提交一个事务
比如:我在FragmentA中的EditText填了一些数据,当切换到FragmentB时,如果希望会到A还能看到数据,则适合你的就是hide和show;再比如:我不希望保留用户操作,你可以使用remove(),然后add();或者使用replace()这个和remove,add是相同的效果。remove和detach有一点细微的区别,remove会销毁整个Fragment实例,而detach则只是销毁其视图结构,实例并不会被销毁。
详情点这: Android Fragment 真正的完全解析(上)
8. SparseArray、ContentValues、Bundle
解析: SparseArray 是int为key,content为Object类型的Map,但是它比HashMap效率要高。
ContentValues的key是String类型,content是基本类型(一般在数据库中使用)。
Bundle(用于两个activity之间通讯) 也是key -value的形式。
9. 使用属性动画Animator
1) ObjectAnimator
① ObjectAnimator.ofFloat(imageView,"rotation",0,360F).setDuration(1000).start();
只要有set,get方法的属性都可以操作,如translationX,X,scaleX等.
② 多个动画执行时,其它是个异步的过程,并不是一个执行完后再执行另外的。但Google提供了更多的方法:
PropertyValuesHolder p1=PropertyValuesHolder.ofFloat("rotation",0,360F);
PropertyValuesHolder p2=PropertyValuesHolder.ofFloat("translationX",0,200F);
PropertyValuesHolder p3=PropertyValuesHolder.ofFloat("scaleX",0,2F);
ObjectAnimator.ofPropertyValuesHolder(imageView,p1,p2,p3).setDuration(1000).start();
这样就实现了多个动画同时执行。它的优点是进行了优化,效率更高。
③ 多个动画有顺序的执行
ObjectAnimator anim1=ObjectAnimator.ofFloat(one,"rotation",0,360F);
ObjectAnimator anim2=ObjectAnimator.ofFloat(one,"translationX",0,200F);
ObjectAnimator anim3=ObjectAnimator.ofFloat(one,"scaleX",0,3F);
AnimatorSet set=new AnimatorSet();
// set.playTogether(anim1,anim2,anim3); //同时
// set.playSequentially(anim1,anim2,anim3); //顺序
set.play(anim2).with(anim3); //多组合
set.play(anim1).after(anim2);
set.setDuration(1000).start();
④ 动画监听
ObjectAnimator anim1=ObjectAnimator.ofFloat(one,"alpha",0,1F);
anim1.addListener(new AnimatorListenerAdapter(){});
使用AnimatorListenerAdapter可以只实现其中的某些方法,若使用AnimatorListener则必须实现4个方法。
2)ValueAnimator 数值发生器
ValueAnimator并不会操作任何属性,也不会启动任何动画,它只是给出动画该怎么变化的值。
ObjectAnimator是ValueAnimator的子类。
① ValueAnimator 的使用
ValueAnimator animator = ValueAnimator.ofFloat(0, 100F);
animator.setDuration(1000).start();
animator.addUpdateListener(new AnimatorUpdateListener()
{
@Override
public void onAnimationUpdate(ValueAnimator animation)
{
mBlueBall.setTranslationY((Float) animation.getAnimatedValue());
}
});
ValueAnimator只计算出变化的值,在Listener中拿到值,由其它来操作这个值。
② TypeEvaluator 值计算器
actionbar背景色:<item name="android:colorPrimary">
状态栏背景色:<item name="android:colorPrimaryDark">
控件颜色(光标等):<item name="android:colorAccent">
解析:我们知道在子线程中弹Toast会崩掉;
但是只要加入Looper就可以了:
Looper.prepare();
.......
Toast.makeText(...).show();
Handler handler=new Handler(){
...handleMessage(){.....}
};
.......
Looper.loop();
一般都是在子线程中发消息,主线程来处理;加入Looper之后,就能主发,子线程处理,或子线程发子线程处理(好像没啥意义)。
Handler发送消息和处理消息,Looper从消息队列取出消息给Handler处理。
问2:ViewPager适配数据时,什么时候 extends PagerAdapter,什么时候继承自FragmentStatePagerAdapter?
解析:①如果ViewPager中填充View时用PagerAdapter。
② 如果ViewPager中填充Fragment时,用FragmentStatePagerAdapter,它是PagerAdapter的一个子类。
创建adapter对象时需要传入FragmentManager,可以用getSupportFragmentManager() 获取,它向下兼容。
问2.1:FragmentStatePagerAdapter与FragmentPagerAdapter的区别?
解析:数据量比较小时用FragmentPagerAdapter;
数据量大时用FragmentStatePagerAdapter,它会保存Fragment的状态(推荐用这个)
问3:自定义控件要实现哪些方式?
解析:如自定义ViewGroup,需实现主要的两个方法:
① onMeasure:测量自己的宽和高,及测量子View的宽和高
② onLayout:设置子View的位置
onMeasure:根据子View的布局文件,为子View设置测量模式和测量值。
测量=测量模式 + 测量值 ;
测量模式:3种 --->EXACTLY(很精确的):100dp, match_parent
AT_MOST(根据子View情况而定):wrap_content
UNSPCIDIED(子View想要多大就多大):很少见
问4:自定义控件时,有3个构造函数,分别什么时候调用?
public GamePintuLayout(Context context) {}
public GamePintuLayout(Context context, AttributeSet attrs) {}
public GamePintuLayout(Context context, AttributeSet attrs, int defStyleAttr) {}
解析:当new这个自定义控件,只传入context时,调用第一个;
当在xml布局中加入这个自定义控件时,一般调用第二个;
第三个一般系统不会调用,要在代码中显示的调用。
5. fragment生命周期: 与Activity生命周期对应关系:
created -- >onAttach(),onCreate(),onCreateView(),onActivityCreated().
started -- > onStart();
resumed -- > onResume();
paused -- > onPause();
stopped -- > onStop();
destroyed -- > onDestroyView(),onDestroy(),onDetach().
oncreateView() 想当于 setcontentview(xml);
问6:渐变动画跟属性动画的区别?
解析:在Android 3.0中,新引入了除补间动画Tween Animation、帧动画Frame Animation以外的第三种动画,属性动画Property Animation就是ValueAnimator类.特点:ValueAnimator通过改变对象的属性值来实现界面的改变,而其他动画,只是界面显示上的改变,动画结束后,你会发现,即使view已经运动到别的位置,但click事件还是在原来的地方,ValueAnimator不会有这个问题。
ValueAnimator有两个子类,一个是TimeAnimator,一个是ObjectAnimator。
TimeAnimator在api 16才引入,它并不能直接实现动画效果,而是在TimeListener里返回动画持续的时间,与上次调用的间隔时间,要怎么改变view,需要自己操作。
ObjectAnimator可以直接改变对象的属性值,比如,我们可以通过改变ProgressBar的progress属性,实现进度的改变.
摘自: Android开发:使用ValueAnimator动画
使用方法查看鸿洋的: Android 属性动画 源码解析 深入了解其内部实现
问7:Fragment有哪些API?哪个会销毁视图,哪个会销毁实例,哪个仅仅只是隐藏?
解析:
1.常用的3个类:Fragment--定义Fragment ;FragmentManager --用于在Activity中操作Fragment; FragmentTransaction -- 事务,保证一些列Fragment操作的原子性
2. 获取FragmentManage
v4中,getSupportFragmentManager
3. FragmentTransaction的方法
① benginTransatcion
FragmentTransaction transaction = fm.benginTransatcion();//开启一个事务
② transaction.add() 往Activity中添加一个Fragment
③ transaction.remove()
从Activity中移除一个Fragment,如果被移除的Fragment没有添加到回退栈(BackStack),这个Fragment实例将会被销毁。
④ transaction.replace()
使用另一个Fragment替换当前的,实际上就是remove()然后add()的合体~
⑤ transaction.hide()
隐藏当前的Fragment,仅仅是设为不可见,并不会销毁,对应的操作是:transaction.show()
⑥ detach()
会将view从UI中移除,和remove()不同,此时fragment的状态依然由FragmentManager维护。
⑦ attach() 重建view视图,附加到UI上并显示。
⑧ transatcion.commit() //提交一个事务
比如:我在FragmentA中的EditText填了一些数据,当切换到FragmentB时,如果希望会到A还能看到数据,则适合你的就是hide和show;再比如:我不希望保留用户操作,你可以使用remove(),然后add();或者使用replace()这个和remove,add是相同的效果。remove和detach有一点细微的区别,remove会销毁整个Fragment实例,而detach则只是销毁其视图结构,实例并不会被销毁。
详情点这: Android Fragment 真正的完全解析(上)
8. SparseArray、ContentValues、Bundle
解析: SparseArray 是int为key,content为Object类型的Map,但是它比HashMap效率要高。
ContentValues的key是String类型,content是基本类型(一般在数据库中使用)。
Bundle(用于两个activity之间通讯) 也是key -value的形式。
9. 使用属性动画Animator
1) ObjectAnimator
① ObjectAnimator.ofFloat(imageView,"rotation",0,360F).setDuration(1000).start();
只要有set,get方法的属性都可以操作,如translationX,X,scaleX等.
② 多个动画执行时,其它是个异步的过程,并不是一个执行完后再执行另外的。但Google提供了更多的方法:
PropertyValuesHolder p1=PropertyValuesHolder.ofFloat("rotation",0,360F);
PropertyValuesHolder p2=PropertyValuesHolder.ofFloat("translationX",0,200F);
PropertyValuesHolder p3=PropertyValuesHolder.ofFloat("scaleX",0,2F);
ObjectAnimator.ofPropertyValuesHolder(imageView,p1,p2,p3).setDuration(1000).start();
这样就实现了多个动画同时执行。它的优点是进行了优化,效率更高。
③ 多个动画有顺序的执行
ObjectAnimator anim1=ObjectAnimator.ofFloat(one,"rotation",0,360F);
ObjectAnimator anim2=ObjectAnimator.ofFloat(one,"translationX",0,200F);
ObjectAnimator anim3=ObjectAnimator.ofFloat(one,"scaleX",0,3F);
AnimatorSet set=new AnimatorSet();
// set.playTogether(anim1,anim2,anim3); //同时
// set.playSequentially(anim1,anim2,anim3); //顺序
set.play(anim2).with(anim3); //多组合
set.play(anim1).after(anim2);
set.setDuration(1000).start();
④ 动画监听
ObjectAnimator anim1=ObjectAnimator.ofFloat(one,"alpha",0,1F);
anim1.addListener(new AnimatorListenerAdapter(){});
使用AnimatorListenerAdapter可以只实现其中的某些方法,若使用AnimatorListener则必须实现4个方法。
2)ValueAnimator 数值发生器
ValueAnimator并不会操作任何属性,也不会启动任何动画,它只是给出动画该怎么变化的值。
ObjectAnimator是ValueAnimator的子类。
① ValueAnimator 的使用
ValueAnimator animator = ValueAnimator.ofFloat(0, 100F);
animator.setDuration(1000).start();
animator.addUpdateListener(new AnimatorUpdateListener()
{
@Override
public void onAnimationUpdate(ValueAnimator animation)
{
mBlueBall.setTranslationY((Float) animation.getAnimatedValue());
}
});
ValueAnimator只计算出变化的值,在Listener中拿到值,由其它来操作这个值。
② TypeEvaluator 值计算器
ValueAnimator valueAnimator = new ValueAnimator();
valueAnimator.setEvaluator(new TypeEvaluator<PointF>(){
@Override
public PointF evaluate(float fraction, PointF startValue,PointF endValue)
{
// x方向200px/s ,则y方向0.5 * 10 * t
PointF point = new PointF();
point.x = 200 * fraction * 3;
point.y = 0.5f * 200 * (fraction * 3) * (fraction * 3);
return point;
}
});
/***** 自定义了值计算器,使用了泛型PointF,自制定计算规则,fraction是0~1的计算因子
*****/
valueAnimator.setDuration(1000).start();
valueAnimator.addUpdateListener(new AnimatorUpdateListener()
{
@Override
public void onAnimationUpdate(ValueAnimator animation)
{
PointF point = (PointF) animation.getAnimatedValue();
mBlueBall.setX(point.x);
mBlueBall.setY(point.y);
}
});
10. 主题:actionbar背景色:<item name="android:colorPrimary">
状态栏背景色:<item name="android:colorPrimaryDark">
控件颜色(光标等):<item name="android:colorAccent">