Android--完成新闻界面(单屏幕+双屏)

流程图

 

(1)新建一个项目

(2)添加依赖库

(3)准备News

(4)新建新闻内容布局

(5)新建展示新闻内容的碎片

(6)新建活动布局文件引入之前的碎片布局

(7)修改活动代码

(8)创建用于显示新闻题目列表文件

(9)创建RecycleView布局和其子布局

(10)新建单页和双页布局

(11)新建内部类用作RecycleView适配器

(12)RecycView中填充数据

 

 

 

2News布局

 

 

编写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)新闻内容展示方式有fragmentActivity两种方式,通过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();
}

 

posted on 2019-10-11 13:42  风太烫  阅读(1191)  评论(0编辑  收藏  举报