这是我参与「第四届青训营 」笔记创作活动的第1天
Fragment可以看成一个小型的Activity,Fragment可以实现将屏幕分为几块,更方便的进行管理,它更碎片也更加迅速,但Fragment的生命周期受到Activity的影响,需要嵌套进Activity中使用,并不能单独使用。
Fragment的使用
- 定义Fragment的xml布局
- 自定义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);
}
- Activity调用setContentView()加载布局文件
数据传递and组件获取
- Activity获取Fragment组件:getFragmentManager.findFragmentById(R.id.Fragment_xxx)
- Activity获取Fragment数据: 在Activity中创建Bundle数据包,用setArguments(Bundle bundle)传给Fragment,Fragment中调用getArguments获得Bundle。
- Fragment获取Activity组件: getActivity().findViewById(R.id.list)
- 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滑动
- 实现一个顶部的导航栏,首先想到的就是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"
/>
- 创建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;
}
- 对应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);
}
}