THÔNG TIN MỚI NHẤT:
tôi đã thu hẹp vấn đề của mình xuống thành vấn đề với việc lưu giữ các bản sao của các đoạn cũ và máy xem khung của tôi không đồng bộ với FragmentManager của tôi. Xem sự cố này ... http://code.google.com/p/android/issues/detail?id=19211#makechanges . Tôi vẫn không có manh mối làm thế nào để giải quyết điều này. Bất kỳ đề xuất...
Tôi đã cố gắng gỡ lỗi này trong một thời gian dài và bất kỳ trợ giúp nào sẽ được đánh giá rất cao. Tôi đang sử dụng FragmentPagerAdapter chấp nhận danh sách các đoạn như vậy:
List<Fragment> fragments = new Vector<Fragment>();
fragments.add(Fragment.instantiate(this, Fragment1.class.getName()));
...
new PagerAdapter(getSupportFragmentManager(), fragments);
Việc thực hiện là tiêu chuẩn. Tôi đang sử dụng ActionBarSherlock và thư viện khả năng tính toán v4 cho Fragment.
Vấn đề của tôi là sau khi rời khỏi ứng dụng và mở một số ứng dụng khác và quay lại, các phân đoạn sẽ mất tham chiếu trở lại FragmentActivity (tức là. getActivity() == null
). Tôi không thể hiểu tại sao điều này lại xảy ra. Tôi đã cố gắng thiết lập thủ công setRetainInstance(true);
nhưng điều này không giúp được gì. Tôi nhận ra rằng điều này xảy ra khi FragmentActivity của tôi bị phá hủy, tuy nhiên điều này vẫn xảy ra nếu tôi mở ứng dụng trước khi nhận được thông báo nhật ký. Có bất kỳ ý tưởng?
@Override
protected void onDestroy(){
Log.w(TAG, "DESTROYDESTROYDESTROYDESTROYDESTROYDESTROYDESTROY");
super.onDestroy();
}
Bộ chuyển đổi:
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();
}
}
Một trong những mảnh vỡ của tôi đã bị tước bỏ nhưng tôi đã hoàn thiện mọi thứ đã bị tước bỏ và vẫn không hoạt động ...
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);
}
}
}
Phương thức cập nhật được gọi khi người dùng tương tác với một phân đoạn khác và getActivity trả về null. Đây là phương thức mà đoạn kia đang gọi ...
((MyFragment) pagerAdapter.getItem(1)).update(id, name);
Tôi tin rằng khi ứng dụng bị phá hủy, sau đó được tạo lại thay vì chỉ khởi động ứng dụng đến phân đoạn mặc định, ứng dụng sẽ khởi động và sau đó người xem điều hướng đến trang cuối cùng đã biết. Điều này có vẻ lạ, không phải ứng dụng chỉ tải đến phân đoạn mặc định?