1.getActivity():
碎片相当于活动的组件,存在于活动中。在碎片页中,getActivity()可以获取活动,从而操作活动和碎片页的组件。
例如:
在一个碎片中修改另外一个碎片的组件。
public class TestFragment1 extends Fragment {
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// TODO Auto-generated method stub
return inflater.inflate(R.layout.fragment1, container, false);
}
@Override
public void onActivityCreated(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onActivityCreated(savedInstanceState);
((TextView) getActivity().findViewById(R.id.tv_name1))
.setText("test f1");
// TestFragment2的组件
((TextView) getActivity().findViewById(R.id.tv_name1))
.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
((TextView) getActivity().findViewById(R.id.tv_name2))
.setText("0.0!");
}
});
}
}
2.getArguments():
通过它可以让活动向碎片页传输一个bundle对象。
在活动中设置bundle:
Fragment f1 = new TestFragment1();
Bundle bundle=new Bundle();
bundle.putString("name", "bundle data!");
f1.setArguments(bundle);
在碎片页中获取传递的bundle:
public class TestFragment1 extends Fragment {
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// TODO Auto-generated method stub
return inflater.inflate(R.layout.fragment1, container, false);
}
@Override
public void onActivityCreated(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onActivityCreated(savedInstanceState);
// 获取传递的bundle
((TextView) getActivity().findViewById(R.id.tv_name1))
.setText(getArguments().getString("name"));
}
}
当然,将实例化碎片页封装为静态的方法,使用起来要简单和美观点。
public class TestFragment1 extends Fragment {
// 实例化
static TestFragment1 newInstance(CharSequence label) {
TestFragment1 frag = new TestFragment1();
Bundle b = new Bundle();
b.putCharSequence("label", label);
frag.setArguments(b);
return frag;
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// TODO Auto-generated method stub
return inflater.inflate(R.layout.fragment1, container, false);
}
@Override
public void onActivityCreated(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onActivityCreated(savedInstanceState);
// 获取传递的bundle
((TextView) getActivity().findViewById(R.id.tv_name1))
.setText(getArguments().getString("name"));
}
}
3.通过同享接口。
首先定义一个接口:
public class TestFragment1 extends Fragment {
public interface TransData {
public void test(String nameTxt);
}
TransData transData=null;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// TODO Auto-generated method stub
return inflater.inflate(R.layout.fragment1, container, false);
}
@Override
public void onActivityCreated(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onActivityCreated(savedInstanceState);
((TextView) getActivity().findViewById(R.id.tv_name1))
.setText("test f1");
((TextView) getActivity().findViewById(R.id.tv_name1))
.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
transData.test("click frag txt");
}
});
}
@Override
public void onAttach(Activity activity) {
// TODO Auto-generated method stub
super.onAttach(activity);
try {
transData = (TransData) activity;
} catch (ClassCastException e) {
// TODO: handle exception
throw new ClassCastException(activity.toString()
+ "必须实现 TransData接口");
}
}
}
然后让活动去实现接口:
public class TestMain extends FragmentActivity implements TransData {
@Override
public void test(String nameTxt) {
// TODO Auto-generated method stub
((TextView) findViewById(R.id.tv_name2)).setText(nameTxt);
}
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.acy_testfirst);
initView();
}
因为活动是接口的具体实现,就可以在碎片页中将活动对象强转为接口的实现,因为是共享的活动对象,在碎片页中通过强转的接口实现调用接口方法,就相当于直接调用活动中的实现的具体接口方法,从而达到了碎片页向活动传递数据的效果。
就跟在一个类中,调用该类的方法一样。
其实接口定义写在碎片页或者外面其实也没啥区别。
注意:
1.同事加载的几个碎片页,不要使用同样的layout资源文件,否则可能导致某些碎片页不能正常显示。