(1)新建一個項目
(2)添加依賴庫
(3)准備News類
(4)新建新聞內容布局
(5)新建展示新聞內容的碎片
(6)新建活動布局文件引入之前的碎片布局
(7)修改活動代碼
(8)創建用於顯示新聞題目列表文件
(9)創建RecycleView布局和其子布局
(10)新建單頁和雙頁布局
(11)新建內部類用作RecycleView適配器
(12)向RecycView中填充數據
(2)News布局
編寫News的布局文件News_content_layout.xml
(3)編寫News類
public class News {
private String headline;
private String content_top;
private String content_buttom;
private int src;
public String getHeadline(){
return headline;
}
public String getContent_top(){
return content_top;
}
public String getContent_buttom(){
return content_buttom;
}
public int getSrc(){return src;}
public void setHeadline(String headline){
this.headline = headline;
}
public void setContent_buttom(String content_buttom){
this.content_buttom = content_buttom;
}
public void setContent_top(String content_top){
this.content_top = content_top;
}
public void setSrc(int src){this.src = src;}
}
主要包括News標題和內容以及圖片獲取與設置
(4)創建使用News_content_layout.xml布局的碎片類NewsContentFragment
public class NewsContentFragment extends Fragment{
private View view;
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
view = inflater.inflate(R.layout.news_content_layout,container,false);
return view;
}
public void refrech(String News_headline_text,String News_content_top_text,String News_content_bottom_text,int src){
View news_content_fragment = view.findViewById(R.id.invistiable_view);
news_content_fragment.setVisibility(View.VISIBLE);
TextView News_headline = (TextView) view.findViewById(R.id.news_headline);
TextView News_content_top = (TextView) view.findViewById(R.id.news_content_top);
TextView News_content_buttom = (TextView) view.findViewById(R.id.news_content_bottom);
ImageView img = (ImageView) view.findViewById(R.id.news_image);
News_headline.setText(News_headline_text);
News_content_top.setText(News_content_top_text);
News_content_buttom.setText(News_content_bottom_text);
img.setImageResource(src);
}
}
其中方法的作用是載入News的內容布局,和刷新布局中文本數據以及圖像數據的內容。
(5)創建新聞索引欄布局
使用RecycleView布局創建索引欄布局,
並添加子布局文件,以及實現News_item適配器。
(2)創建新聞索引碎片類
這個類的主要作用是加載新聞索引布局,以及在該類實現一個子項的適配器,將內容顯示。
(7)創建一個NewsContentActivity用於展示單屏幕的新聞內容它的布局文件是activity_news_content。通過點擊實踐創建顯示。
public class NewsContentActivity extends AppCompatActivity {
public static void actionStart(Context context,String Headline,String newsContest_top,String newsContest_buttom,int src){
Intent intent = new Intent(context,NewsContentActivity.class);
intent.putExtra("news_headline",Headline);
intent.putExtra("news_Context_top",newsContest_top);
intent.putExtra("news_Context_buttom",newsContest_buttom);
intent.putExtra("src",src+"");
context.startActivity(intent);
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_news_content);
String news_headline = getIntent().getStringExtra("news_headline");
String news_Context_top = getIntent().getStringExtra("news_Context_top");
String news_Context_buttom = getIntent().getStringExtra("news_Context_buttom");
String str = getIntent().getStringExtra("src");
int src=Integer.parseInt(str);
NewsContentFragment newsContentFragment= (NewsContentFragment) getSupportFragmentManager().findFragmentById(R.id.content_activity_fragment);
newsContentFragment.refrech(news_headline,news_Context_top,news_Context_buttom,src);
}
}
所以應該在點擊單頁的目錄子項的時候,在創建新的Activity之前實現數據傳輸。
通過getIntent().getStringExtra()方法獲得數據,使用getSupportFragmentManager().findFragmentById()方法獲得要使用的fragment,並調用刷新函數載入數據。
(8) 創建在res下創建layout-land文件夾並創建雙頁的main_activtiy.xml文件
可以使用LinearLayout把兩個碎片嵌入到main_activity.xml文件。因為要替換右邊的部分,所以需要用FrameLayout來裝右邊的fragment。
<FrameLayout
android:id="@+id/news_content_fragment_framelayout"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="3"
>
<fragment
android:id="@+id/news_content_fragment_main"
android:name="com.example.administrator.fragmentbestp.NewsContentFragment"
android:layout_width="match_parent"
android:layout_height="match_parent"
></fragment>
</FrameLayout>
同理也可以編寫單頁的main_activtity.xml文件
(8)新聞內容展示方式有fragment和Activity兩種方式,通過Mainactivity中是否有用來裝新聞內容的FrameLayout來判斷並且用isTwoPane來記錄。
@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
if (getActivity().findViewById(R.id.news_content_fragment_framelayout)!=null){
isTwoPane =true;
}else {
isTwoPane = false;
}
}
(9)新聞內容展示主要由新聞索引中是否點擊決定
所以在NewsTitleFragment類中編寫的適配器中,對子項目添加監聽器,如果被點擊則創建活動/展示碎片。
public NewsTitleApater.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.news_title_item,parent,false);
final ViewHolder holder = new ViewHolder(view);
view.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
News news = mNewslist.get(holder.getAdapterPosition());
if (isTwoPane) {
NewsContentFragment newsContentFragment = (NewsContentFragment) getFragmentManager().findFragmentById(R.id.news_content_fragment_main);
newsContentFragment.refrech(news.getHeadline(),news.getContent_top(),news.getContent_buttom(),news.getSrc());
}else{
NewsContentActivity.actionStart(getActivity(),news.getHeadline(),news.getContent_top(),news.getContent_buttom(),news.getSrc());
}
}
});
return holder;
}
(10)最后將News信息存到News鏈表里,並填充數據。
public void init_news(){
News news;
for(int i=1;i<6;i++){
news = new News();
news.setHeadline("This is news title"+i);
news.setContent_buttom(getRandomLContent("This is news title"+i));
news.setContent_top("這是圖片"+i);
news.setSrc(imgs[i]);
newslist.add(news);
}
}
private String getRandomLContent(String input){
Random r = new Random();
int l =r.nextInt(10)+1;
StringBuilder builder = new StringBuilder();
for(int i=0;i<l;i++){
builder.append(input);
}
return builder.toString();
}