通过广播实现Fragment与Activity之间的数据交互
-
首先明确要实现的功能及可视化界面
图1-10.jpg
代码如下所示:
<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=".MainActivity" > <fragment android:id="@+id/fragment" android:name="com.example.androidstudy1004.fragment" android:layout_width="120dp" android:layout_height="match_parent" /> <EditText android:id="@+id/editText1" android:layout_width="120dp" android:layout_height="wrap_content" android:layout_alignParentTop="true" android:layout_marginLeft="24dp" android:layout_marginTop="138dp" android:layout_toRightOf="@+id/fragment" android:ems="10" /> <Button android:id="@+id/button1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignLeft="@+id/editText1" android:layout_below="@+id/editText1" android:layout_centerVertical="true" android:layout_marginLeft="17dp" android:layout_marginTop="48dp" android:text="发送" /> </RelativeLayout>
fragment代码如下所示:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<TextView
android:id="@+id/textView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_alignParentTop="true"
android:layout_marginLeft="23dp"
android:layout_marginTop="142dp"
android:text="TextView" />
</RelativeLayout>
界面完成之后实现其功能
2.首先获取主界面edittext中的内容点击发送按钮发送到fragment的textview中
(1)在MainActivity获取文本框然后获取文本框的值,,然后通过广播发送广播。主要代码实现如下(MainActivity):
public class MainActivity extends Activity {
EditText et;
Button bt;
TextView tv;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
et=(EditText) findViewById(R.id.editText1);
bt=(Button) findViewById(R.id.button1);
tv=(TextView) findViewById(R.id.textView1);
bt.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
String s=et.getText().toString().trim(); //获得文本框的内容
//发送广播
Intent intent=new Intent();
intent.setAction("aa.bb.cc");//告诉他从哪
intent.putExtra("name", s);//告诉这个意图要带上什么东西
sendBroadcast(intent); //发送这个广播
}
});
}
}
(2)F1中:
在fragment中接收广播给Textview赋值。在onCreate()方法中接收广播,接收完广播之后在onDestroy()中销毁广播。
public class F1 extends Fragment {
MyBroadcastReceive receiver;
TextView tv;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view=inflater.inflate(R.layout.fragment, null);
tv=(TextView) view.findViewById(R.id.textView1);
return view;
}
@Override
public void onDestroy() {
super.onDestroy();
getActivity().unregisterReceiver(receiver);
}
//先在oncreate里创建一个收音机
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
receiver=new MyBroadcastReceive();
//意图过滤器
IntentFilter itFilter=new IntentFilter();
itFilter.addAction("aa.bb.cc");
//动态注册广播接收者
getActivity().registerReceiver(receiver, itFilter);
}
//然后让收音机做好接收广播的准备 广播接收者
class MyBroadcastReceive extends BroadcastReceiver{
//当收音机收到消息的时候
@Override
public void onReceive(Context arg0, Intent arg1) {
String s=arg1.getStringExtra("name");
tv.setText(s); //获得文本框里的内容
}
}
}
3.运行结果如图所示:
点击按钮,把信息传递过去
图1-11.jpg 图1-12.jpg
小结:
MyBroadcastReceive 收音机
BroadcastReceiver 广播接收者
IntentFilter 意图过滤器
//动态注册广播接收者
getActivity().registerReceiver(receiver, itFilter);
网友评论