我有navigational drawer
和每個抽屜項目的片段。現在,在每個片段下,我們使用FragmentPagerAdapter
創建了多個片段。如何從不同類的片段中訪問方法?
我有3名抽屜的項目,如Home
,Group
和Feedback
。在Home
,有2個片段即My Profile
和Logged
所以我創建了一個滑動式的標籤爲My Profile
和Logged
而這兩個片段是家庭項目下。現在我必須在這兩個片段(My Profile, Logged
)中執行一些網絡調用,但是如何確定FragmentPagerAdapter
上的哪個片段處於活動狀態?是否有可能停止適配器提前創建碎片。
HomeFragment
DrawerModel model = new DrawerModel();
LoggedFragment loggedFrag = new LoggedFragment();
loggedFrag.setTargetFragment(loggedFrag, 0);
model.setFragment(loggedFrag);
dFragments.add(model);
model = new DrawerModel();
model.setDrawerTitle(getString(R.string.profile_tab_title));
model.setFragment(new ProfileFragment());
dFragments.add(model);
Bundle bundle = new Bundle();
bundle.putSerializable("fragments", dFragments);
fragment = new DrawerFragment();
fragment.setArguments(bundle);
navigateFragment(fragment);
DrawerFragment
public class DrawerFragment extends Fragment {
private FragmentAdapter pagerAdapter;
private ViewPager mViewPager;
private ArrayList<DrawerModel> fList;
@SuppressWarnings("unchecked")
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
fList = (ArrayList<DrawerModel>) getArguments().getSerializable(
"fragments");
View v = inflater.inflate(R.layout.swipe_tabs, container, false);
pagerAdapter = new FragmentAdapter(getChildFragmentManager(), fList);
mViewPager = (ViewPager) v.findViewById(R.id.pager);
mViewPager.setAdapter(pagerAdapter);
return v;
}
}
FragmentAdapter
public class FragmentAdapter extends FragmentStatePagerAdapter {
private int TOTAL_TABS = 0;
private ArrayList<DrawerModel> fragmentList;
private SparseArray<Fragment> mPageReference = new SparseArray<Fragment>();
public FragmentAdapter(FragmentManager fm, ArrayList<DrawerModel> fList) {
super(fm);
// TODO Auto-generated constructor stub
TOTAL_TABS = fList.size();
fragmentList = fList;
}
@Override
public Fragment getItem(int position) {
// TODO Auto-generated method stub
return fragmentList.get(position).getDrawerFragment();
}
@Override
public int getCount() {
// TODO Auto-generated method stub
return TOTAL_TABS;
}
@Override
public Object instantiateItem(ViewGroup container, int position) {
// TODO Auto-generated method stub
Fragment fragment = (Fragment) super.instantiateItem(container,
position);
mPageReference.put(position, fragment);
Log.d("FragmentAdapter - OnCreate", mPageReference.size() + "");
return fragment;
}
@Override
public CharSequence getPageTitle(int position) {
// TODO Auto-generated method stub
return fragmentList.get(position).getDrawerTitle();
}
@Override
public void destroyItem(ViewGroup container, int position, Object object) {
// TODO Auto-generated method stub
mPageReference.remove(position);
Log.d("FragmentAdapter - onDestroy", mPageReference.size() + "");
super.destroyItem(container, position, object);
}
public Fragment getFragment(int key) {
return mPageReference.get(key);
}
}
public class LoggedFragment extends Fragment implements OnClickListener {
TextView tHeader, tEmail, tvPhone;
SharedPreferences sp;
ImageView ivAds;
String bannerUrl = null;
private Handler handler = new Handler();
private static final String TAG = "LoggedFragment";
private void addListeners() {
// TODO Auto-generated method stub
ivAds.setOnClickListener(this);
}
Runnable updateImage = new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
if (Utility.checkConnectivity(getActivity()))
new ImageTask((Home_Activity) getActivity(), "Logged")
.execute();
handler.postDelayed(this, Utility.AD_DURATION);
}
};
@Override
public void onStart() {
// TODO Auto-generated method stub
super.onStart();
if (handler != null)
handler.post(updateImage);
}
@Override
public void onStop() {
// TODO Auto-generated method stub
super.onStop();
if (handler != null)
handler.removeCallbacks(updateImage);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// TODO Auto-generated method stub
View v = inflater.inflate(R.layout.logged_in, container, false);
bindComponents(v);
addListeners();
return v;
}
private void bindComponents(View v) {
// TODO Auto-generated method stub
ivAds = (ImageView) v.findViewById(R.id.ivLoggedAds);
}
public void updateBanner(Bitmap bitmap, String url) {
ivAds.setImageBitmap(bitmap);
bannerUrl = url;
}
}
Call to update fragment method
Fragment fragment = activity.getSupportFragmentManager()
.findFragmentById(R.id.content_frame)
.getTargetFragment();
if (fragment instanceof LoggedFragment) {
LoggedFragment logged = (LoggedFragment) fragment;
logged.updateBanner(result, parameter[1]);
} else
Log.d(TAG, "No Logged Fragment Found");
現在下登錄我的個人資料片段我需要動態儘快片段獲取一些數據是用戶,但無法看到這樣做?
任何想法/建議,非常感謝。
我們正在顯示自定義橫幅廣告,所以我們有從每個片段調用的自定義類,並且方法從自定義類更新。因此,我們需要調用自定義類即異步任務,以獲取橫幅並更新片段方法輪流顯示橫幅下適當的片段 – moDev 2014-12-10 20:10:17
當我嘗試從更新的異步任務'updateBanner'方法它永遠不會更新,它看起來片段不識別。 – moDev 2014-12-10 20:22:59
我知道何時調用'async task',但片段在異步任務中未被識別。請參閱調用以更新問題中的片段代碼。 – moDev 2014-12-10 20:34:15