爲了重用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)); } }