标签:官方 acitivity 手势滑动 support https oba hiera top 标题
Fragment
官网文档:https://developer.android.google.cn/guide/components/fragments
在手机上,Activity作为用户和应用交互的界面。如果界面上的View较多较复杂时,Activity会较复杂。Fragment提供了一种解决方案,把view放到几个Fragment中,然后再由这些Fragment拼成一个完整的Activity。
如果多个界面中有相同的部分,可以将重复部分放在fragment中,然后在多个activity中使用该fragment,达到风格统一,代码重用的目的。
Fragment的应用场景:
注意:需要重写onCreateView方法; 推荐使用support-v4包中的Fragment类。
public class LeftFragment extends Fragment {
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View view=inflater.inflate(R.layout.left_fragment,container,false);
return view;
}
}
这两步完成了一个Fragment,其与Activity非常类似,同样是写好对应的layout,然后在生命周期方法中加载layout。
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools">
<fragment
android:id="@+id/left_fragment"
android:name="com.ncst.coursecode.LeftFragment"
android:layout_width="wrap_content"
android:layout_height="match_parent"/>
</LinearLayout>
注意:必须显式指明id和name属性。name属性即为碎片的类名。
另外,包含碎片的Activity需要继承自FragmentActivity。而我们默认使用的AppCompatActivity正是继承自FragmentActivity。
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools">
<FrameLayout
android:id="@+id/fragment_container"
android:layout_width=" match_parent "
android:layout_height="match_parent"/>
</LinearLayout>
Fragment fragment=new RightFragment();
FragmentManager manager=getSupportFragmentManager();
FragmentTransaction transaction=manager.beginTransaction();
transaction.add(R.id. fragment_container,fragment);
transaction.commit();
另外两个方法:replace(R.id. fragment_container,fragment);移除容器中已有的所有fragment,并添加本fragement。remove(R.id. fragment_container,fragment);移除容器中的该fragment。
注意:在XML中静态添加的fragment不能通过上述两个方法移除。
addToBackStack()将事务添加到返回栈,该返回栈由Activity管理,以便用户能够通过按返回按钮撤消事务并回退到上一片段。
在活动中获取碎片实例:
getFragmentManager().findFragmentById(R.id.right_fragment);
在碎片中获取和当前碎片相关联的活动实例:
getActivity();
在一个碎片中获取和当前碎片相关联的活动中的另外一个碎片:
getActivity().getFragmentManager().findFragmentById(R.id.left_fragment);
片段必须始终嵌入在 Activity 中,其生命周期直接受宿主 Activity 生命周期的影响。例如,当 Activity 暂停时,其中的所有片段也会暂停;当 Activity 被销毁时,所有片段也会被销毁。
图片:
分析:页面分为两部分:底部(RadioGroup),上面部分(放置Fragment)
ViewPager功能:通过手势滑动可以完成View的切换,一般是用来做APP 的引导页或者实现图片轮播, ViewPager在:android.support.v4.view.ViewPager。
ViewPager就是一个简单的页面切换组件,我们可以往里面填充多个View,然后我们可以左右滑动,从而切换不同的View,和前面学的ListView,RecyclerView一样,我们也需要一个Adapter (适配器)将我们的View填充到ViewPager,ViewPager有一个特定的Adapter—— PagerAdapter!另外,Google官方是建议我们使用Fragment来填充ViewPager的,这样可以更加方便的生成每个Page,以及管理每个Page的生命周期!给我们提供了两个Fragment 专用的Adapter:FragmentPageAdapter和FragmentStatePagerAdapter 。
instantiateItem(ViewGroup, int):向父布局添加View
destroyItem(ViewGroup, int, Object):移除一个给定位置的View。
getCount():获得viewpager中有多少个view
isViewFromObject(View, Object):一般的实现:return view == object;
一个典型的PagerAdapter类:
public class MyPagerAdapter extends PagerAdapter {
List<View> viewList;
public MyPagerAdapter(List<View> viewList) {
this.viewList = viewList;
}
public int getCount() {
return viewList.size();
}
public boolean isViewFromObject(View view, Object o) {
return view==o;
}
public Object instantiateItem(ViewGroup container, int position) {
container.addView(viewList.get(position));
return viewList.get(position);
}
public void destroyItem(ViewGroup container, int position, Object object) {
container.removeView(viewList.get(position));
}
}
<android.support.v4.view.ViewPager
android:id="@+id/view_pager"
android:layout_width="match_parent"
android:layout_height="match_parent">
</android.support.v4.view.ViewPager>
另外,PagerTabStrip 作为ViewPager的交互指针。只需在XML文档中作为ViewPager的子项即可。并且在PagerAdapter需要重写getPageTitle()方法,用于获取指定页面的标题。
PagerTitleStrip 与PagerTabStrip 类似,区别是不能交互。
<android.support.v4.view.ViewPager
android:id="@+id/view_pager"
android:layout_width="match_parent"
android:layout_height="match_parent">
<android.support.v4.view.PagerTabStrip
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="top" />
</android.support.v4.view.ViewPager>
官方文档:https://developer.android.google.cn/reference/android/support/v4/view/PagerAdapter
是PagerAdapter的实现,每个页面是一个Fragment。
This version of the pager is best for use when there are a handful of typically more static fragments to be paged through, such as a set of tabs. The fragment of each page the user visits will be kept in memory, though its view hierarchy may be destroyed when not visible. This can result in using a significant amount of memory since fragment instances can hold on to an arbitrary amount of state. For larger sets of pages, consider FragmentStatePagerAdapter
.
FragmentPagerAdapter适合少量固定数量的页面情况。页面多且不固定时会耗费内存,这时应考虑使用FragmentStatePagerAdapter。
实现FragmentPagerAdapter时只需重写:getItem(int)
和getCount()
。
class MyAdapter extends FragmentPagerAdapter {
public MyAdapter(FragmentManager fm) {
super(fm);
}
public Fragment getItem(int i) {
return MyFragment.newInstance(i);
}
public int getCount() {
return NUM_ITEMS;
}
}
Android提供了android.support.design.widget.TabLayout控件,用来实现顶部标题的左右滑动功能。
<android.support.design.widget.TabLayout
android:id="@+id/tab_layout"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
TabLayout tabLayout = (TabLayout) findViewById(R.id.tab_layout);
tabLayout.setupWithViewPager(viewPager);
官方文档:
https://developer.android.google.cn/reference/android/support/v4/app/FragmentPagerAdapter.html
标签:官方 acitivity 手势滑动 support https oba hiera top 标题
原文地址:https://www.cnblogs.com/duhuamei/p/11872913.html