Fragment实现的界面布局
创始人
2025-05-30 03:29:20
0

Fragment实现的界面布局

1.简介

1.介绍

其实就算是一种组件。随可以添加,可以删除,单页应用。有着自己的生命周期,可以对应activity不同的生命周期位置。

2.图示

 

2.好处

 

3.生命周期

特别关注的是和activity生命周期之间的关系

注意和actibity的生命周期。actibity影响着fragment的生命周期的信息。自己也对自己也是有影响的。

 

2.生命周期的过程。和actibvity生命周期之间的关系。

想象成vue中的子组件中的生命周期就是可以的。

activity的created对应着fragment的多个方法。连接,创建,视图绑定,activity创建。

开始。开始。

失去焦点。失去焦点。

暂停。暂停。

停止,停止

销毁。销毁视图,销毁,取消连接

其实就是开始创建和销毁的时候区别比较大。创建和销毁算是前后对应,和IO流的感觉是类似的,有创建就得有销毁的过程。

e9dc1d5b59409ffcb6d3e5d16640d5d3.png

4.Fragment的创建

1.需要创建类

  • app。兼容的版本4.0以上的。
  • v4:可以兼容更老的

2.创建

创建的过程中是需要开启事务操作的。v4个app获取的manager的方法是有区别的。

需要开启事务和提交对应的事务。

  • 实例
  • factory
  • 开启事务
  • 添加
  • 提交事务

 

5.实例1实现基本的切换

  • 目录结构

  • 主布局文件中用于关键替换的代码

主actibvity可以使用findViewById找到对应的控件的信息

public class MainActivity extends AppCompatActivity {    Button btn=null;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        btn=findViewById(R.id.left_btn);
       btn.setOnClickListener(new View.OnClickListener() {@Override
           public void onClick(View view) {//创建子定义的fragment对象
               OtherFragment fragment=new OtherFragment();//创建管理者对象,只有v4的包下交这个名字
               FragmentManager fragmentManager=getSupportFragmentManager();
               FragmentTransaction transaction=fragmentManager.beginTransaction();//删除指定的fragment
               Fragment right=fragmentManager.findFragmentById(R.id.right_f);
               transaction.remove(right);
               transaction.replace(R.id.right_f,fragment);//提交事务
               transaction.commit();}});}
}

  • 主布局文件的相关信息



  • fragment的中用于绑定视图的代码

public class LeftFragemt extends Fragment {    public LeftFragemt() {// Required empty public constructor}//本质返回的是view的对象/*
        * 就是将fragment的布局添加到activity的布局上去
        * */@Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {return inflater.inflate(R.layout.fragment_left_fragemt, container, false);}}

6.Fragment和activity之间的通信

1.原先的时候并没有直接的方法进行通信

建议采用的是动态的方式。不推荐使用匿名的内部类的方式。我觉得可以采用getActivity的方式进行。

2.activity中可以获取activity中的fragment的实例对象

findFragmentById可以找到Fragment的实例。

3.反之如何进行获取 getActivity进行获取

7.新闻列表案例

7.1案例要求

7.2案例分析

1.案例要求

2c773b4296e6f2e64e03d6c4f8b0a7ec.png

2.案例分析

  • 一个activity
  • 两个fragment
  • 第一个fragment中使用的是listview进行展示
  • 第二个fragment中使用的是textView

图1 新闻列表案例

3.目录

目录中的结构是比较重要的,结合图1 新闻列表案例进行分析

4.主布局文件代码

/*
* 主界面
* 设置要进行替换的两个fragment
* */
public class MainActivity extends AppCompatActivity {//    设置标题信息
    private String titlex[]={
        "标题1",
        "标题2",
        "标题3",};
//    设置标题对应的详细信息的内容
    private String settingText[][]={
            {
                    "标题1","标题1内容"
            },
        {
                "标题2","标题2内容"
        },
        {
                "标题3","标题3内容"
        }
    };    //获取标题的方法
    public String[] getTitlex() {
        return titlex;
    }
    //获取标题内容
    public String[][] getSettingText() {
        return settingText;
    }//    生命周期
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //创建Fragment
        //设置标题的Fragment
        setTitleFragment titleFragment=new setTitleFragment();
        //设置内容的Fragment
        setContentFragment contentFragment=new setContentFragment();
        //获取管理者对象
        FragmentManager manager=getSupportFragmentManager();        //获取事务对象
        FragmentTransaction transaction=manager.beginTransaction();
        //替换原先布局中的内容的信息
        //标题显示区域采用新的gragment进行显示
        transaction.replace(R.id.settitle,titleFragment);
        //内容显示区域采用新的gragment进行显示
        transaction.replace(R.id.setcontent,contentFragment);
        //提交事务对象
        transaction.commit();    }//    set方法
    public void setSettingText(String[][] settingText) {
        this.settingText = settingText;
    }
    public void setTitle(String[] titlex) {
        this.titlex = titlex;
    }}

主布局文件的布局文件




    
    
    
    
        

主布局文件的效果图

  • 作用就是分了两个区域

199be381042dca961f006cc89bdc1a85.png

图3 主布局文件

5.设置左侧的title的列表的信息

