Fragment與Activiy之間的交互


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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM