2013/10/12

存取 FragmentPagerAdapter 之中的 Fragment

最近正在忙一個有關於店家資訊的 Android 程式。

有一個頁面之中有三個 Fragment ,分別讓使用者輸入店名、營業時間還有備註。

當初因為覺得就是要 ActionBar Tab + ViewPager 才酷炫阿!(就...拿石頭雜自己腳囉...)


結果落到沒辦法從外部的按鈕讀取到裡頭的 EditText 裡面的資料。
(因為我做了一個「送出」按鈕在外面。)

白痴的我用盡了各種方法,想說如果外層的FragmentActivity可以直接存取我掛上去的那三個 Fragment 那該有多好。

研究了很久終於發現了方法,可以存取 FragmentPagerAdapter 裡頭的 Fragment 了!


其實意外的簡單喔。




首先,因為我是用ActionBar Tab 加上 ViewPager 的關係。

一定會有一個 class 繼承 FragmentPagerAdapter 來做 Adapter 的功能。

為了存取我掛上去的那些Fragment , 我新增了一個 SparseArray 來存放這些 Fragment。


於是我該 Class 的 Constructor 之前加上:

        private SparseArray<Fragment> map = new SparseArray<Fragment>();


作為用來存放 Fragment 的 Array。


接下來我修改了 getItem(int position) 這個 Method。

        @Override
public Fragment getItem(int position) {
TabInfo info = mTabs.get(position);
Fragment fragment = Fragment.instantiate(mContext, info.clss.getName(), info.args);
map.put(position, fragment);        //將掛上去的Fragment 放入 map 這個 Array
return fragment;


這麼一來,來ActionBar 再把 Fragment 掛上去之後,便會存入 map 這個 Array 之中了。


之後,要處裡 Android 把它拿掉的狀況,也就是 destroyItem 的狀況

@Override
public void destroyItem(ViewGroup container, int position, Object object) {
map.remove(position);        //將被Android 拿掉的頁面從map裡面清除
super.destroyItem(container, position, object);
}

接著新增一個甜蜜的 Method ,我們就可以從其他地方存取被放入 SparseArray 之中的 Fragment了!

public Fragment getFragment(int position){
return map.get(position);
}

於是在其之上的FragmentActivity,我就可以用 getFragment 的方式存取其中的Fragment 內容。這樣使用者輸入的內容我也可以取得了!
要 getView 或 findViewById 也都做的到了喔喔喔喔!

例如:

AddItem addItemFragment = (AddItem) mTabsAdapter.getFragment(0);
View page1 = addItemFragment.getView();
EditText input_Name = (EditText)page1.findViewById(R.id.editText_name);

我知道我表達的不是很好,建議如果不太懂我在表達什麼的話。

可以參考這個網址,Stack Overflow 真的是很棒的網站,解答了我很多問題。

希望這個方法對目前遇到 FragmentPagerAdapter 要存取他的Fragment 的你有幫助囉...

沒有留言:

張貼留言