第一种:Fragment对Activity传递数据
首先上张Gif图,看起来直观一点,直入主题。自己手机录屏然后转的Gif图。
哇 好大啊 这动图
可以看出,通过点击InfoFragment界面的按钮来实现activity底部导航栏(这里我用的BottomNavigationBar)数字的更新。
InfoFragment.java主要代码
int num = 0; public InfoCallback infoCallback; public interface InfoCallback { void updateBadgeCount(int num); } public void initView() { bt = (Button) view.findViewById(R.id.fragment_info_bt); bt.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { num++; infoCallback.updateBadgeCount(num); } }); }
@Override//这是最重要的代码,目的就是为接口赋值,使其不为空 public void onAttach(Context context) { super.onAttach(context); Log.v(TAG, "--------onAttach"); //Fragment attach到Activity时,将Activity强转为Callbacks保存 if (context instanceof InfoCallback) {//如果宿主Activity实现了该接口 infoCallback = (InfoCallback) context; //infoCallback 指向该Activity } else { throw new RuntimeException(context.toString() + " must implement OnFragmentInteractionListener"); } }
MainActivity.java主要代码
public class MainActivity extends AppCompatActivity implements InfoFragment.InfoCallback { @Override public void updateBadgeCount(int num) { //自己要做的操作 } }
第一种:Fragment更新
应用场景:还是动图中的界面,点击下面Mine切换到我的界面时,要更新UI,但我不想每次都重走fragment的生命周期,只让它走一次,之后会通过控制显示与隐藏来切换,并且实现数据的更新。
MainActivity.java主要代码
private void showFragment(int position) { FragmentManager fm = getSupportFragmentManager(); FragmentTransation ft = fm.beginTransaction(); Fragment fragment = mFragmentList.get(position); //判断当前展示的fragment是否为空,不为空,则隐藏 if (mCurrentShowFrag != null) { ft.hide(mCurrentShowFrag); } //首先判断点击的fragment是否被添加,如果没有则添加 if (!fragment.isAdded()) { ft.add(R.id.main_framlayout, fragment); } else { if (fragment instanceof MineFragment) { //调用接口,然后在fragment中实现 againRequestCountListener.againRequestCount();
//最后会提到
A a=new A(); a.b();} ft.show(fragment); } mCurrentShowFrag = fragment;//将show的fragment赋予mCurrentShowFrag
ft.commit(); }
//这是接口
public static AgainRequestCountListener againRequestCountListener; public static void setAgainRequestCountListener(AgainRequestCountListener againRequestCountListener) { MainActivity.againRequestCountListener = againRequestCountListener; } public interface AgainRequestCountListener { void againRequestCount(); }
MineFragment.java主要代码
public class MineFragment extends Fragment implements MainActivity.AgainRequestCountListener { @Nullable @Override public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { view = inflater.inflate(R.layout.fragment_mine, container, false); MainActivity.setAgainRequestCountListener(this); checkNewVersion(); return view; } @Override public void againRequestCount() { //自己要做的操作 }
}
其实第二种不用接口也可以,直接用普通的调用方法也行 像这样:A a=new A(); a.b(); 转载请标明出处:Activity和Fragmen利用接口回调互相传递数据