片段似乎是非常好的UI界面逻辑分成一些模块。但是随着ViewPager它的生命周期对我来说还是朦胧的。所以大师的想法是非常需要的!
编辑
看到下面的愚蠢的解决方案;-)
范围
主要活动有一个ViewPager片段。这些片段可以为其他(子域)活动实现一些不同的逻辑,所以片段的数据通过活动内的回调接口填充。而一切正常的第一次发射,但!!
问题
当活动被重新创建(例如在方向改变时),所以做ViewPager的碎片。代码(你会发现下面)说,每当创建活动,我尝试创建一个新的ViewPager片段适配器相同的片段(也许这是问题),但FragmentManager已经有所有这些片段存储的地方(?)和启动这些娱乐机制。因此,娱乐机制调用onAttach,onCreateView等“旧”片段与我的回调接口调用启动数据通过活动的实施方法。但是这个方法指向通过Activity的onCreate方法创建的新创建的片段。
问题
也许我正在使用错误的模式,但即使Android 3 Pro书也没有太多的关于它。所以,请给我一个两拳,指出如何正确的做法。非常感谢!
码
主要活动
public class DashboardActivity extends BasePagerActivity implements OnMessageListActionListener {private MessagesFragment mMessagesFragment;@Overrideprotected void onCreate(Bundle savedInstanceState) { Logger.d("Dash onCreate"); super.onCreate(savedInstanceState); setContentView(R.layout.viewpager_container); new DefaultToolbar(this); // create fragments to use mMessagesFragment = new MessagesFragment(); mStreamsFragment = new StreamsFragment(); // set titles and fragments for view page Map<String, Fragment> screens = new LinkedHashMap<String, Fragment>(); screens.put(getApplicationContext().getString(R.string.dashboard_title_dumb), new DumbFragment()); screens.put(getApplicationContext().getString(R.string.dashboard_title_messages), mMessagesFragment); // instantiate view pager via adapte mPager = (ViewPager) findViewById(R.id.viewpager_pager); mPagerAdapter = new BasePagerAdapter(screens, getSupportFragmentManager()); mPager.setAdapter(mPagerAdapter); // set title indicato TitlePageIndicator indicator = (TitlePageIndicator) findViewById(R.id.viewpager_titles); indicator.setViewPager(mPager, 1);}/* set of fragments callback interface implementations */@Overridepublic void onMessageInitialisation() { Logger.d("Dash onMessageInitialisation"); if (mMessagesFragment != null) mMessagesFragment.loadLastMessages();}@Overridepublic void onMessageSelected(Message selectedMessage) { Intent intent = new Intent(this, StreamActivity.class); intent.putExtra(Message.class.getName(), selectedMessage); startActivity(intent);}BasePagerActivity又名助手
public class BasePagerActivity extends FragmentActivity {BasePagerAdapter mPagerAdapter;ViewPager mPager;}适配器
public class BasePagerAdapter extends FragmentPagerAdapter implements TitleProvider {private Map<String, Fragment> mScreens;public BasePagerAdapter(Map<String, Fragment> screenMap, FragmentManager fm) { super(fm); this.mScreens = screenMap;}@Overridepublic Fragment getItem(int position) { return mScreens.values().toArray(new Fragment[mScreens.size()])[position];}@Overridepublic int getCount() { return mScreens.size();}@Overridepublic String getTitle(int position) { return mScreens.keySet().toArray(new String[mScreens.size()])[position];}// hack. we don't want to destroy our fragments and re-initiate them afte@Overridepublic void destroyItem(View container, int position, Object object) { // TODO Auto-generated method stub}}分段
public class MessagesFragment extends ListFragment {private boolean mIsLastMessages;private List<Message> mMessagesList;private MessageArrayAdapter mAdapter;private LoadMessagesTask mLoadMessagesTask;private OnMessageListActionListener mListener;// define callback interfacepublic interface OnMessageListActionListener { public void onMessageInitialisation(); public void onMessageSelected(Message selectedMessage);}@Overridepublic void onAttach(Activity activity) { super.onAttach(activity); // setting callback mListener = (OnMessageListActionListener) activity; mIsLastMessages = activity instanceof DashboardActivity;}@Overridepublic View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { inflater.inflate(R.layout.fragment_listview, container); mProgressView = inflater.inflate(R.layout.listrow_progress, null); mEmptyView = inflater.inflate(R.layout.fragment_nodata, null); return super.onCreateView(inflater, container, savedInstanceState);}@Overridepublic void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); // instantiate loading task mLoadMessagesTask = new LoadMessagesTask(); // instantiate list of messages mMessagesList = new ArrayList<Message>(); mAdapter = new MessageArrayAdapter(getActivity(), mMessagesList); setListAdapter(mAdapter);}@Overridepublic void onResume() { mListener.onMessageInitialisation(); super.onResume();}public void onListItemClick(ListView l, View v, int position, long id) { Message selectedMessage = (Message) getListAdapter().getItem(position); mListener.onMessageSelected(selectedMessage); super.onListItemClick(l, v, position, id);}/* public methods to load messages from host acitivity, etc... */}方案
愚蠢的解决方案是用putFragment将片段保存在onSaveInstanceState(主机Activity)中,并通过getFragment将它们放入onCreate中。但我仍然有一种奇怪的感觉,事情不应该这样...请参阅下面的代码:
@Overrideprotected void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); getSupportFragmentManager() .putFragment(outState, MessagesFragment.class.getName(), mMessagesFragment);}protected void onCreate(Bundle savedInstanceState) { Logger.d("Dash onCreate"); super.onCreate(savedInstanceState); ... // create fragments to use if (savedInstanceState != null) { mMessagesFragment = (MessagesFragment) getSupportFragmentManager().getFragment( savedInstanceState, MessagesFragment.class.getName()); StreamsFragment.class.getName()); } if (mMessagesFragment == null) mMessagesFragment = new MessagesFragment(); ...}相似问题