-
為了重用Fragment UI組件,我們應該把每一個fragment都構建成完全的自包含的、模塊化的組件,定義他們自己的布局與行為。定義好這些模塊化的Fragment后,就可以讓他們關聯activity,使他們與application的邏輯結合起來,實現全局的復合的UI。
-
通常fragment之間可能會需要交互,比如基於用戶事件改變fragment的內容。所有fragment之間的交互需要通過他們關聯的activity,兩個fragment之間不應該直接交互。
定義一個接口
- 為了讓fragment與activity交互,可以在Fragment 類中定義一個接口,並在activity中實現。Fragment在他們生命周期的onAttach()方法中獲取接口的實現,然后調用接口的方法來與Activity交互。
下面是一個fragment與activity交互的例子:
解釋:這個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實現了上面例子中的接口。
Activity:繼承Fragment里面的接口,並重寫方法,通過此接口我們變可以獲取點擊的position
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)); } }