แฟรกเมนต์ดูเหมือนจะดีมากสำหรับการแยกตรรกะ UI ออกเป็นโมดูล แต่ตลอดViewPagerจนวงจรชีวิตของมันยังคงเป็นสิ่งที่ผิดสำหรับฉัน ดังนั้นความคิดของปราชญ์จึงเป็นสิ่งจำเป็นอย่างยิ่ง!
แก้ไข
ดูวิธีแก้ใบ้ด้านล่าง ;-)
ขอบเขต
กิจกรรมหลักมีViewPagerชิ้นส่วนด้วย แฟรกเมนต์เหล่านั้นสามารถใช้ตรรกะที่แตกต่างกันเล็กน้อยสำหรับกิจกรรมอื่น ๆ (ส่ง) ดังนั้นข้อมูลของแฟรกเมนต์จะถูกกรอกผ่านอินเตอร์เฟสการติดต่อกลับภายในกิจกรรม และทุกอย่างทำงานได้ดีในการเปิดตัวครั้งแรก แต่! ...
ปัญหา
เมื่อกิจกรรมถูกสร้างขึ้นใหม่ (เช่นการเปลี่ยนการวางแนว) ให้ทำViewPagerเศษของ รหัส (คุณจะพบด้านล่าง) บอกว่าทุกครั้งที่มีการสร้างกิจกรรมฉันพยายามที่จะสร้างViewPagerอะแดปเตอร์ชิ้นส่วนใหม่เช่นเดียวกับชิ้นส่วน (อาจเป็นปัญหา) แต่ FragmentManager ได้เก็บชิ้นส่วนเหล่านี้ไว้ที่ไหนซักแห่ง (ที่ไหน?) และ เริ่มกลไกการนันทนาการสำหรับผู้ที่ ดังนั้นกลไกการสันทนาการจึงเรียกส่วนของ "เก่า" ของ onAttach, onCreateView ฯลฯ ด้วยการติดต่อกลับของฉันสำหรับการเริ่มต้นข้อมูลผ่านวิธีการดำเนินการของกิจกรรม แต่วิธีนี้ชี้ไปที่ส่วนที่สร้างขึ้นใหม่ซึ่งสร้างขึ้นผ่านวิธีการ onCreate ของกิจกรรม
ปัญหา
บางทีฉันใช้รูปแบบที่ไม่ถูกต้อง แต่แม้กระทั่งหนังสือ Android 3 Pro ก็ไม่ได้มีอะไรมาก ได้โปรดให้หมัดหนึ่ง - สองและชี้ให้เห็นวิธีการทำอย่างถูกวิธี ขอบคุณมาก!
รหัส
กิจกรรมหลัก
public class DashboardActivity extends BasePagerActivity implements OnMessageListActionListener {
private MessagesFragment mMessagesFragment;
@Override
protected 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 pager
    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 adapter
    mPager = (ViewPager) findViewById(R.id.viewpager_pager);
    mPagerAdapter = new BasePagerAdapter(screens, getSupportFragmentManager());
    mPager.setAdapter(mPagerAdapter);
    // set title indicator
    TitlePageIndicator indicator = (TitlePageIndicator) findViewById(R.id.viewpager_titles);
    indicator.setViewPager(mPager, 1);
}
/* set of fragments callback interface implementations */
@Override
public void onMessageInitialisation() {
    Logger.d("Dash onMessageInitialisation");
    if (mMessagesFragment != null)
        mMessagesFragment.loadLastMessages();
}
@Override
public 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;
}
@Override
public Fragment getItem(int position) {
    return mScreens.values().toArray(new Fragment[mScreens.size()])[position];
}
@Override
public int getCount() {
    return mScreens.size();
}
@Override
public 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 after
@Override
public 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 interface
public interface OnMessageListActionListener {
    public void onMessageInitialisation();
    public void onMessageSelected(Message selectedMessage);
}
@Override
public void onAttach(Activity activity) {
    super.onAttach(activity);
    // setting callback
    mListener = (OnMessageListActionListener) activity;
    mIsLastMessages = activity instanceof DashboardActivity;
}
@Override
public 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);
}
@Override
public 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);
}
@Override
public 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... */
}สารละลาย
โซลูชันโง่คือการบันทึกชิ้นส่วนภายใน onSaveInstanceState (ของโฮสต์กิจกรรม) ด้วย putFragment และนำไปไว้ใน onCreate ผ่าน getFragment แต่ฉันก็ยังมีความรู้สึกแปลก ๆ ที่สิ่งต่าง ๆ จะไม่ทำงานอย่างนั้น ... ดูรหัสด้านล่าง:
    @Override
protected 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();
    ...
}