Tôi gặp vấn đề với FragmentStatePageAdapter (mà tôi sử dụng làm bộ điều hợp cho một ViewPager) và các mục menu từ thanh hành động.FragmentStatePageAdapter sao chép các mục menu ActionBar
Khi tôi khởi chạy ứng dụng, mọi thứ đều ổn. Nếu tôi di chuyển tác vụ sang nền (ví dụ, nhấn nút HOME) và tôi bắt đầu thực hiện công việc cho đến khi hoạt động kết thúc, khi tôi quay lại ứng dụng của mình (thông qua trình khởi chạy hoặc thông báo tôi tạo), mọi thứ đều ổn, ngoại trừ các mục menu được sao chép trong thanh tác vụ.
Một chi tiết quan trọng là các mục trùng lặp duy nhất là các mục được tạo trong onCreateOptionsMenu() của từng đoạn tôi sử dụng trong ViewPager.
Nếu tôi replaceFragmentStatePageAdapter với FragmentPageAdapter các mục không được sao chép nữa, nhưng các mảnh không được hiển thị trong ViewPager (hàm getItem() từ bộ điều hợp không bao giờ được gọi sao cho nó không trả về bất kỳ đoạn nào).
Bất kỳ ý tưởng nào? Một cách để tránh FragmentStatePageAdapter để sao chép các mục menu? Có thể sử dụng FragmentPageAdapter nhưng với một sửa đổi để hiển thị các mảnh? Một sửa đổi trong các mảnh của tôi?
Dưới đây là một số đoạn mã từ ứng dụng của tôi ...
Làm thế nào các mục menu được tạo ra bên trong các mảnh vỡ:
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
/* Create play button */
final MenuItem mPlay = menu.add(R.string.play_all);
mPlay.setIcon(R.drawable.ic_play_all);
mPlay.setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS);
mPlay.setOnMenuItemClickListener(new OnMenuItemClickListener() {
@Override
public boolean onMenuItemClick(MenuItem item) {
final List<Song> songs = getSongs();
if (songs.size() == 0) {
/* Show message */
Toast.makeText(mContext, R.string.no_song_list, Toast.LENGTH_LONG).show();
} else {
/* Play song list */
try { PlayManager.getService().playList(songs); } catch (Exception e) {}
}
return false;
}
});
/* Create menu */
super.onCreateOptionsMenu(menu, inflater);
}
Làm thế nào mảnh vỡ được khởi tạo trong adapter ViewPager
@Override
public Fragment getItem(int position) {
final Class<?> cls = mTabs.get(position);
/* No tab */
if (cls == null)
return null;
/* Instantiate fragment */
final Fragment fragment = Fragment.instantiate(mContext, cls.getName(), null);
/* Add to list */
mFragments.put(position, fragment);
/* Return fragment */
return fragment;
}
Cảm ơn!
PS: Tôi đã cố gắng thay đổi launchMode của hoạt động thành "singleTop" và tôi cũng đã cố gắng trả về trong getItem() đoạn tạo được ưu tiên (nhưng điều đó vô ích khi getItem() không bao giờ được gọi khi tôi quay lại ứng dụng , như tôi đã nói trước đây).
Xin chào, Miguel! Bạn đã tìm thấy giải pháp? – HighFlyer
Vâng. Tôi vừa đăng dưới giải pháp tôi đã sử dụng. Nó không phải là một sửa chữa thực sự nhưng một workaround. –