Android :(使用fragment碎片)——让你的应用更灵活(二)数据通信

Fragment的三种通信

fragment之间的通信包含了fragment之间的通信,Activity——>frament的通信以及fragment—>Activity的数据通信。这三种通信中第三个比较难,不论简单还难先说下思路吧。

思路:

1、fragment1——fragment2:在fragment1 中写一个公共的方法来获得我们需要的数据,将得到的数据再fragment2 中进行调用或使**用。
2、Activity——>frament:activity先fragment传递数据需要通过Bundle,再通过fragment.setArguments(Bundle)方法来将数据传递给fragment,fragment部分通过getArguments()获得数据。
发送

            Bundle bundle = new Bundle();
            bundle.putString("data", text);
            MyFragment myfragment = new MyFragment();
            myfragment.setArguments(bundle);

获取

 String text=getArguments().get("data")+"";

3、fragment—>Activity:通过在fragment内部实现一个内部回调接口,并在包含该fragment的activity中实现该回调接口,这样fragment就可以通过调用该接口向activity传递数据了。

1、fragment间通信

这里写图片描述

public class MainActivity extends FragmentActivity implements OnClickListener {
    private FragmentManager fragment;
    private FragmentTransaction beginTransaction;
    private FrameLayout mframe;
    private Button mbtn1;
    private Button mbtn2;
    private Button mbtn3;
    private MyFirstFragment myFirstFragment;
    private MySecondFragment mySecondFragment;
    private MyThirdFragment myThirdFragment;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mframe = (FrameLayout) findViewById(R.id.frame);
        mbtn1 = (Button) findViewById(R.id.button1);
        mbtn2 = (Button) findViewById(R.id.button2);
        mbtn3 = (Button) findViewById(R.id.button3);
        mbtn1.setOnClickListener(this);
        mbtn2.setOnClickListener(this);
        mbtn3.setOnClickListener(this);
        //fragment 的动态加载
        fragment = getSupportFragmentManager();
        beginTransaction = fragment.beginTransaction();
        myFirstFragment = new MyFirstFragment();
        mySecondFragment = new MySecondFragment();
        myThirdFragment = new MyThirdFragment();
        beginTransaction.add(R.id.frame, myFirstFragment);
        beginTransaction.add(R.id.frame, mySecondFragment);
        beginTransaction.add(R.id.frame, myThirdFragment);
        beginTransaction.hide(myFirstFragment);
        beginTransaction.hide(mySecondFragment);
        beginTransaction.commit();
    }

    @Override
    public void onClick(View v) {
        switch (v.getId()) {
        case R.id.button1: {
            beginTransaction = fragment.beginTransaction();
             beginTransaction.addToBackStack(null);
            beginTransaction.hide(myThirdFragment);
            beginTransaction.hide(mySecondFragment);
            beginTransaction.show(myFirstFragment);
            beginTransaction.commit();
        }

            break;
        case R.id.button2: {
            beginTransaction = fragment.beginTransaction();
            String s = myThirdFragment.gettext();           
             beginTransaction.addToBackStack(null);
            beginTransaction.hide(myThirdFragment);
            beginTransaction.hide(myFirstFragment);
            beginTransaction.show(mySecondFragment);
            mySecondFragment.settext(s);
            beginTransaction.commit();
        }
            break;
        case R.id.button3: {
            beginTransaction = fragment.beginTransaction();

            beginTransaction.hide(myThirdFragment);
            beginTransaction.hide(myFirstFragment);
            beginTransaction.show(myThirdFragment);
             beginTransaction.addToBackStack(null);
            beginTransaction.commit();
        }
            break;
        default:
            break;
        }
    }
}

2、Activity—>fragment通信

演示:将fragment布局动态加载到activity中,通过Bundle将输入的内容展示到fragment的TextView上面。
这里写图片描述
代码:
MainActivity布局采用LinearLayout(@+id/layout)内包含一个Button和EditText,MyFragment中布局只有一个TextView。

@Override
    public void onClick(View v) {
        switch (v.getId()) {
        case R.id.btn_send:
            String text = met_text.getText().toString();
            //设置传递数据
            Bundle bundle = new Bundle();
            bundle.putString("data", text);//键值对形式存储
            MyFragment myfragment = new MyFragment();
            myfragment.setArguments(bundle);//通过该方法传递数据
            //动态加载fragment
            FragmentManager fragmentmanager = getFragmentManager();
            FragmentTransaction beginTransation = fragmentmanager.beginTransaction();
            beginTransation.add(R.id.layout, myfragment);
            //记得提交
            beginTransation.commit();

            break;

        default:
            break;
        }

    }

