为了重用Fragment UI组件,咱们应该把每个fragment都构建成彻底的自包含的、模块化的组件,定义他们本身的布局与行为。定义好这些模块化的Fragment后,就能够让他们关联activity,使他们与application的逻辑结合起来,实现全局的复合的UI。android
一般fragment之间可能会须要交互,好比基于用户事件改变fragment的内容。全部fragment之间的交互须要经过他们关联的activity,两个fragment之间不该该直接交互。app
下面是一个fragment与activity交互的例子:ide
解释:这个Fragment主要是写了一个ListView,而后添加点击事件,咱们能够得到被点击项的position,咱们把这个position传给容纳Fragment的Activity.模块化
public class FragList extends Fragment{ private View view; private ListView listView; private ArrayAdapter<String> adapter; private onParentListener listener; //接口的实例化 必须 @Override public void onAttach(Activity activity) { listener = (onParentListener) activity; super.onAttach(activity); } @Override @Nullable public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { view = inflater.from(getActivity()).inflate(R.layout.frag_list, null); initView(); return view; } void initView(){ listView = (ListView) view.findViewById(R.id.fralist); adapter = new ArrayAdapter<String>(getActivity(), android.R.layout.simple_list_item_1,addDatas()); listView.setAdapter(adapter); listView.setOnItemClickListener(new OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { listener.getPosition(position); } }); } //显示activity传过来的position public void getParentContent(int position){ Toast.makeText(getActivity(), String.valueOf(position), 0).show(); } //源数据 private List addDatas(){ List<String> list = new ArrayList<String>(); for(int i = 0;i<10;i++){ list.add("item" + i); } return list; } //定义接口 public interface onParentListener{ void getPosition(int position); } }
为了接收回调事件,宿主activity必须实如今Fragment中定义的接口。布局
举个例子,下面的activity实现了上面例子中的接口。spa
Activity:继承Fragment里面的接口,并重写方法,经过此接口咱们变能够获取点击的positioncode
public class FragmentListActivity extends FragmentActivity implements onParentListener{ //显示Fragment传过来的position private TextView textView; //接受Fragment传过来的position private int t; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_fragment_list); initView(); addFragment(); } void initView(){ textView =(TextView) findViewById(R.id.text); }; //此为与Fragment的交互,调用Fragment的方法,并显示传入的t void toFragment(){ findViewById(R.id.fragBtn).setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { FragList fragList = (FragList) getSupportFragmentManager().findFragmentById(R.id.frag); if(fragList != null){ fragList.getParentContent(t); } } }); } //获得Fragment void addFragment(){ getSupportFragmentManager().beginTransaction() .replace(R.id.frag, new FragList()).commit(); } @Override public void getPosition(int position) { t = position; textView.setText(String.valueOf(position)); } }