创建
MyFragment fragment = new MyFragment();
FragmentManager manager = getSupportFragmentManager();
FragmentTransaction transaction = manager.beginTransaction();
transaction.add(R.id.ll_main_container, fragment).commit();
切换Fragment
public void switchContent(Fragment from, Fragment to, String tag) {
if (from == null || to == null) {
return;
}
FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
if (!to.isAdded()) {
transaction.hide(from).add(R.id.frame_content, to, tag).commit();
} else {
transaction.hide(from).show(to).commit();
}
}
Fragment通信
可以使用EventBus或者广播,或者使Fragment和Activity共用一个viewModel。也可以使用以下方式
Fragment传数据给Activity
public class TestActivity extends AppCompatActivity implements MyFragment.MyListener {
private TextView testTv;
private FrameLayout testFragment;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_test);
testTv = findViewById(R.id.test_tv);
testFragment = findViewById(R.id.test_fragment);
FragmentTransaction ft = getFragmentManager().beginTransaction();
ft.add(R.id.test_fragment, MyFragment.newInstance());
ft.commit();
}
//实现接口来接收Fragment的传递内容
@Override
public void send(String info) {
if(testTv != null) {
testTv.setText(info);
}
}
}
public class MyFragment extends Fragment {
MyListener listener;
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
listener = (MyListener)getActivity();//Activity实现了MyListener接口来做回调接收Fragment的传参
}
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, Bundle savedInstanceState) {
View view = LayoutInflater.from(getContext()).inflate(R.layout.fragment_my, null);
TextView nameTv = view.findViewById(R.id.name_tv);
TextView ageTv = view.findViewById(R.id.age_tv);
TextView sendBtn = view.findViewById(R.id.send_btn);
Bundle bundle = getArguments();
if(bundle != null) {
final String name = bundle.getString("name");
final int age = bundle.getInt("age");
nameTv.setText(name);
ageTv.setText(String.valueOf(age));
sendBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
listener.send(name + "今年" + age + "岁了");
}
});
}
return view;
}
//Activity传值给Fragment
public static MyFragment newInstance() {
Bundle args = new Bundle();
args.putString("name","小米");
args.putInt("age", 15);
MyFragment fragment = new MyFragment();
fragment.setArguments(args);
return fragment;
}
public interface MyListener {
void send(String info);
}
}
Fragment之间互传参数
核心是通过下面函数获取到Fragment对其操作。
getFragmentManager().findFragmentById(R.id.test_fragment2);
fragment.setInfo(name+"来访问了");
public class TestActivity extends AppCompatActivity {
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_test);
FragmentTransaction ft = getFragmentManager().beginTransaction();
ft.add(R.id.test_fragment1, MyFragment.newInstance());
ft.add(R.id.test_fragment2, MyFragment2.newInstance());
ft.commit();
}
}
public class MyFragment extends Fragment {
private TextView infoTv;
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, Bundle savedInstanceState) {
View view = LayoutInflater.from(getContext()).inflate(R.layout.fragment_my, null);
infoTv = view.findViewById(R.id.info_tv);
Button sendBtn = view.findViewById(R.id.send_btn);
Bundle bundle = getArguments();
if(bundle != null) {
final String name = bundle.getString("name");
sendBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
MyFragment2 fragment = (MyFragment2) getFragmentManager().findFragmentById(R.id.test_fragment2);
fragment.setInfo(name+"来访问了");
}
});
}
return view;
}
public static MyFragment newInstance() {
Bundle args = new Bundle();
args.putString("name","小米");
args.putInt("age", 15);
MyFragment fragment = new MyFragment();
fragment.setArguments(args);
return fragment;
}
public void setInfo(String info) {
if(infoTv != null){
infoTv.setText(info);
}
}
}
public class MyFragment2 extends Fragment {
private TextView infoTv;
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, Bundle savedInstanceState) {
View view = LayoutInflater.from(getContext()).inflate(R.layout.fragment_my2, null);
infoTv = view.findViewById(R.id.info_tv);
Button sendBtn = view.findViewById(R.id.send_btn);
Bundle bundle = getArguments();
if(bundle != null) {
final String name = bundle.getString("name");
sendBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
MyFragment fragment = (MyFragment) getFragmentManager().findFragmentById(R.id.test_fragment1);
fragment.setInfo(name+"来访问了");
}
});
}
return view;
}
public static MyFragment2 newInstance() {
Bundle args = new Bundle();
args.putString("name","小红");
args.putInt("age", 19);
MyFragment2 fragment = new MyFragment2();
fragment.setArguments(args);
return fragment;
}
public void setInfo(String info) {
if(infoTv != null){
infoTv.setText(info);
}
}
}
问题:
1.Viewpager+FragmentPagerAdapter刷新复用和显示问题。
解:可以使用Viewpager+FragmentStatePagerAdapter
public class MyAdapter extends FragmentStatePagerAdapter {
List<Fragment> viewList = new ArrayList<>();
boolean hasInitFirstItem = false;
MyAdapter(FragmentManager fm) {
super(fm);
}
@Override
public Fragment getItem(int position) {
return viewList.get(position);
}
//这句很关键,可以防止刷新之后之前已加载的重新加载
@Override
public int getItemPosition(@NonNull Object object) {
return POSITION_NONE;
}
// @Override
// public CharSequence getPageTitle(int position) {
// return data.get(position).getMainTitle();
// }
@Override
public int getCount() {
return viewList.size();
}
public void setData(List<HomeDataBean.HomeDataInfo.WaterFallLabelNamesBean> data) {
viewList.clear();
for (int i=0;i<data.size();i++) {
viewList.add(HomeGoodsFragment.newInstance(i, data.get(i).getMainTitle()));
}
notifyDataSetChanged();
}
}