Fragment获取数据

public class MyFragment extends Fragment{
    private TextView textview;
   @Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {
    View view=inflater.inflate(R.layout.item_myfragment, container, false);
    textview=(TextView) view.findViewById(R.id.textview);
    //获取数据将数据展示到TextView上面
    String text=getArguments().get("data")+"";
    textview.setText(text);
    return view;
}
}

3、fragment—>Activity通信

fragment向Activity的通信我们分为动态加载fragment的通信与静态加载fragment的通信。

静态加载的fragment与activity的通信

这里写图片描述
1、在布局中静态加载fragment,注意给出name与id

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/layout"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <EditText
        android:id="@+id/edittext"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />

    <Button
        android:id="@+id/btn_send"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="发送" />

    <fragment
        android:id="@+id/fragmentjingtai"
        android:name="com.example.myfragment.MyFragment"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

</LinearLayout>

2、在fragment中设置传输数据的set\get方法(用于在静态加载时调用中)

public class MyFragment extends Fragment{
    private Button button;
    private TextView textview;
    //传输的数据
    private String text;
    //set get方法     
   public String getText() {
        return text;
    }

    public void setText(String text) {
        this.text = text;
    }

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {
    View view=inflater.inflate(R.layout.item_myfragment, container, false);
    textview=(TextView) view.findViewById(R.id.textview);   
    button=(Button) view.findViewById(R.id.button_Myfragment);
    //点击按钮时获取数据并通过Toast显示
    button.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {
            String value=getText();
            Toast.makeText(getActivity(), "fragment发送的text数据:"+value,Toast.LENGTH_SHORT).show();

        }
    });  
    return view;
}

3、在mainActivity中通过点击按钮找到fragment,通过fragment发送数据

    @Override
    public void onClick(View v) {
        switch (v.getId()) {
        case R.id.btn_send: 

            FragmentManager fragmentmanager = getFragmentManager();
            //通过id获取Fragment
            Fragment fragmentById=fragmentmanager.findFragmentById(R.id.fragmentjingtai);     
            //将Fragment强制造型成Myfragment 
            MyFragment myfragment=(MyFragment) fragmentById;
            myfragment.setText("fragment静态传递的数据:");
            break;

        default:
            break;
        }

    }

动态加载的fragment与activity的通信

 这里写图片描述
1、我们现在fragment中实现内部接口

public class MyFragment extends Fragment{

    private TextView textview;
    public String words="hello,Activity";
    //用于获取activity对象,传递数据
    public MyListener listener;
    //在fragment中实现内部接口
    public interface MyListener {
    //抽象方法
        public void hello(String words);        
    }
    @Override
    public void onAttach(Activity activity) {
    //获取activity对象
        listener=(MyListener) activity;
        super.onAttach(activity);
    }
   @Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {
    View view=inflater.inflate(R.layout.item_myfragment, container, false);
    textview=(TextView) view.findViewById(R.id.textview);   
    //Toast中的context使用getActivity()获得
    Toast.makeText(getActivity(), "fragment正在发送数据:"+words,Toast.LENGTH_SHORT).show();
    //发送数据,在布局被加载,执行onCreateView的时候会向activi发送数据
    listener.hello(words);    
    return view;
}
}

2、MainActivity中调用该接口(我们在fragment中创建的MyListener)

public class MainActivity extends Activity implements OnClickListener ,MyListener{
    private EditText met_text;
    private Button mbtn_send;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.fragment_send);
        mbtn_send = (Button) findViewById(R.id.btn_send);
        met_text = (EditText) findViewById(R.id.edittext);
        mbtn_send.setOnClickListener(this);

    }

    @Override
    public void onClick(View v) {
        switch (v.getId()) {
        case R.id.btn_send: 
        //按钮点击时,动态加载布局
            MyFragment myfragment = new MyFragment();       
            FragmentManager fragmentmanager = getFragmentManager();
            FragmentTransaction beginTransation = fragmentmanager.beginTransaction();
            beginTransation.add(R.id.layout, myfragment);
            beginTransation.commit();

            break;

        default:
            break;
        }

    }
   //fragment中调用listener.hello(words)时会调用该方法  
    @Override
    public void hello(String words) {
        Toast.makeText(getApplicationContext(), "Activity已经接收到数据"+words, Toast.LENGTH_SHORT).show();        
    }

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值