Android :(使用fragment碎片)——让你的应用更灵活(二)数据通信
fragment之间的通信包含了fragment之间的通信,Activity——>frament的通信以及fragment—>Activity的数据通信。这三种通信中第三个比较难,不论简单还难先说下思路吧。
思路:1、fragment1——fragment2:在fragment1 中写一个公共的方法来获得我们需要的数据,将得到的数据再fragment2 中进行调用或使**用。
2、Activity——>frament:activity先fragment传递数据需要通过Bundle,再通过fragment.setArguments(Bundle)方法来将数据传递给fragment,fragment部分通过getArguments()获得数据。
发送
new Bundle();
bundle.putString("data", text);
MyFragment myfragment = new
获取
String text=getArguments().get("data")+"";
3、fragment—>Activity:通过在fragment内部实现一个内部回调接口,并在包含该fragment的activity中实现该回调接口,这样fragment就可以通过调用该接口向activity传递数据了。
1、fragment间通信public class MainActivity extends FragmentActivity implements OnClickListener2、Activity—>fragment通信
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;
}
}
}
演示:将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{3、fragment—>Activity通信
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
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
3、在mainActivity中通过点击按钮找到fragment,通过fragment发送数据
@Override动态加载的fragment与activity的通信
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;
}
}
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
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();
}
}
版权声明
本文仅代表作者观点,不代表博信信息网立场。