Fragment依赖于Activity,不能独立存在。因此我们需要将Fragment添加至Activity中。添加Fragment的方式有两种,动态添加和静态添加。由于动态添加可以在Activity中添加不同的Fragment,更加灵活,因此我们选用动态添加的方式实现Fragment。碎片添加主要通过以下几个步骤实现:
- 在onCreate()方法中通过Intent获取传入的新闻标题和内容。
String newsTitle = getIntent().getStringExtra("news_title"); String newsContent = getIntent().getStringExtra("news_content");
- 创建待添加的碎片实例。
NewsContentFragment newsContentFragment;
- 获取FragmentManager,在活动中可以直接调用getSupportFragmentManager()方法得到。其中news_content_fragment为fragment布局。然后调用findFragmentById()方法得到NewsContentFragment的实例。
newsContentFragment = (NewsContentFragment) getSupportFragmentManager().findFra gmentById(R.id.news_content_fragment);
- 调用refresh()方法,并将新闻的标题和内容传入,显示数据。
newsContentFragment.refresh(newsTitle,newsContent);
- Fragment可实现在自适应平板大屏幕和手机小屏幕两种不同的屏幕,而要实现上述效果需在onCreate方法红判断应调用双页界面还是单页界面。如果能找到news_content_layout布局,则为双页模式,如果不能找到,则为单页模式。
@Override public void onActivityCreated(@Nullable Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); if (getActivity().findViewById(R.id.news_content_layout)!= null){ // 可以找到 news_content_layout 布局时,为双页模式 isTowPane = true; }else { // 找不到 news_content_layout 布局时,为单页模式 isTowPane = false; } }
- 在NewsTitleFragment中新建一个内部类NewsAdapter来作为RecyclerView的适配器,把适配器写成内部类是为了直接访问NewsTitleFragment的变量。
class NewsAdapter extends RecyclerView.Adapter<NewsAdapter.ViewHolder>{}
- 建立两个activity_main布局文件,一个实现双页界面,一个实现单页界面,实现双页界面的文件中包含news_content_layout布局,实现单页界面中的文件中不包含。在res文件夹下面新建layout-sw600dp文件夹系统就在屏幕分辨率大于600的时候自动选择该文件夹下的文件,在文件架下面新建activity_main文件,这个文件即为双页界面的文件布局。
- 双页模式下我们同时引入了两个碎片,并将新闻内容的碎片放在了一个FrameLayout布局下,而这个布局的id正是news_content_layout,双页模式下,系统会自动选择该布局。
<fragment android:id="@+id/news_title_fragment" android:name="com.example.myapplication.NewsTitleFragment" android:layout_width="0dp" android:layout_height="match_parent" android:layout_weight="1" /> <FrameLayout android:id="@+id/news_content_layout" android:layout_width="0dp" android:layout_height="match_parent" android:layout_weight="3"> <fragment android:id="@+id/news_content_fragment" android:name="com.example.myapplication.NewsContentFragment" android:layout_width="match_parent" android:layout_height="match_parent" /> </FrameLayout>
- 最终单页效果和双页显示效果如下所示: