Activity和Fragmen利用接口回调互相传递数据

匿名 (未验证) 提交于 2019-12-03 00:22:01

第一种: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();
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!