###前提・実現したいこと
viewPagerをつかってEditTextを含むFragmentを操作するコードを書いていて、ボタンを押したらviewPagerに含まれるすべてのFragmentにあるEditTextからgetData()したいのですが、fragmentのインスタンスをどのように取るのかで困っています。
instantiateItemを使うという解決策はキャストの問題でfragment自分で作ったfragmentのメソッドを読み込めません。
そしてviewPagerを動的に追加するために
http://qiita.com/takaaki7/items/9f135eb9e52625eb206e
この方が作ったライブラリを使っています。
どのようにviewPagerもしくはadapterからfragmentのインスタンスを取得すればよいのでしょうか。
###該当のソースコード
これが取得したいfragmentです。
public class ProductFragment extends Fragment { private View view; public View onCreateView(LayoutInflater inflater,ViewGroup container,Bundle savedInstanceState) { view = inflater.inflate(R.layout.layout_product_fragment, container, false); return view; } public HashMap<String,String> getData(){ HashMap<String,String> data = new HashMap<>(); data.put("name",((EditText)(view.findViewById(R.id.name))).getText().toString()); data.put("price",((EditText)(view.findViewById(R.id.price))).getText().toString()); data.put("comment",((EditText)(view.findViewById(R.id.comment))).getText().toString()); return data; } public static ProductFragment newInstance(int number){ Bundle bundle =new Bundle(); bundle.putInt("number", number); ProductFragment fragment = new ProductFragment(); fragment.setArguments(bundle); Log.d("message", "picture"); return fragment; } public boolean isDataNull(){ if(TextUtils.isEmpty(this.getData().get("name"))&&TextUtils.isEmpty(this.getData().get("price"))&&TextUtils.isEmpty(this.getData().get("comment"))){ return true; }else{ return false; } } }
これがadapterのコードです。先ほどのサイトで公開されているクラスを継承しています。
public class ProductFragmentAdapter extends ArrayFragmentStatePagerAdapter<Integer>{ public ProductFragmentAdapter(FragmentManager fm,int i){ super(fm,i); } @Override public Fragment getFragment(Integer number , int position) { ProductFragment fragment = ProductFragment.newInstance(number); return fragment; } @Override public void remove(int position){ super.remove(position); } @Override public CharSequence getPageTitle(int position) { return String.valueOf(position+1) + "個目の商品登録"; } public ProductFragment getProductFragment(ViewGroup container,int position){ Fragment fragment = (Fragment)instantiateItem(container,position); return (ProductFragment) fragment; } }
adapterが継承してるメソッドです
public abstract class ArrayFragmentStatePagerAdapter<T> extends ArrayPagerAdapter<T> { private static final String TAG = "StatePagerAdapter"; private static final boolean DEBUG = false; private final FragmentManager mFragmentManager; private FragmentTransaction mCurTransaction = null; private ItemsStateHandler mItemsStateHandler; private ArrayList<Fragment.SavedState> mSavedState = new ArrayList<>(); private ArrayList<Fragment> mFragments = new ArrayList<>(); private Fragment mCurrentPrimaryItem = null; @SuppressLint("CommitTransaction") @Override public Object instantiateItem(ViewGroup container, int position) { // If we already have this item instantiated, there is nothing // to do. This can happen when we are restoring the entire pager // from its saved state, where the fragment manager has already // taken care of restoring the fragments we previously had instantiated. if (mFragments.size() > position) { Fragment f = mFragments.get(position); if (f != null) { return super.instantiateItem(container, position); } } if (mCurTransaction == null) { mCurTransaction = mFragmentManager.beginTransaction(); } Fragment fragment = getFragment(getItem(position), position); if (DEBUG) Log.d(TAG, "Adding item #" + position + ": f=" + fragment); if (mSavedState.size() > position) { Fragment.SavedState fss = mSavedState.get(position); if (fss != null) { fragment.setInitialSavedState(fss); } } while (mFragments.size() <= position) { mFragments.add(null); } fragment.setMenuVisibility(false); fragment.setUserVisibleHint(false); mFragments.set(position, fragment); mCurTransaction.add(container.getId(), fragment); return super.instantiateItem(container, position); } }
これが上のスーパーメソッドです
public abstract class ArrayPagerAdapter<T> extends PagerAdapter { @Override public Object instantiateItem(ViewGroup container, int position) { return items.get(position); } /** * Adds the specified item at the end of the array. * * @param item The item to add at the end of the array. */ public void add(T item) { synchronized (lock) { items.add(identifiedItemFactory.create(item)); } itemPositionChangeChecked = new SparseBooleanArray(this.items.size()); notifyDataSetChanged(); } /** * Adds the specified items at the end of the array. * * @param items The items to add at the end of the array. */ }
うえで使われているクラスです
static class IdentifiedItemFactory<T> { private long lastId; IdentifiedItemFactory(long firstId) { lastId = firstId; } IdentifiedItem<T> create(T item) { return new IdentifiedItem(lastId++, item); } ArrayList<IdentifiedItem<T>> createList(List<T> items) { ArrayList<IdentifiedItem<T>> list = new ArrayList(); for (T item : items) { list.add(create(item)); } return list; } @SafeVarargs final ArrayList createList(T... items) { return createList(new ArrayList<>(Arrays.asList(items))); } } static class IdentifiedItem<T> { long id; T item; public IdentifiedItem(long id, T item) { this.id = id; this.item = item; } @Override public String toString() { return "IdentifiedItem{" + "id=" + id + ", item=" + item + '}'; } }

回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/05/22 08:25
2016/05/22 09:13
2016/05/22 09:25
2016/05/22 09:38
2016/05/22 13:35
2016/05/22 14:15
2016/05/22 14:58
2016/05/23 01:12
2016/05/23 04:18