2017-02-14 11 views
5

Tôi có 5 đoạn, hai trong số đó là Phân đoạn Danh sách chứa một số dữ liệu (tải đắt tiền) và phần còn lại không có gì quan trọng.Quản lý các giao dịch phân đoạn mà bạn không muốn mất dữ liệu cho một số đoạn

Mục tiêu của tôi là cách quản lý các giao dịch để chỉ một phần Danh sách vẫn còn trong bộ nhớ (mọi lúc) và khi tôi nhấn lại, nó sẽ hoàn nguyên về phân đoạn danh sách. Đây là một số mã một phần xử lý điều này cho trên của các mảnh nhưng vấn đề là khi tôi bấm lại nó không dỡ bỏ các mảnh hiện tại thay vì tải Fragment chính mà không loại bỏ các mảnh hiện tại.

WorkFlow: Fragment chính (Tasks Fragment) được tải vào lúc bắt đầu sau đó bất kỳ đoạn nào có thể được tải. nếu phân đoạn chính là mảnh hiện tại và nhóm được chọn sau đó loại bỏ đoạn chính nếu không thì bất kỳ đoạn nào khác được chọn sau đó giữ lại (ẩn) đoạn chính và tải đoạn mới

Lưu ý: Nó được sử dụng với Ngăn điều hướng trong đó 1 đoạn được tải lúc bắt đầu

public class FragmentController { 

    private static final String TAG_MAIN = "main"; //Expensive 
    private static final String TAG_GROUP = "group"; //Expensive 
    private static final String TAG_PROFILE = "profile"; //Cheap 
    private static final String TAG_CREATE_TASK = "create_task"; //Cheap 
    private static final String TAG_CREATE_GROUP = "create_group";//Cheap 
    private static final String TAG_SETTINGS = "settings"; //Cheap 

    private android.support.v4.app.FragmentManager fragmentManager; 


    @IdRes private int container; 

    public FragmentController(android.support.v4.app.FragmentManager fragmentManager, @IdRes int container) { 
     this.fragmentManager = fragmentManager; 
     this.container = container; 
    } 

    public void showMainFragment() { 
     FragmentTransaction transaction = fragmentManager.beginTransaction(); 
     if (containsMainFragment()) { 
      if (!isMainCurrent()) { 
       transaction 
         .show(getMainFragment()) 
         .commit(); 
      } 
     } else { 
      transaction 
        .replace(container, getMainFragment(), TAG_MAIN) 
        .commit(); 
     } 
    } 

    public void showGroupFragment() { 
     FragmentTransaction transaction = fragmentManager.beginTransaction(); 
     if (containsGroupFragment()) { 
      if (!isGroupCurrent()) { 
       transaction 
         .show(getGroupFragment()) 
         .commit(); 
      } 
     } else { 
      transaction 
        .replace(container, getGroupFragment(), TAG_GROUP) 
        .commit(); 
     } 
    } 

    public void showProfileFragment() { 
     showLightFragment(ProfileFragment.newInstance(), TAG_PROFILE); 
    } 

    public void showCreateTaskFragment() { 
     showLightFragment(CreateTaskFragment.newInstance(), TAG_CREATE_TASK); 
    } 

    public void showCreateGroupFragment() { 
     showLightFragment(CreateGroupFragment.newInstance(), TAG_CREATE_GROUP); 
    } 

    public void showSettingsFragment() { 
     showLightFragment(SettingsFragment.newInstance(), TAG_SETTINGS); 
    } 

    private void showLightFragment(Fragment fragmentInstance, String tag) { 
     FragmentTransaction transaction = fragmentManager.beginTransaction(); 
     Fragment fragment = getCurrentFragment(); 
     if (containsListFragment() && (isMainCurrent() || isGroupCurrent())) { 
      assert fragment != null; 
      transaction = transaction 
          .hide(fragment) 
          .add(container, fragmentInstance, tag) 
          .addToBackStack(tag); 
     } else { 
      transaction = transaction 
          .remove(fragment) 
          .add(container, fragmentInstance, tag); 
     } 
     if(isCreateTaskFragment(fragment)){ 

      transaction = transaction 
        .addToBackStack(tag); 
     } 
     transaction.commit(); 
    } 

    private boolean containsListFragment() { 
     return getFragmentByTag(TAG_MAIN) != null || getFragmentByTag(TAG_GROUP) != null; 
    } 

    private boolean containsMainFragment() { 
     return getFragmentByTag(TAG_MAIN) != null; 
    } 

    private boolean containsGroupFragment() { 
     return getFragmentByTag(TAG_GROUP) != null; 
    } 

    private Fragment getMainFragment() { 
     Fragment fragment = getFragmentByTag(TAG_MAIN); 
     if (fragment == null) { 
      fragment = TasksFragment.newInstance(); 
     } 
     return fragment; 
    } 

    private Fragment getGroupFragment() { 
     Fragment fragment = getFragmentByTag(TAG_GROUP); 
     if (fragment == null) { 
      fragment = GroupTasksFragment.newInstance(); 
     } 
     return fragment; 
    } 

    private Fragment getFragmentByTag(String tag) { 
     return fragmentManager.findFragmentByTag(tag); 
    } 

    private Fragment getCurrentFragment() { 
     return fragmentManager.findFragmentById(container); 
    } 

    private boolean isMainCurrent() { return isCurrent(TAG_MAIN); } 

    private boolean isGroupCurrent() { 
     return isCurrent(TAG_GROUP); 
    } 

    private boolean isCurrent(String tag) { 
     Fragment fragment = getCurrentFragment(); 
     return fragment != null && fragment.getTag() != null && fragment.getTag().equals(tag); 
    } 

    private boolean isCreateTaskFragment(Fragment fragment){ 
     return fragment!=null && fragment.getTag()!=null && fragment.getTag().equals(TAG_CREATE_TASK); 
    } 

} 
+0

Bạn đã cố gỡ lỗi ứng dụng chưa? Tôi nghi ngờ một vấn đề trong thuật toán showMainFragment của bạn. Bạn có thể monitore ngăn xếp mảnh trong studio android trong khi gỡ lỗi ứng dụng. – jdesesquelles

+0

@jdesesquelles Tôi có nhưng vấn đề là phần nào liên quan đến backstack nó hiện những gì nó là giả sử để làm nhưng không tách các Xem trước không có backstack thêm mảnh –

+0

Khó để nói. Nếu bạn có thể chia sẻ mã của bạn tôi sẽ có một cái nhìn. Bạn có thể tìm thấy nguồn cảm hứng ở đây: https://github.com/SimonVT/cathode. Một trường hợp tại điểm trong việc quản lý các mảnh vỡ. – jdesesquelles

Trả lời

0

Vâng cư trú vấn đề nhưng tôi đã kết thúc thay thế CreateTaskFragment (nào là vấn đề) với một hoạt động.

1

Bạn không nên thêm/xóa tất cả phân đoạn theo ý mình, theo cách thủ công. Bạn đang sử dụng backstack rồi. Bạn chỉ có thể thêm/ẩn (trong trường hợp bạn cần giữ lại đoạn trước) hoặc thay thế. Sau đó, hoạt động sẽ làm mọi thứ cho bạn với

@Override 
public void onBackPressed() { 
    if (getSupportFragmentManager().getBackStackEntryCount() > 0) { 
     getSupportFragmentManager().popBackStack(); 
    } else { 
     super.onBackPressed(); 
    } 
} 

Xem chi tiết tại đây: Performing Fragment Transactions

+0

Tâm trí giúp tôi ... Nếu bạn có thể cho tôi tên người dùng github của bạn, tôi sẽ thêm bạn vào repo? –

Các vấn đề liên quan