•准备工作
新建一个项目,命名为 FragmentBestProject,并选择 Empty Activity;
并将项目的模式结构改为 Project 模式;
•进入主题
News.java
public class News { private String title; private String content; public String getTitle() { return title; } public void setTitle(String title) { this.title = title; } public String getContent() { return content; } public void setContent(String content) { this.content = content; } }接着新建布局文件 news_content_frag.xml,用于作为新闻内容的布局;
news_content_frag.xml
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent"> <LinearLayout android:id="@+id/visibility_layout" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" android:visibility="invisible"> <TextView android:id="@+id/news_title" android:layout_width="match_parent" android:layout_height="wrap_content" android:gravity="center" android:padding="10dp" android:textSize="20sp" /> <View android:layout_width="match_parent" android:layout_height="1dp" android:background="@color/black"/> <TextView android:id="@+id/news_content" android:layout_width="match_parent" android:layout_height="0dp" android:layout_weight="1" android:padding="15dp" android:textSize="18sp" /> </LinearLayout> <View android:layout_width="1dp" android:layout_height="match_parent" android:layout_alignParentLeft="true" android:background="@color/black" /> </RelativeLayout>新闻的内容部分主要可以分为两个部分:
下面提供了双页模式和单页模式的布局示意图,双页和单页模式下文会讲,莫着急;
双页模式示意图:
单页模式示意图:
在新建一个 NewsContentFragment 类,继承自 Fragmet;
NewsContentFragment.java
public class NewsContentFragment extends Fragment { private View view; @Nullable @Override public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { view = inflater.inflate(R.layout.news_content_frag,container,false); return view; } public void refresh(String newsTitle,String newsContent){ View visibilityLayout = view.findViewById(R.id.visibility_layout); visibilityLayout.setVisibility(View.VISIBLE); TextView newsTitleText = view.findViewById(R.id.news_title); TextView newsContentText = view.findViewById(R.id.news_content); newsTitleText.setText(newsTitle);//刷新新闻的标题 newsContentText.setText(newsContent);//刷新新闻的内容 } }首先在 onCreateView() 方法里加载了我们刚刚创建的 news_content_frag 布局;
这里通过 view.findViewById() 方法分别获取新闻的标题和内容控件,并通过 setText() 将传递的参数设置上;
到目前为止,我们就把新闻内容的碎片和布局都创建好了;
但上述布局都是在双页模式中使用的,如果想在单页模式中启动的话,我们还需要在创建一个活动;
新建一个 Empty Activity,命名为 NewsContentActivity,并将布局名指定为 news_content;
news_content.xml
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent"> <fragment android:id="@+id/news_content_fragment" android:name="com.example.fragmentbestproject.NewsContentFragment" android:layout_width="match_parent" android:layout_height="match_parent"/> </LinearLayout>此处代码充分发挥了代码的复用性,直接在布局中通过 android:name 属性引入 NewsContentFragment;
这样也就相当于把 news_content_frag 布局的内容自动添加进来;
接下来修改 NewsContentActivity.java 中的代码;
NewsContentActivity.java
public class NewsContentActivity extends AppCompatActivity { public static void actionStart(Context context, String newsTitle,String newsContent){ Intent intent = new Intent(context,NewsContentActivity.class); intent.putExtra("news_title",newsTitle); intent.putExtra("news_content",newsContent); context.startActivity(intent); } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.news_content); //获取传入的新闻标题 String newsTitle = getIntent().getStringExtra("news_title"); //获取传入的新闻内容 String newsContent = getIntent().getStringExtra("news_content"); //获取news_content中的fragment NewsContentFragment newsContentFrgment = (NewsContentFragment) getSupportFragmentManager() .findFragmentById(R.id.news_content_fragment); newsContentFrgment.refresh(newsTitle,newsContent);//刷新NewsContentFragment界面 } }可以看到,在 onCreate() 方法中,我们通过 Intent 获取到了传入的新闻标题和内容;
然后调用 FragmentManager 的 findFragmentById() 方法得到了 NewsContentFragment 实例;