ข้อมูลล่าสุด:
ฉันได้ จำกัด ปัญหาของฉันให้แคบลงจนเป็นปัญหากับ fragmentManager ที่เก็บอินสแตนซ์ของแฟรกเมนต์เก่าและ viewpager ของฉันไม่ซิงค์กับ FragmentManager ของฉัน เห็นปัญหานี้ ... http://code.google.com/p/android/issues/detail?id=19211#makechanges ฉันยังไม่ทราบวิธีแก้ปัญหานี้ ข้อเสนอแนะใด ๆ ...
ฉันพยายามแก้ไขข้อบกพร่องนี้มานานแล้วและความช่วยเหลือใด ๆ จะได้รับการชื่นชมอย่างมาก ฉันใช้ FragmentPagerAdapter ซึ่งยอมรับรายการชิ้นส่วนดังนี้:
List<Fragment> fragments = new Vector<Fragment>();
fragments.add(Fragment.instantiate(this, Fragment1.class.getName()));
...
new PagerAdapter(getSupportFragmentManager(), fragments);
การนำไปใช้เป็นมาตรฐาน ฉันใช้ไลบรารีการคำนวณ ActionBarSherlock และ v4 สำหรับ Fragments
ปัญหาของฉันคือหลังจากออกจากแอปและเปิดแอปพลิเคชั่นอื่น ๆ และกลับมาส่วนย่อยจะสูญเสียการอ้างอิงกลับไปที่ FragmentActivity (เช่นgetActivity() == null
) ฉันไม่สามารถเข้าใจได้ว่าเหตุใดจึงเกิดขึ้น ฉันพยายามตั้งค่าด้วยตนเองsetRetainInstance(true);
แต่ไม่ได้ผล ฉันคิดว่าสิ่งนี้เกิดขึ้นเมื่อ FragmentActivity ของฉันถูกทำลายอย่างไรก็ตามสิ่งนี้ยังคงเกิดขึ้นหากฉันเปิดแอปก่อนที่ฉันจะได้รับข้อความบันทึก มีความคิดบ้างไหม?
@Override
protected void onDestroy(){
Log.w(TAG, "DESTROYDESTROYDESTROYDESTROYDESTROYDESTROYDESTROY");
super.onDestroy();
}
อะแดปเตอร์:
public class PagerAdapter extends FragmentPagerAdapter {
private List<Fragment> fragments;
public PagerAdapter(FragmentManager fm, List<Fragment> fragments) {
super(fm);
this.fragments = fragments;
}
@Override
public Fragment getItem(int position) {
return this.fragments.get(position);
}
@Override
public int getCount() {
return this.fragments.size();
}
}
เศษชิ้นส่วนชิ้นหนึ่งของฉันถูกปล้น แต่ฉันได้ทำการแก้ไขทุกอย่างที่ถูกถอดออกและยังใช้งานไม่ได้ ...
public class MyFragment extends Fragment implements MyFragmentInterface, OnScrollListener {
...
@Override
public void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
handler = new Handler();
setHasOptionsMenu(true);
}
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
Log.w(TAG,"ATTACHATTACHATTACHATTACHATTACH");
context = activity;
if(context== null){
Log.e("IS NULL", "NULLNULLNULLNULLNULLNULLNULLNULLNULLNULLNULL");
}else{
Log.d("IS NOT NULL", "NOTNOTNOTNOTNOTNOTNOTNOT");
}
}
@Override
public void onActivityCreated(Bundle savedState) {
super.onActivityCreated(savedState);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View v = inflater.inflate(R.layout.my_fragment,container, false);
return v;
}
@Override
public void onResume(){
super.onResume();
}
private void callService(){
// do not call another service is already running
if(startLoad || !canSet) return;
// set flag
startLoad = true;
canSet = false;
// show the bottom spinner
addFooter();
Intent intent = new Intent(context, MyService.class);
intent.putExtra(MyService.STATUS_RECEIVER, resultReceiver);
context.startService(intent);
}
private ResultReceiver resultReceiver = new ResultReceiver(null) {
@Override
protected void onReceiveResult(int resultCode, final Bundle resultData) {
boolean isSet = false;
if(resultData!=null)
if(resultData.containsKey(MyService.STATUS_FINISHED_GET)){
if(resultData.getBoolean(MyService.STATUS_FINISHED_GET)){
removeFooter();
startLoad = false;
isSet = true;
}
}
switch(resultCode){
case MyService.STATUS_FINISHED:
stopSpinning();
break;
case SyncService.STATUS_RUNNING:
break;
case SyncService.STATUS_ERROR:
break;
}
}
};
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
menu.clear();
inflater.inflate(R.menu.activity, menu);
}
@Override
public void onPause(){
super.onPause();
}
public void onScroll(AbsListView arg0, int firstVisible, int visibleCount, int totalCount) {
boolean loadMore = /* maybe add a padding */
firstVisible + visibleCount >= totalCount;
boolean away = firstVisible+ visibleCount <= totalCount - visibleCount;
if(away){
// startLoad can now be set again
canSet = true;
}
if(loadMore)
}
public void onScrollStateChanged(AbsListView arg0, int state) {
switch(state){
case OnScrollListener.SCROLL_STATE_FLING:
adapter.setLoad(false);
lastState = OnScrollListener.SCROLL_STATE_FLING;
break;
case OnScrollListener.SCROLL_STATE_IDLE:
adapter.setLoad(true);
if(lastState == SCROLL_STATE_FLING){
// load the images on screen
}
lastState = OnScrollListener.SCROLL_STATE_IDLE;
break;
case OnScrollListener.SCROLL_STATE_TOUCH_SCROLL:
adapter.setLoad(true);
if(lastState == SCROLL_STATE_FLING){
// load the images on screen
}
lastState = OnScrollListener.SCROLL_STATE_TOUCH_SCROLL;
break;
}
}
@Override
public void onDetach(){
super.onDetach();
if(this.adapter!=null)
this.adapter.clearContext();
Log.w(TAG, "DETACHEDDETACHEDDETACHEDDETACHEDDETACHEDDETACHED");
}
public void update(final int id, String name) {
if(name!=null){
getActivity().getSupportActionBar().setTitle(name);
}
}
}
เมธอดอัพเดตถูกเรียกเมื่อผู้ใช้โต้ตอบกับแฟรกเมนต์อื่นและ getActivity ส่งคืนค่าว่าง นี่คือวิธีการที่ส่วนอื่นเรียก ...
((MyFragment) pagerAdapter.getItem(1)).update(id, name);
ฉันเชื่อว่าเมื่อแอปถูกทำลายแล้วจะสร้างขึ้นอีกครั้งแทนที่จะเริ่มต้นแอปจนถึงแฟรกเมนต์เริ่มต้นแอปจะเริ่มทำงานจากนั้น viewpager จะไปยังหน้าที่รู้จักล่าสุด มันดูแปลก ๆ แอพไม่ควรโหลดเป็นแฟรกเมนต์เริ่มต้นใช่ไหม