Fragment與Activiy之間的交互

  • 爲了重用Fragment UI組件,咱們應該把每個fragment都構建成徹底的自包含的、模塊化的組件,定義他們本身的佈局與行爲。定義好這些模塊化的Fragment後,就能夠讓他們關聯activity,使他們與application的邏輯結合起來,實現全局的複合的UI。android

  • 一般fragment之間可能會須要交互,好比基於用戶事件改變fragment的內容。全部fragment之間的交互須要經過他們關聯的activity,兩個fragment之間不該該直接交互。app

 

定義一個接口

  • 爲了讓fragment與activity交互,能夠在Fragment 類中定義一個接口,並在activity中實現。Fragment在他們生命週期的onAttach()方法中獲取接口的實現,而後調用接口的方法來與Activity交互。

下面是一個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));
        
    }
}
相關文章
相關標籤/搜索