Android 常规面试题整理(内含参考答案)

Android 常规面试题整理(内含参考答案),第1张

Android 常规面试题整理(内含参考答案)

如果相关的Fragment没有被加载过: NF: setUserVisibleHint(false)【用户不可见】 > onAttach > onCreate > setUserVisibleHint(true)【用户可见】 > onCreateView > onViewCreated > onActivityCreated > onStart > onResume

OF跟NF相邻: setUserVisibleHint(false) > onAttach > onCreate > onCreateView > onViewCreated > onActivityCreated > onStart > onResume

如果相关的Fragment已经被加载过: NF跟PF相邻 :setUserVisibleHint(true)

NF跟PF不相邻:setUserVisibleHint(true) > onCreateView > onViewCreated > onActivityCreated > onStart > onResume

PF跟NF相邻 :setUserVisibleHint(false)

PF跟NF不相邻:setUserVisibleHint(false) > onPause > onStop > onDestroyView

OF跟PF相邻:onPause > onStop > onDestroyView

OF跟NF相邻:onCreateView > onViewCreated > onActivityCreated > onStart > onResume

OF夹在PF和NF中间:不调用任何生命周期方法

NF跟PF相邻 :setUserVisibleHint(true)

NF跟PF不相邻:setUserVisibleHint(true) > onCreateView > onViewCreated > onActivityCreated > onStart > onResume

PF跟NF相邻 :setUserVisibleHint(false)

PF跟NF不相邻:setUserVisibleHint(false) > onPause > onStop > onDestroyView

OF跟PF相邻:onPause > onStop > onDestroyView

OF跟NF相邻:onCreateView > onViewCreated > onActivityCreated > onStart > onResume

OF夹在PF和NF中间:不调用任何生命周期方法

如果重写了FragmentPagerAdapter的DestroyItem方法,并且相关的Fragment已经加载过: 相互切换时只会调用setUserVisibleHint

Fragment进入了运行状态: Fragment在进入运行状态时,以下四个生命周期会随它所属的Activity一起被调用:

onPause() —> onStop() —> onStart() —> onResume()

关于Fragment的onActivityResult方法: 使用Fragment的startActivity方法时,FragmentActivity的onActivityResult方法会回调相应的Fragment的onActivityResult方法,所以在重写FragmentActivity的onActivityResult方法时,注意调用super.onActivityResult。

如何实现Fragment的滑动?

参考答案:

将Fragment与viewpager绑定,通过viewpager中的touch事件,会进行move事件的滑动处理。

Fragment布局

android:orientation=“vertical”

android:layout_width=“match_parent”

android:layout_height=“match_parent”

android:background="@android:color/holo_red_light">

android:layout_width=“match_parent”

android:layout_height=“match_parent”

android:text=“Fragment One” />

android:orientation=“vertical”

android:layout_width=“match_parent”

android:layout_height=“match_parent”

android:background="@android:color/holo_red_light">

android:layout_width=“match_parent”

android:layout_height=“match_parent”

android:text=“Fragment Two” />

Fragment代码:

public class FragmentOne extends Fragment {

@Nullable

@Override

public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, Bundle savedInstanceState) {

return inflater.inflate(R.layout.fragment_one, container, false);

}

}

public class FragmentTwo extends Fragment {

@Nullable

@Override

public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, Bundle savedInstanceState) {

return inflater.inflate(R.layout.fragment_Two, container, false);

}

}

viewpager布局:

xmlns:tools=“http://schemas.android.com/tools”

android:layout_width=“match_parent”

android:layout_height=“match_parent”

tools:context=“com.example.spreadtrumshitaoli.fragmentscroll.MainActivity”>

android:id="@+id/view_pager"

android:layout_height=“match_parent”

android:layout_width=“match_parent”/>

MainActivity代码:

public class MainActivity extends AppCompatActivity {

private FragmentOne fragmentOne;

private FragmentTwo fragmentTwo;

private ViewPager viewPager;

private ArrayList mFragmentList = new ArrayList ();

private FragmentPagerAdapter fragmentPagerAdapter;

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

init();

}

private void init() {

viewPager = (ViewPager) findViewById(R.id.view_pager);

fragmentOne = new FragmentOne();

fragmentTwo = new FragmentTwo();

mFragmentList.add(fragmentOne);

mFragmentList.add(fragmentTwo);

//将adapter和fragment绑定在一起。

fragmentPagerAdapter = new FragmentPagerAdapter(getSupportFragmentManager()) {

@Override

public Fragment getItem(int i) {

return mFragmentList != null ? mFragmentList.get(i) : null;

}

@Override

public int getCount() {

return mFragmentList != null ? mFragmentList.size() : 0;

}

};

viewPager.setAdapter(fragmentPagerAdapter);

viewPager.setonPageChangeListener(new ViewPager.onPageChangeListener() {

@Override

public void onPageScrolled(int i, float v, int i1) {

}

@Override

public void onPageSelected(int i) {

//TODO:

}

@Override

public void onPageScrollStateChanged(int i) {

}

});

}

}

在这段代码中,我们

首先fragment以及viewpager都实例化;

再将fragment添加到泛型arraylist里;

最后将带有fragment的arraylist和adapter绑定。

Android中的动画有哪些?

参考答案:

逐帧动画(frame Animation) 加载一系列Drawable资源来创建动画,简单来说就是播放一系列的图片来实现动画效果,可以自定义每张图片的持续时间

补间动画(Tween Animation) Tween可以对View对象实现一系列动画效果,比如平移,缩放,旋转,透明度等。但是它并不会改变View属性的值,只是改变了View的绘制的位置,比如,一个按钮在动画过后,不在原来的位置,但是触发点击事件的仍然是原来的坐标。

属性动画(Property Animation) 动画的对象除了传统的View对象,还可以是Object对象,动画结束后,Object对象的属性值被实实在在的改变了

设备横竖屏切换的时候,生面周期的变化(这个偶尔会问)

参考答案:

不设置Activity的android:configChanges时,切屏会重新调用各个生命周期,切横屏时会执行一次,切竖屏时会执行两次

设置Activity的android:configChanges=”orientation”时,切屏还是会重新调用各个生命周期,切横、竖屏时只会执行一次

设置Activity的android:configChanges=”orientation|keyboardHidden”时,切屏不会重新调用各个生命周期,只会执行onConfigurationChanged方法

RecyclerView和ListView的区别(这个是必问的)

参考答案:

RecyclerView可以完成ListView,GridView的效果,还可以完成瀑布流的效果。同时还可以设置列表的滚动方向(垂直或者水平); RecyclerView中view的复用不需要开发者自己写代码,系统已经帮封装完成了。 RecyclerView可以进行局部刷新。 RecyclerView提供了API来实现item的动画效果。

在性能上: 如果需要频繁的刷新数据,需要添加动画,则RecyclerView有较大的优势。 如果只是作为列表展示,则两者区别并不是很大。

Android异步消息处理机制(这个也会经常问到)

参考答案:

异步消息处理机制主要是用来解决子线程更新UI的问题

主要有四个部分:

①. Message (消息) 在线程之间传递,可在内部携带少量信息,用于不同线程之间交换数据 可以使用what、arg1、arg2字段携带整型数据 obj字段携带Object对象

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zaji/5693000.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-17
下一篇 2022-12-17

发表评论

登录后才能评论

评论列表(0条)

保存