Fragment与Activity之间可采用以下2种方式实现数据通信
1、接口回调
2、广播
下面通过一个Demo来展示效果。
Fragment1与Activity之间通过接口回调来实现数据通信
Fragment2与Activity之间通过广播来实现数据通信
话不多说,细节见Demo代码
MainActivity:
public class MainActivity extends BaseActivity implements View.OnClickListener { private IntentFilter mIntentFilter; private MyBroadcastReceiver myBroadReceiver; private FragmentManager mFm; private FragmentTransaction mTransaction; private Fragment1 mFragment1; private Fragment2 mFragment2; private swapDataListener mListener; private Button mBtn1; private Button mBtn2; private Button mBtn3; public void setSwapDataListener(swapDataListener listener) { mListener = listener; } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); initView(); mFragment1 = new Fragment1(); mFragment2 = new Fragment2(); mFm = getSupportFragmentManager(); mTransaction = mFm.beginTransaction(); mTransaction.replace(R.id.content, mFragment1, "f1"); mTransaction.commit(); //动态注册广播 mIntentFilter = new IntentFilter(); mIntentFilter.addAction("android.string"); myBroadReceiver = new MyBroadcastReceiver(); registerReceiver(myBroadReceiver, mIntentFilter); } private void initView() { mBtn1 = (Button) findViewById(R.id.btn1); mBtn1.setOnClickListener(this); mBtn2 = (Button) findViewById(R.id.btn2); mBtn2.setOnClickListener(this); mBtn3 = (Button) findViewById(R.id.btn3); mBtn3.setOnClickListener(this); } @Override public void onClick(View v) { FragmentManager fm=getSupportFragmentManager(); FragmentTransaction transaction=fm.beginTransaction(); switch (v.getId()) { case R.id.btn1: transaction.replace(R.id.content,mFragment1); transaction.commit(); break; case R.id.btn2: transaction.replace(R.id.content,mFragment2); transaction.commit(); break; case R.id.btn3: sendData(); break; default: break; } } private void sendData() { Thread thread = new Thread(new Runnable() { @Override public void run() { int i = 0; while (true) { i++; try { Thread.sleep(1000); } catch (Exception e) { } mListener.swap("" + i); Log.e("tag", "i=" + String.valueOf(i)); } } }); thread.start(); } public interface swapDataListener { void swap(String s); } private class MyBroadcastReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { Bundle data = intent.getExtras(); ((TextView) findViewById(R.id.text)).setText(data.getString("string")); } } @Override protected void onDestroy() { super.onDestroy(); unregisterReceiver(myBroadReceiver); } }
Fragment1:
public class Fragment1 extends Fragment implements MainActivity.swapDataListener { private TextView mText; private MainActivity mActivity; @Override public View onCreateView(LayoutInflater inflater,ViewGroup container,Bundle savedInstanceState) { View v=inflater.inflate(R.layout.fragment1_layout,container,false); mText=v.findViewById(R.id.text); return v; } @Override public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); mActivity=(MainActivity) getActivity(); mActivity.setSwapDataListener(this); } @Override public void swap(final String s) { Log.e("tag","s= "+s); mActivity.runOnUiThread(new Runnable() { @Override public void run() { mText.setText(s); } }); } }
Fragment2:
public class Fragment2 extends Fragment { private TextView mText; private Button mBtn; @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View v = inflater.inflate(R.layout.fragment2_layout, container, false); mText = v.findViewById(R.id.text); mBtn = v.findViewById(R.id.btn2); return v; } @Override public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState);; mBtn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Intent intent = new Intent("android.string"); intent.putExtra("string", "广播传递的字符串"); getActivity().sendBroadcast(intent); } }); } }
xml文件:
activity_main: <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context="smart.client.activity.MainActivity"> <TextView android:id="@+id/text" android:layout_width="match_parent" android:layout_height="50dp" android:background="@android:color/darker_gray" /> <FrameLayout android:id="@+id/content" android:layout_width="match_parent" android:layout_marginTop="10dp" android:layout_height="150dp" android:layout_below="@id/text" android:background="@android:color/holo_blue_dark"/> <Button android:id="@+id/btn1" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_below="@id/content" android:gravity="center" android:text="to Fragemnt1"/> <Button android:id="@+id/btn2" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_below="@id/btn1" android:layout_marginTop="20dp" android:gravity="center" android:text="to Fragment2"/> <Button android:id="@+id/btn3" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_below="@id/btn2" android:layout_marginTop="20dp" android:gravity="center" android:text="send"/> </RelativeLayout>