Fragment组件 | 青训营笔记

143 阅读2分钟

这是我参与「第四届青训营 」笔记创作活动的第1天
Fragment可以看成一个小型的Activity,Fragment可以实现将屏幕分为几块,更方便的进行管理,它更碎片也更加迅速,但Fragment的生命周期受到Activity的影响,需要嵌套进Activity中使用,并不能单独使用。

Fragment的使用

  1. 定义Fragment的xml布局
  2. 自定义Fragment类,实现onCreateView()方法,inflater.inflate()加载布局文件,并返回view。
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
    return inflater.inflate(R.layout.fragment_tab, container, false);
}
  1. Activity调用setContentView()加载布局文件

数据传递and组件获取

  1. Activity获取Fragment组件:getFragmentManager.findFragmentById(R.id.Fragment_xxx)
  2. Activity获取Fragment数据: 在Activity中创建Bundle数据包,用setArguments(Bundle bundle)传给Fragment,Fragment中调用getArguments获得Bundle。
  3. Fragment获取Activity组件: getActivity().findViewById(R.id.list)
  4. Fragment获取Activity数据: 定义一个回调函数:
public interface CallBack{  
    /*定义一个获取信息的方法*/  
    public void getResult(String result);  
}  

调用接口

public void getData(CallBack callBack){  
    /*获取文本框的信息,当然你也可以传其他类型的参数,看需求咯*/  
    String msg = editText.getText().toString();  
    callBack.getResult(msg);  
} 

使用接口回调方法读数据(Activity中)

leftFragment.getData(new CallBack() {  
 @Override  
       public void getResult(String result) {              /*打印信息*/  
            Toast.makeText(MainActivity.this, "-->>" + result, 1).show();  
            }
        }); 

用Fragment+TabLayout+ViewPage实现头部tab滑动

  1. 实现一个顶部的导航栏,首先想到的就是Tablayout,在主要的Activity的xml布局文件中,加入一个TabLayout和一个ViewPage,用TabLayout控制ViewPage中的Fragment跳转。
<com.google.android.material.tabs.TabLayout
    android:id="@+id/tab_layout"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    app:layout_constraintTop_toTopOf="parent"
    app:layout_constraintStart_toStartOf="parent"
    app:tabTextColor="@color/purple_200"
    app:tabSelectedTextColor="@color/white"
    />
  1. 创建Fragment类,通过onCreate方法添加tab标签名字
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
    return inflater.inflate(R.layout.fragment_tab, container, false);
}
public static TabFragment newInstance(String label) {
    Bundle args = new Bundle();
    args.putString("label", label);
    TabFragment fragment = new TabFragment();
    fragment.setArguments(args);
    return fragment;
}
  1. 对应Activity中实现TabLayout功能,并将创建的Fragment放进一个List里面,重写getCount方法计算List中Fragment页面数量,最后使用setupWithViewPager()加载ViewPage页面。
public class MainActivity extends AppCompatActivity {
    private TabFragment tabFragment1 = new TabFragment();
    private List tabFragmentList = new ArrayList<>();
    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        TabLayout tabLayout = findViewById(R.id.tab_layout);
        ViewPager viewPager = findViewById(R.id.view_pager);
        //添加tab
        for (int i = 0; i < tabs.length; i++) {
            tabLayout.addTab(tabLayout.newTab().setText(tabs[i]));
        }
        tabFragmentList.add(tabFragment1.newInstance(tabs[0]));

       viewPager.setAdapter(new FragmentPagerAdapter(getSupportFragmentManager(), FragmentPagerAdapter.BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT) {
            @NonNull
            @Override
            public Fragment getItem(int position) {
                return (Fragment) tabFragmentList.get(position);
            }
            @Override
            public int getCount() {
                return tabFragmentList.size();
            }
            @Nullable
            @Override
            public CharSequence getPageTitle(int position) {
                return tabs[position];
            }
        });
        //设置TabLayout和ViewPager联动
        tabLayout.setupWithViewPager(viewPager,false);
    }
}