美文网首页
2018-04-22

2018-04-22

作者: 5050_ | 来源:发表于2018-04-22 20:28 被阅读0次

    通过广播实现Fragment与Activity之间的数据交互

    1. 首先明确要实现的功能及可视化界面


      图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);
    

    相关文章

      网友评论

          本文标题:2018-04-22

          本文链接:https://www.haomeiwen.com/subject/iioclftx.html