Câu trả lời:
Câu trả lời chính dựa vào tên được tạo bởi khung. Nếu điều đó thay đổi, thì nó sẽ không còn hoạt động nữa.
Điều gì về giải pháp này, ghi đè instantiateItem()
và destroyItem()
của bạn Fragment(State)PagerAdapter
:
public class MyPagerAdapter extends FragmentStatePagerAdapter {
SparseArray<Fragment> registeredFragments = new SparseArray<Fragment>();
public MyPagerAdapter(FragmentManager fm) {
super(fm);
}
@Override
public int getCount() {
return ...;
}
@Override
public Fragment getItem(int position) {
return MyFragment.newInstance(...);
}
@Override
public Object instantiateItem(ViewGroup container, int position) {
Fragment fragment = (Fragment) super.instantiateItem(container, position);
registeredFragments.put(position, fragment);
return fragment;
}
@Override
public void destroyItem(ViewGroup container, int position, Object object) {
registeredFragments.remove(position);
super.destroyItem(container, position, object);
}
public Fragment getRegisteredFragment(int position) {
return registeredFragments.get(position);
}
}
Điều này dường như làm việc cho tôi khi xử lý các mảnh vỡ có sẵn. Các mảnh chưa được khởi tạo, sẽ trả về null khi gọi getRegisteredFragment
. Nhưng tôi đã sử dụng này chủ yếu là để có được hiện tại Fragment
ra khỏi ViewPager
: adapater.getRegisteredFragment(viewPager.getCurrentItem())
và điều này sẽ không trở lại null
.
Tôi không biết về bất kỳ nhược điểm nào khác của giải pháp này. Nếu có, tôi muốn biết.
MyPagerAdapter
bị phá hủy do vòng đời (tức là xoay), sẽ không registerdFragments
bị mất? Liệu Activity
/ Fragment
sử dụng MyPagerAdapter
phải lưu nó trong onSaveInstanceState
, và sau đó cần phải cập nhật nó với các mới FragmentManager
ref?
getItem
không được gọi lại khi xoay (đối với bất kỳ đoạn nào đã được tạo), vì FragmentManager
khôi phục trạng thái của Fragments
nó giữ trong máy nhắn tin. Nếu instantiateItem
được gọi khi mỗi cái Fragment
được khôi phục, thì thực tế giải pháp này an toàn hơn và bằng chứng trong tương lai nhiều hơn so với câu trả lời của tôi hoặc được chấp nhận. Tôi sẽ xem xét thử bản thân mình.
Để lấy các đoạn từ ViewPager, có rất nhiều câu trả lời ở đây và trên các chủ đề / blog SO liên quan khác. Tất cả mọi người tôi đã thấy bị hỏng, và họ thường rơi vào một trong hai loại được liệt kê dưới đây. Có một số giải pháp có giá trị khác nếu bạn chỉ muốn lấy đoạn hiện nay, như này câu trả lời khác về chủ đề này.
Nếu sử dụng FragmentPagerAdapter
xem bên dưới. Nếu sử dụng FragmentStatePagerAdapter
giá trị của nó nhìn vào này . Việc lấy các chỉ mục không phải là chỉ số hiện tại trong FragmentStateAdOG không hữu ích vì bản chất của nó sẽ bị phá hủy hoàn toàn khỏi tầm nhìn / ra khỏi giới hạn offScreenLimit.
Sai: Duy trì danh sách các đoạn nội bộ của riêng bạn, được thêm vào khi FragmentPagerAdapter.getItem()
được gọi
SparseArray
hoặcMap
getItem
chỉ được gọi lần đầu tiên một trang được cuộn đến (hoặc thu được nếu ViewPager.setOffscreenPageLimit(x)
> 0) của bạn trong ViewPager
, nếu lưu trữ Activity
/ Fragment
bị giết hoặc khởi động lại thì nội bộ SpaseArray
sẽ bị xóa khi FragmentPagerActivity tùy chỉnh được tạo lại, nhưng đằng sau hậu trường Các đoạn nội bộ của ViewPager sẽ được tạo lại và getItem
sẽ KHÔNG được gọi cho bất kỳ chỉ mục nào, vì vậy khả năng lấy một đoạn từ chỉ mục sẽ bị mất vĩnh viễn. Bạn có thể giải thích điều này bằng cách lưu và khôi phục các tham chiếu đoạn này qua FragmentManager.getFragment()
và putFragment
điều này bắt đầu khiến IMHO lộn xộn.Sai: Xây dựng id thẻ của riêng bạn khớp với nội dung được sử dụng trong trình duyệtFragmentPagerAdapter
và sử dụng thẻ này để truy xuất trang Fragment từ trangFragmentManager
ViewPager
có thể thay đổi bất cứ lúc nào hoặc cho bất kỳ phiên bản hệ điều hành.Phương pháp được tạo lại cho giải pháp này là
private static String makeFragmentName(int viewId, long id) {
return "android:switcher:" + viewId + ":" + id;
}
ViewPager.instantiateItem()
Một cách tiếp cận tương tự như getItem()
trên nhưng không phá vỡ vòng đời là để nối vào instantiateItem()
thay vì getItem()
như trước đây sẽ được gọi mỗi khi chỉ mục được tạo / truy cập. Xem câu trả lời này
FragmentViewPager
Xây dựng FragmentViewPager
lớp của riêng bạn từ nguồn lib hỗ trợ mới nhất và thay đổi phương thức được sử dụng trong nội bộ để tạo các thẻ phân đoạn. Bạn có thể thay thế nó bằng dưới đây. Điều này có lợi thế là bạn biết việc tạo thẻ sẽ không bao giờ thay đổi và việc bạn không dựa vào một phương pháp / api riêng tư, điều này luôn nguy hiểm.
/**
* @param containerViewId the ViewPager this adapter is being supplied to
* @param id pass in getItemId(position) as this is whats used internally in this class
* @return the tag used for this pages fragment
*/
public static String makeFragmentName(int containerViewId, long id) {
return "android:switcher:" + containerViewId + ":" + id;
}
Như tài liệu đã nói, khi bạn muốn lấy một đoạn được sử dụng cho một chỉ mục, chỉ cần gọi một cái gì đó giống như phương thức này (mà bạn có thể đặt trong tùy chỉnh FragmentPagerAdapter
hoặc một lớp con) nhận thức được kết quả có thể là null nếu getItem chưa được gọi cho trang đó tức là chưa được tạo.
/**
* @return may return null if the fragment has not been instantiated yet for that position - this depends on if the fragment has been viewed
* yet OR is a sibling covered by {@link android.support.v4.view.ViewPager#setOffscreenPageLimit(int)}. Can use this to call methods on
* the current positions fragment.
*/
public @Nullable Fragment getFragmentForPosition(int position)
{
String tag = makeFragmentName(mViewPager.getId(), getItemId(position));
Fragment fragment = getSupportFragmentManager().findFragmentByTag(tag);
return fragment;
}
Đây là một giải pháp đơn giản và giải quyết các vấn đề trong hai giải pháp khác được tìm thấy ở mọi nơi trên web
instantiateItem()
, đó là khi bạn muốn truy cập vào một đoạn chưa được truy cập sau khi một sự kiện vòng đời đã diễn ra và được truy cập trước sự kiện vòng đời. Một sự khác biệt nhỏ mà tôi biết nhưng đó là một lỗi dẫn đến một lỗi nhỏ trong chương trình của tôi do đó tôi xem xét vấn đề này.
getItemId(pos)
bên trongFragmentStatePagerAdapter
Thêm các phương thức tiếp theo vào FragmentPagerAdOG của bạn:
public Fragment getActiveFragment(ViewPager container, int position) {
String name = makeFragmentName(container.getId(), position);
return mFragmentManager.findFragmentByTag(name);
}
private static String makeFragmentName(int viewId, int index) {
return "android:switcher:" + viewId + ":" + index;
}
getActiveFragment (0) phải hoạt động.
Đây là giải pháp được triển khai trong ViewPager https://gist.github.com/jacek-marchwicki/d6320ba9a910c514424d . Nếu một cái gì đó thất bại, bạn sẽ thấy nhật ký sự cố tốt.
Một giải pháp đơn giản khác:
public class MyPagerAdapter extends FragmentPagerAdapter {
private Fragment mCurrentFragment;
public Fragment getCurrentFragment() {
return mCurrentFragment;
}
//...
@Override
public void setPrimaryItem(ViewGroup container, int position, Object object) {
if (getCurrentFragment() != object) {
mCurrentFragment = ((Fragment) object);
}
super.setPrimaryItem(container, position, object);
}
}
setPrimaryItem()
được gọi sau khi ViewPager.OnPageChangeListener#onPageSelected()
tôi không thể sử dụng nó :-(
Tôi biết điều này có một vài câu trả lời, nhưng có lẽ điều này sẽ giúp được ai đó. Tôi đã sử dụng một giải pháp tương đối đơn giản khi tôi cần lấy Fragment
từ tôi ViewPager
. Trong Activity
hoặc Fragment
giữ ViewPager
, bạn có thể sử dụng mã này để duyệt qua mọi Fragment
mã giữ.
FragmentPagerAdapter fragmentPagerAdapter = (FragmentPagerAdapter) mViewPager.getAdapter();
for(int i = 0; i < fragmentPagerAdapter.getCount(); i++) {
Fragment viewPagerFragment = fragmentPagerAdapter.getItem(i);
if(viewPagerFragment != null) {
// Do something with your Fragment
// Check viewPagerFragment.isResumed() if you intend on interacting with any views.
}
}
Nếu bạn biết vị trí của bạn Fragment
trong ViewPager
, bạn chỉ có thể gọi getItem(knownPosition)
.
Nếu bạn không biết vị trí của bạn Fragment
trong ViewPager
, bạn có thể cho con bạn Fragments
thực hiện một giao diện với một phương thức như thế getUniqueId()
, và sử dụng nó để phân biệt chúng. Hoặc bạn có thể chuyển qua tất cả Fragments
và kiểm tra loại lớp, chẳng hạn nhưif(viewPagerFragment instanceof FragmentClassYouWant)
!!! BIÊN TẬP !!!
Tôi đã phát hiện ra rằng getItem
chỉ được gọi FragmentPagerAdapter
khi mỗi lần Fragment
cần được tạo lần đầu tiên , sau đó, nó xuất hiện cái Fragments
được tái chế bằng cách sử dụng FragmentManager
. Bằng cách này, nhiều triển khai FragmentPagerAdapter
tạo s mới . Sử dụng phương pháp trên của tôi, điều này có nghĩa là chúng tôi sẽ tạo s mới mỗi lần được gọi khi chúng tôi đi qua tất cả các mục trong . Do đó, tôi đã tìm thấy một cách tiếp cận tốt hơn, sử dụng để lấy từng cái thay thế (sử dụng câu trả lời được chấp nhận). Đây là một giải pháp đầy đủ hơn, và đã làm việc tốt cho tôi.Fragment
getItem
Fragment
getItem
FragmentPagerAdapter
FragmentManager
Fragment
FragmentPagerAdapter fragmentPagerAdapter = (FragmentPagerAdapter) mViewPager.getAdapter();
for(int i = 0; i < fragmentPagerAdapter.getCount(); i++) {
String name = makeFragmentName(mViewPager.getId(), i);
Fragment viewPagerFragment = getChildFragmentManager().findFragmentByTag(name);
// OR Fragment viewPagerFragment = getFragmentManager().findFragmentByTag(name);
if(viewPagerFragment != null) {
// Do something with your Fragment
if (viewPagerFragment.isResumed()) {
// Interact with any views/data that must be alive
}
else {
// Flag something for update later, when this viewPagerFragment
// returns to onResume
}
}
}
Và bạn sẽ cần phương pháp này.
private static String makeFragmentName(int viewId, int position) {
return "android:switcher:" + viewId + ":" + position;
}
ViewPager
nó đặt các thẻ đó. Giải pháp này rất mong manh vì nó dựa vào việc biết quy ước đặt tên "ẩn" của ViewPager
. Câu trả lời của Streets of Boston là một giải pháp toàn diện hơn nhiều, hiện tôi đang sử dụng trong dự án của mình (thay vì phương pháp này).
Đối với trường hợp của tôi, không có giải pháp nào ở trên hoạt động.
Tuy nhiên, vì tôi đang sử dụng Trình quản lý phân đoạn trẻ em trong một phân đoạn, nên sau đây đã được sử dụng:
Fragment f = getChildFragmentManager().getFragments().get(viewPager.getCurrentItem());
Điều này sẽ chỉ hoạt động nếu các đoạn của bạn trong Trình quản lý tương ứng với mục trình xem.
Để có được đoạn hiển thị hiện tại từ ViewPager . Tôi đang sử dụng tuyên bố đơn giản này và nó hoạt động tốt.
public Fragment getFragmentFromViewpager()
{
return ((Fragment) (mAdapter.instantiateItem(mViewPager, mViewPager.getCurrentItem())));
}
Tôi đã xử lý nó bằng cách đầu tiên lập danh sách tất cả các mảnh (List<Fragment> fragments;
) mà tôi sẽ sử dụng sau đó thêm chúng vào máy nhắn tin để dễ dàng xử lý đoạn hiện đang xem.
Vì thế:
@Override
onCreate(){
//initialise the list of fragments
fragments = new Vector<Fragment>();
//fill up the list with out fragments
fragments.add(Fragment.instantiate(this, MainFragment.class.getName()));
fragments.add(Fragment.instantiate(this, MenuFragment.class.getName()));
fragments.add(Fragment.instantiate(this, StoresFragment.class.getName()));
fragments.add(Fragment.instantiate(this, AboutFragment.class.getName()));
fragments.add(Fragment.instantiate(this, ContactFragment.class.getName()));
//Set up the pager
pager = (ViewPager)findViewById(R.id.pager);
pager.setAdapter(new MyFragmentPagerAdapter(getSupportFragmentManager(), fragments));
pager.setOffscreenPageLimit(4);
}
Vì vậy, điều này có thể được gọi là:
public Fragment getFragment(ViewPager pager){
Fragment theFragment = fragments.get(pager.getCurrentItem());
return theFragment;
}
vì vậy sau đó tôi có thể tặc lưỡi trong một câu lệnh if sẽ chỉ chạy nếu nó nằm trên đoạn đúng
Fragment tempFragment = getFragment();
if(tempFragment == MyFragmentNo2.class){
MyFragmentNo2 theFrag = (MyFragmentNo2) tempFragment;
//then you can do whatever with the fragment
theFrag.costomFunction();
}
nhưng đó chỉ là cách tiếp cận hack và slash của tôi nhưng nó hiệu quả với tôi, tôi sử dụng nó để thay đổi liên quan đến đoạn hiện đang hiển thị của tôi khi nhấn nút quay lại.
Điều này dựa trên câu trả lời của Steven ở trên. Điều này sẽ trả về ví dụ thực tế của đoạn đã được gắn vào hoạt động cha.
FragmentPagerAdapter fragmentPagerAdapter = (FragmentPagerAdapter) mViewPager.getAdapter();
for(int i = 0; i < fragmentPagerAdapter.getCount(); i++) {
Fragment viewPagerFragment = (Fragment) mViewPager.getAdapter().instantiateItem(mViewPager, i);
if(viewPagerFragment != null && viewPagerFragment.isAdded()) {
if (viewPagerFragment instanceof FragmentOne){
FragmentOne oneFragment = (FragmentOne) viewPagerFragment;
if (oneFragment != null){
oneFragment.update(); // your custom method
}
} else if (viewPagerFragment instanceof FragmentTwo){
FragmentTwo twoFragment = (FragmentTwo) viewPagerFragment;
if (twoFragment != null){
twoFragment.update(); // your custom method
}
}
}
}
Tôi không thể tìm thấy một cách đơn giản, sạch sẽ để làm điều này. Tuy nhiên, tiện ích ViewPager chỉ là một Viewgroup khác, nơi lưu trữ các đoạn của bạn. ViewPager có những mảnh vỡ này ngay lập tức. Vì vậy, bạn chỉ có thể lặp lại chúng (sử dụng .getChildCount () và .getChildAt ()) và xem liệu phiên bản phân đoạn mà bạn đang tìm kiếm hiện đang được tải vào ViewPager và có được tham chiếu đến nó không. Ví dụ: bạn có thể sử dụng một số trường ID duy nhất tĩnh để phân tách các mảnh.
Lưu ý rằng ViewPager có thể không tải đoạn bạn đang tìm vì nó là một thùng chứa ảo hóa như ListView.
FragmentPagerAdOG là nhà máy của các mảnh vỡ. Để tìm một đoạn dựa trên vị trí của nó nếu vẫn còn trong bộ nhớ, hãy sử dụng:
public Fragment findFragmentByPosition(int position) {
FragmentPagerAdapter fragmentPagerAdapter = getFragmentPagerAdapter();
return getSupportFragmentManager().findFragmentByTag(
"android:switcher:" + getViewPager().getId() + ":"
+ fragmentPagerAdapter.getItemId(position));
}
Mã mẫu cho api hỗ trợ v4.
Bạn không cần phải gọi getItem()
hoặc một số phương pháp khác ở giai đoạn sau để có được tham chiếu của một máy Fragment
chủ lưu trữ bên trong ViewPager
. Nếu bạn muốn cập nhật một số dữ liệu bên trong Fragment
thì hãy sử dụng phương pháp này: Cập nhật ViewPager một cách linh hoạt?
Điều quan trọng là thiết lập dữ liệu mới bên trong Adaper
và gọi notifyDataSetChanged()
lần lượt sẽ gọi getItemPosition()
, chuyển cho bạn một tham chiếu của bạn Fragment
và cho bạn cơ hội cập nhật dữ liệu đó. Tất cả các cách khác yêu cầu bạn tiếp tục tham khảo chính mình hoặc một số hack khác không phải là một giải pháp tốt.
@Override
public int getItemPosition(Object object) {
if (object instanceof UpdateableFragment) {
((UpdateableFragment) object).update(xyzData);
}
//don't return POSITION_NONE, avoid fragment recreation.
return super.getItemPosition(object);
}
getItemPosition()
là một phương pháp trong bộ chuyển đổi của bạn. Bạn sẽ không gọi nó trực tiếp. Bạn có một tham chiếu về bộ điều hợp của mình để bạn gọi adapter.notifyDataSetChanged()
lần lượt sẽ gọi getItemPosition()
bộ điều hợp của bạn bằng cách chuyển tham chiếu của Fragment
s. Bạn có thể thấy một triển khai đầy đủ trong hành động tại đây stackoverflow.com/questions/19891828/
Fragment
nhưng làm thế nào để có được một tài liệu tham khảo là có thể tranh luận. Các giải pháp khác có được tham chiếu từ FragmentManager
việc sử dụng một chuỗi tương tự "android:switcher:"+id
hoặc quay trở lại POSITION_NONE
từ việc getItemosition()
gây ra tất cả các đoạn để tự tạo lại.
Phải mở rộng FragmentPagerAdapter
vào lớp bộ điều hợp ViewPager của bạn.
Nếu bạn sử dụng FragmentStatePagerAdapter
thì bạn sẽ không thể tìm thấy bạn Fragment
bằng cách của mìnhID
public static String makeFragmentName(int viewPagerId, int index) {
return "android:switcher:" + viewPagerId + ":" + index;
}
Cách sử dụng phương pháp này: -
Fragment mFragment = ((FragmentActivity) getContext()).getSupportFragmentManager().findFragmentByTag(
AppMethodUtils.makeFragmentName(mViewPager.getId(), i)
);
InterestViewFragment newFragment = (InterestViewFragment) mFragment;
Này tôi đã trả lời câu hỏi này ở đây . Về cơ bản, bạn cần ghi đè
đối tượng công khai tức thìItem (thùng chứa Viewgroup, vị trí int)
phương thức của FragmentStatePagerAd CHƯƠNG.
Giải pháp tốt nhất là sử dụng tiện ích mở rộng mà chúng tôi đã tạo tại CodePath có tên SmartFragmentStatePagerAd CHƯƠNG . Theo hướng dẫn đó, điều này làm cho việc truy xuất các đoạn và đoạn hiện được chọn từ ViewPager dễ dàng hơn đáng kể. Nó cũng thực hiện công việc quản lý bộ nhớ của các đoạn được nhúng trong bộ điều hợp tốt hơn.
Cách dễ nhất và ngắn gọn nhất. Nếu tất cả các mảnh của bạn ViewPager
thuộc các lớp khác nhau, bạn có thể truy xuất và phân biệt chúng như sau:
public class MyActivity extends Activity
{
@Override
public void onAttachFragment(Fragment fragment) {
super.onAttachFragment(fragment);
if (fragment.getClass() == MyFragment.class) {
mMyFragment = (MyFragment) fragment;
}
}
}
Tôi thực hiện điều này dễ dàng với một cách tiếp cận khác nhau.
Phương thức FragmentAd Module.getItem tùy chỉnh của tôi trả về không phải MyFragment () mới, mà là ví dụ của MyFragment đã được tạo trong hàm tạo của FragmentAd CHƯƠNG.
Trong hoạt động của mình, sau đó tôi đã nhận được đoạn từ bộ điều hợp, kiểm tra xem nó có phải là Fragment hay không, sau đó sử dụng và sử dụng các phương thức cần thiết.
Tạo id tài nguyên số nguyên trong /values/integers.xml
<integer name="page1">1</integer>
<integer name="page2">2</integer>
<integer name="page3">3</integer>
Sau đó, trong hàm getagerem của PagerAdOG:
public Fragment getItem(int position) {
Fragment fragment = null;
if (position == 0) {
fragment = FragmentOne.newInstance();
mViewPager.setTag(R.integer.page1,fragment);
}
else if (position == 1) {
fragment = FragmentTwo.newInstance();
mViewPager.setTag(R.integer.page2,fragment);
} else if (position == 2) {
fragment = FragmentThree.newInstance();
mViewPager.setTag(R.integer.page3,fragment);
}
return fragment;
}
Sau đó, trong hoạt động viết hàm này để có được tham chiếu đoạn:
private Fragment getFragmentByPosition(int position) {
Fragment fragment = null;
switch (position) {
case 0:
fragment = (Fragment) mViewPager.getTag(R.integer.page1);
break;
case 1:
fragment = (Fragment) mViewPager.getTag(R.integer.page2);
break;
case 2:
fragment = (Fragment) mViewPager.getTag(R.integer.page3);
break;
}
return fragment;
}
Lấy tham chiếu đoạn bằng cách gọi hàm trên và sau đó chuyển nó tới đoạn tùy chỉnh của bạn:
Fragment fragment = getFragmentByPosition(position);
if (fragment != null) {
FragmentOne fragmentOne = (FragmentOne) fragment;
}
Cách dễ dàng để lặp lại các đoạn trong trình quản lý đoạn. Tìm viewpager, có đối số vị trí phần, được đặt trong Placeholder tĩnh tĩnh công khai newInstance (int partNumber) .
public PlaceholderFragment getFragmentByPosition(Integer pos){
for(Fragment f:getChildFragmentManager().getFragments()){
if(f.getId()==R.id.viewpager && f.getArguments().getInt("SECTNUM") - 1 == pos) {
return (PlaceholderFragment) f;
}
}
return null;
}
Trong mảnh vỡ
public int getArgument(){
return mPage;
{
public void update(){
}
Trong FragmentActivity
List<Fragment> fragments = getSupportFragmentManager().getFragments();
for(Fragment f:fragments){
if((f instanceof PageFragment)&&(!f.isDetached())){
PageFragment pf = (PageFragment)f;
if(pf.getArgument()==pager.getCurrentItem())pf.update();
}
}
trong TabLayout có nhiều tab cho Fragment. bạn có thể tìm thấy đoạn bằng Thẻ bằng cách sử dụng chỉ mục của đoạn.
Dành cho người cũ chỉ mục cho Fragment1 là 0, vì vậy, trong findFragmentByTag()
phương thức, hãy chuyển thẻ cho Viewpager. sau khi sử dụng FragmentTransaction bạn có thể thêm, thay thế đoạn.
String tag = "android:switcher:" + R.id.viewPager + ":" + 0;
Fragment1 f = (Fragment1) getSupportFragmentManager().findFragmentByTag(tag);
Ok cho bộ chuyển đổi FragmentStatePagerAdapter
tôi tài trợ một giải pháp:
trong FragmentActivity của bạn:
ActionBar mActionBar = getSupportActionBar();
mActionBar.addTab(mActionBar.newTab().setText("TAB1").setTabListener(this).setTag(Fragment.instantiate(this, MyFragment1.class.getName())));
mActionBar.addTab(mActionBar.newTab().setText("TAB2").setTabListener(this).setTag(Fragment.instantiate(this, MyFragment2.class.getName())));
mActionBar.addTab(mActionBar.newTab().setText("TAB3").setTabListener(this).setTag(Fragment.instantiate(this, MyFragment3.class.getName())));
viewPager = (STViewPager) super.findViewById(R.id.viewpager);
mPagerAdapter = new MyPagerAdapter(getSupportFragmentManager(), mActionBar);
viewPager.setAdapter(this.mPagerAdapter);
và tạo một metode trong lớp FragmentActivity của bạn - Vì vậy, phương thức đó cho phép bạn truy cập vào Fragment của mình, bạn chỉ cần cung cấp cho nó vị trí của đoạn bạn muốn:
public Fragment getActiveFragment(int position) {
String name = MyPagerAdapter.makeFragmentName(position);
return getSupportFragmentManager().findFragmentByTag(name);
}
trong Bộ chuyển đổi của bạn:
public class MyPagerAdapter extends FragmentStatePagerAdapter {
private final ActionBar actionBar;
private final FragmentManager fragmentManager;
public MyPagerAdapter(FragmentManager fragmentManager, com.actionbarsherlock.app.ActionBarActionBar mActionBar) {super(fragmentManager);
this.actionBar = mActionBar;
this.fragmentManager = fragmentManager;
}
@Override
public Fragment getItem(int position) {
getSupportFragmentManager().beginTransaction().add(mTchatDetailsFragment, makeFragmentName(position)).commit();
return (Fragment)this.actionBar.getTabAt(position);
}
@Override
public int getCount() {
return this.actionBar.getTabCount();
}
@Override
public CharSequence getPageTitle(int position) {
return this.actionBar.getTabAt(position).getText();
}
private static String makeFragmentName(int viewId, int index) {
return "android:fragment:" + index;
}
}
Fragment yourFragment = yourviewpageradapter.getItem(int index);
index
là vị trí của đoạn trong bộ điều hợp như bạn đã thêm fragment1
trước tiên, vì vậy, retreive fragment1
pass index
là 0 và cứ thế cho phần còn lại
Fragment
trong mộtWeakReference
để đảm bảo bạn không ngăn chặn một mảnh bị phá hủy khỏi rác được thu thập? Có vẻ như đó là điều đúng đắn ...