上一篇文章简单介绍了Android的回调机制的使用,这一篇博文将重点介绍Fragment碎片与activity的数据交互,fragment在Android开发中起着至关重要的作用,通过官方Android api我们可以看到,fragment有着自己的生命周期并依赖于它绑定的activity的生命周期而存在,那样activity与fragment怎样进行数据交互呢,请看此篇博文。
MainActiivity的代码
package com.example.f08_fragment03;
import com.example.f08_fragment03.Fragment02.Callback;
import android.os.Bundle;
import android.app.Activity;
import android.app.FragmentManager;
import android.app.FragmentTransaction;
import android.view.Menu;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
public class MainActivity extends Activity {
private FragmentManager manager;// 创建fragment管理
private FragmentTransaction transaction;// 创建fragment的事物
private EditText editText;
private Button button;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
editText = (EditText) this.findViewById(R.id.editText2);
button = (Button) this.findViewById(R.id.button1);
manager = getFragmentManager();
transaction = manager.beginTransaction();
final Fragment02 fragment02 = new Fragment02();
transaction.add(R.id.left, fragment02, "left");
transaction.commit();
// 不管要实现怎样的功能都必须调用以下三个方法
// manager=getFragmentManager();
//transaction=manager.beginTransaction();
// transaction.commit();提交数据
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View arg0) {
// TODO Auto-generated method stub
//通过callback机制得到fragment的数据
fragment02.getString(new Callback() {
@Override
public void getString(String msg) {
// TODO Auto-generated method stub
editText.setText(msg);
}
});
}
});
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
}
Fragment02的代码
package com.example.f08_fragment03;
import android.app.Activity;
import android.app.Fragment;
import android.os.Bundle;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.EditText;
public class Fragment02 extends Fragment {
private Button button;
private EditText editText;
@Override
public void onAttach(Activity activity) {
// TODO Auto-generated method stub
super.onAttach(activity);
}
@Override
public void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
}
// 在该方法中更新UI
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// TODO Auto-generated method stub
View view = inflater.inflate(R.layout.left, null);
button = (Button) view.findViewById(R.id.button1);
editText = (EditText) view.findViewById(R.id.editText1);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View arg0) {
//通过getActivity方法得到activity的控件,以此可以得到数据
EditText eText = (EditText) getActivity().findViewById(
R.id.editText2);
Log.i("info", "------->" + eText.getText().toString());
editText.setText(eText.getText().toString());
}
});
return view;
}
@Override
public void onStart() {
// TODO Auto-generated method stub
super.onStart();
}
@Override
public void onResume() {
// TODO Auto-generated method stub
super.onResume();
}
@Override
public void onPause() {
// TODO Auto-generated method stub
super.onPause();
}
//实现数据传递
public void getString(Callback callback) {
String msg = editText.getText().toString();
callback.getString(msg);
}
//创建接口
public interface Callback {
public void getString(String msg);
}
}
main的xml
<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" >
<LinearLayout
android:id="@+id/left"
android:layout_width="200dp"
android:layout_height="match_parent"
android:background="#cbcbcb"
android:orientation="vertical" >
</LinearLayout>
<LinearLayout
android:id="@+id/right"
android:layout_width="200dp"
android:layout_height="match_parent"
android:orientation="vertical"
>
</LinearLayout>
<EditText
android:id="@+id/editText2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentTop="true"
android:layout_marginTop="14dp"
android:layout_toRightOf="@+id/left"
android:ems="10"
android:inputType="textPassword" >
<requestFocus />
</EditText>
<Button
android:id="@+id/button1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/editText2"
android:layout_toRightOf="@+id/left"
android:text="得到Fragment的数据" />
</RelativeLayout>
fragment的xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<EditText
android:id="@+id/editText1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:inputType="text"
android:ems="10" >
<requestFocus />
</EditText>
<Button
android:id="@+id/button1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="得到Activity的数据" />
</LinearLayout>
这样就大功告成了,点击fragment的button就可以在其editText控件显示activity的editText控件的文字,点击activity的button就可以得到fragment的编辑控件的数据!