专栏首页刘晓杰Fragment和Activity交互

Fragment和Activity交互

通常情况下,我们都是通过如下代码进行交互的

View listView = getActivity().findViewById(R.id.list);
ExampleFragment fragment = (ExampleFragment) getFragmentManager().findFragmentById(R.id.example_fragment);

一个比较好的做法是在fragment里面定义一个回调接口,然后要求宿主activity实现它。

当activity通过这个接口接收到一个回调,它可以同布局中的其他fragment分享这个信息。

例如

一个应用在一个MainActivity中有两个fragment,一个MenuFragment显示两个按钮,一个MainFragment显示内容(就一TextView)。

当一个按钮被选择的时候,MenuFragment必须通知MainActivity,然后MainActivity通知MainFragment,让它显示内容。

这个情况下,在MenuFragment中声明一个接口MyMenuListener(第一步)

为了确保宿主activity实现这个接口,MenuFragment的onAttach()方法(这个方法在fragment 被加入到activity中时由系统调用)中通过将传入的activity强制类型转换,实例化一个MyMenuListener对象:(第二步)

之后MainActivity实现这个MyMenuListener接口,在复写的函数里面修改MainFragment里面的内容。(第三步)

MenuFragment.java

public class MenuFragment extends Fragment {
	private MyMenuListener myMenuListener;
	private Button news, music;

	@Override
	public View onCreateView(LayoutInflater inflater, ViewGroup container,
			Bundle savedInstanceState) {
		// TODO Auto-generated method stub
		View view = inflater.inflate(R.layout.menu, container, false);
		news = (Button)view.findViewById(R.id.News);
		news.setOnClickListener(new OnClickListener(){
			@Override
			public void onClick(View v) {
				// TODO Auto-generated method stub
				myMenuListener.changeValue("music");
			}
		});
		music = (Button)view.findViewById(R.id.Music);
		music.setOnClickListener(new OnClickListener(){
			@Override
			public void onClick(View v) {
				// TODO Auto-generated method stub
				myMenuListener.changeValue("news");
			}
		});
		return view;
	}
	
	//回调接口,第一步
	public static interface MyMenuListener{
		public void changeValue(String value);
	}

	@Override //第二步
	public void onAttach(Activity activity) {
		// TODO Auto-generated method stub
		super.onAttach(activity);
		myMenuListener = (MyMenuListener)activity;
	}

MainActivity.java

public class MainActivity extends Activity implements MenuFragment.MyMenuListener{
//	private MenuFragment menuFragment;
	private MainFragment mainFragment;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		// TODO Auto-generated method stub
		super.onCreate(savedInstanceState);
		setContentView(R.layout.interact);
//		menuFragment = (MenuFragment) getFragmentManager().
//				findFragmentById(R.id.MenuFragment);
		mainFragment = (MainFragment) getFragmentManager().
				findFragmentById(R.id.MainFragment);
	}

	@Override //第三步
	public void changeValue(String value) {
		// TODO Auto-generated method stub
		mainFragment.changeTextViewText(value);
	}
}

MainFragment.java

public class MainFragment extends Fragment {
	private TextView tv;
	
	@Override
	public View onCreateView(LayoutInflater inflater, ViewGroup container,
			Bundle savedInstanceState) {
		// TODO Auto-generated method stub
		View view = inflater.inflate(R.layout.main_fragment, container, false);
		tv = (TextView) view.findViewById(R.id.text);
		return view;
	}
	
	public void changeTextViewText(String value){
		tv.setText(value);
	}
}

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Flutter: Semantics控件

    前言 如果你读过有关于Flutter的代码,那么你有时候你会注意到Semantics或者SemanticsConfiguration,但官方文档却对这个很有趣...

    JarvanMo
  • 史上最全的Android开发学习教程集锦【初学者】

    根据Google的报告,截止2017年5月为止,Android活跃用户已超过20亿,并还在持续增长中。Android系统在几个主要的市场上已超过了iOS系统,特...

    奔跑的小鹿
  • 对开源的认知

    没有开源软件,现在的互联网根本无法存在,开源的历史可以追溯到ARPANET建立。开源在今天已经不再是一个时髦的词了,对于互联网的开发者来说,它现在就像空气和水一...

    半吊子全栈工匠
  • flutter混合开发运行报错:VM snapshot must be valid. /Check failed: vm. Must be able to initialize the VM.

    找遍了google和flutter github的issue, 目前发现的可行解决办法如下: 1.在flutter module的build文件的andr...

    coderZhen
  • android的电话监听

    Dream城堡
  • Android使用bindService作为中间人对象开启服务

    <pre spellcheck="false" class="md-fences md-end-block contain-cm modeLoaded" lan...

    Dream城堡
  • Java项目转VS code

    近期更换了电脑,上一部电脑的开发环境和代码都找不回来。幸好上一篇中通过自建的Git仓库保存了自己平常开发的Java项目,而且项目是由Gradle进行构建的,所以...

    Jeffery
  • Dart 笔记 13 - 库

    只有一个表达式的函数,可以简写,类似 Kotlin。=> 后跟着一条表达式,不能是语句,比如 if 语句。

    七适散人
  • 安卓中gravity和layout_gravity的区别

    (1).android:gravity:是对view控件本身来说的,是用来设置view本身的内容应该显示在view的什么位置,默认值是左侧。也可以用来设置布局中...

    ZY_FlyWay
  • Android Clean 架构

    Clean 一般是指,代码以洋葱的形状依据一定的依赖规则被划分为多层:内层对于外层一无所知。这就意味着依赖只能由外向内。

    用户3596197

扫码关注云+社区

领取腾讯云代金券