import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.BaseAdapter;
import android.widget.ListView;
import android.widget.TextView;/*
* 用于设置左侧的listview的内容的
* */
public class setTitleFragment extends Fragment {    //相关控件的定义
    private View view;//视图
    private String [] title;//标题
    private String[][]contents;//标题内容
    private ListView listView;//显示标题的列表项    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    }    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {        view=inflater.inflate(R.layout.title_layout, container, false);
        //获取activity对象的信息
        MainActivity activity=(MainActivity)getActivity();
        //获取activity中的标题
        title= activity.getTitlex();
        //获取activity中的标题内容
        contents=  activity.getSettingText();        //判断view
        if (view!=null){
            init();        }
        return  view;
    }
    //设置ListView的方法
    private void init(){
        //此时的view就是对应的fragment中的界面的布局的文件
        listView=view.findViewById(R.id.titlelist);
        if (title!=null){
            //采用的是baseAdapterd的方式进行设置数据
            listView.setAdapter(new MyAdapter());
        }
        //listView中添加事件监听的方法
        listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView adapterView, View view, int i, long l) {
                //通过activity实例获取另一个Fragment对象
                setContentFragment contentFragment=(setContentFragment)((MainActivity)getActivity()).getSupportFragmentManager().findFragmentById(R.id.setcontent);
              //调用自定义的setText设置当前要显示的内容
             /*   System.out.println("此时要显示的内容");
                System.out.println(contents[i][0]);
                System.out.println(contents[i][1]);*/
                System.out.println("此时要显示的内容");
                contentFragment.setTextx(contents[i]);
            }
        });    }//==================采用自定义的类设置listView中要显示的数据的信息======================
class MyAdapter extends BaseAdapter{
        @Override
        public int getCount() {
            return title.length;
        }        @Override
        public Object getItem(int i) {
            return title[i];
        }        @Override
        public long getItemId(int i) {
            return i;
        }        @Override
        public View getView(int i, View view, ViewGroup viewGroup) {
            view=View.inflate(getActivity(),R.layout.title_item_layout,null);
            TextView txt=view.findViewById(R.id.titles);
            txt.setText(title[i]);
            return view;
        }
    }
}

布局文件代码


    
        

图4 展示左侧的标题的信息

子布局文件代码


    
    

6.展示标题的内容,右侧

import android.content.Context;
import android.os.Bundle;
import android.os.SystemClock;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;/*
* 显示右侧的每个标题的具体的内容的信息的
* */
public class setContentFragment extends Fragment {
    TextView text1=null;
    TextView text2=null;
    private View view;    @Override
    public void onAttach(Context context) {
        super.onAttach(context);
    }    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
       //获取布局文件
        view=inflater.inflate(R.layout.content_layout, container, false);
      if (view!=null){
          init();
      }
        //获取activity中设置的文字
        String temp[]=((MainActivity)getActivity()).getSettingText()[0];
        setTextx(temp);
        return view;
    }    //初始化右侧要显示的内容的信息
    private void init(){
        text1=view.findViewById(R.id.show_title);
        text2=view.findViewById(R.id.show_content);
    }
    //更新右侧标题对应的详细内容的界面的更新
    public void setTextx(String [] text){
      text1.setText(text[0]);
      text2.setText(text[1]);
    }
}

布局文件代码

        

图6 显示新闻标题以及内容的相关的信息

7.效果图

087dabd7c201ed77046a65ae0fc510ad.gif

图7 采用Fragment实现的新闻列表项目

相关内容

热门资讯

潍坊市居家和社区养老服务条例 潍坊市人民代表大会常务委员会公告 (第108号) 《潍坊市居家和社区养老服务条例》已于2025年10...
“欧洲最严格”的移民政策!英国... (央视财经《第一时间》)当地时间20日,英国启动50年来最大移民制度改革。非法移民与依赖社会福利的入...
西安旅游股份有限公司关于子公司... 本公司董事会及全体董事保证本公告内容不存在任何虚假记载、误导性陈述或者重大遗漏,并对其内容的真实性、...
土耳其驻华大使坚定重申:一个中... 中国日报网11月21日电(记者 潘一侨 郑朱翎 )近日土耳其驻华大使于纳尔在接受中国日报专访时,就日...
18项税收政策在海南自贸港落地... 中新网海口11月22日电 (记者 王子谦)特殊的税收制度安排是海南自贸港政策制度体系的保障。自海南自...
上海男子醉酒骑车被树枝绊倒致伤... 此前,上海一男子在小区内醉酒骑车,被树枝绊倒致八级伤残,案件近日迎来新进展。11月22日,南都N视频...
对接全球高标准经贸规则 海南自... 中新网海口11月22日电 (记者 王子谦)作为中国对外开放的最高形态,海南自贸港正以制度型开放为核心...
律师起诉徐州东站“便捷换乘”不... 近日,律师殷清利向九派新闻反映,其因高铁中转换乘不便,将徐州东站诉至法庭。7月,徐州铁路运输法院出具...
原创 韩... 据参考消息11月21日报道,韩国特别检查组表示,前总统尹锡悦因涉嫌干预海军陆战队员死亡事件的调查而被...