7

tôi đang làm việc trên giao dịch đoạn, và backstack là như thế này:PopBackStack nhưng giữ đoạn đầu tiên trong android

fragA => fragB => fragC => fragD 

Tôi muốn quay trở lại Fraga sau khi trở lại fromn các fragD

fragD => onBackPress => fragA 

Vì vậy, tôi đã cố gắng mã như:

getChildFragmentManager().popBackStack(null, FragmentManager.POP_BACK_STACK_INCLUSIVE); 

nhưng nó rõ ràng tất cả các backstack, làm thế nào tôi có thể giữ cho các mảnh vỡ đầu tiên trong ngày e backstack? Cảm ơn rất nhiều

Trả lời

10

Ví dụ: bạn có thể làm như sau:

  • add Fraga mà không cần thêm nó vào backStack. Vì vậy, nó luôn ở trong hoạt động
    và sẽ không phản ứng trên nút quay lại.
  • khi bạn mở fragD, bạn nên clear fragment BackStack. Vì vậy, khi bạn bấm lại nút từ D frag bạn quay trở lại A.

T.B. Có nhiều cách khác để làm những gì bạn muốn. Nó phụ thuộc ...

+1

Tôi xóa toàn bộ backstack, sau đó thêm lại fragA và fragD. cảm ơn – user782104

4

Vì "ngăn xếp ngược" có hành vi giống như chồng ... lần cuối, đầu tiên ... đoạn cuối cùng bạn thêm vào ngăn xếp sau sẽ được bật ra khỏi ngăn xếp trước . Bạn sẽ cần phải thực hiện hành vi mà bạn yêu cầu bằng tay bằng cách chỉ định của riêng bạn. Đây không phải là khó sử dụng phương pháp lớp học FragmentManager.

Nếu bạn "tag" mảnh vỡ của bạn khi bạn thêm chúng vào giao dịch ...

fragmentTransaction.add(new FragmentA(), "FragmentA_Tag"); 

sau đó bạn có thể xác định đoạn để hiển thị khi nút quay lại được nhấn ...

FragmentA f = fragmentManager.findFragmentByTag("FragmentA_Tag"); 
if(f != null){ 
    f.show(); 
} 

Cách bạn xác định phân đoạn nào hiển thị nó hoàn toàn tùy thuộc vào bạn. Bạn có thể theo dõi các đoạn nhìn thấy được hiện tại hoặc bạn có thể sử dụng phương thức isHidden của lớp Fragment ... BTW, tôi đang nói về các đoạn bản địa ở đây, không hỗ trợ phân đoạn của thư viện.

1

Hậu trường chứa các bản ghi về giao dịch chứ không phải bản thân các đoạn. Vì vậy, bạn không nên thêm bản ghi của giao dịch đầu tiên (null -> fragA) vào backstack. Và tất cả hồ sơ của giao dịch khác sẽ được thêm vào backstack. Trong trường hợp này, khi đó bạn đã thực hiện trước popBackStack(null, FragmentManager.POP_BACK_STACK_INCLUSIVE); android đã xóa tất cả các đoạn ngoại trừ fragA, vì không có bất kỳ bản ghi nào về cách thêm fragA.

1

Chỉ một vài ngày trước, tôi bắt đầu tìm hiểu về các phân đoạn trong Android. Và tôi cũng phải đối mặt với vấn đề này. Ở đây tôi thể hiện giải pháp của mình và cách tôi giải quyết vấn đề này. Vui lòng sửa lỗi nếu mã của tôi không đúng. Những gì chúng ta có vào lúc này? Năng suất, nhiều mảnh vỡ và hậu trường của chúng. Chúng tôi muốn mở tất cả các mảnh từ trình đơn ngăn kéo và xóa tất cả các mảnh khác từ backstack. Nhưng, chúng ta phải chỉ giữ một mảnh Home. Khi chúng ta ở lại trên mảnh Home và người dùng nhấn nút Back ứng dụng là goeing đóng cửa.

Hoạt động.lớp

protected void onCreate(Bundle savedInstanceState) 
{ 
    ... 
    // adding Home fragment without adding transaction into backstack 
    FragmentManager manager = getSupportFragmentManager(); 
    FragmentTransaction ft = manager.beginTransaction(); 
    ft.replace(R.id.container, HomeFragment.newInstance("args"), null); 
    ft.commit(); 
} 

@Override 
public void onBackPressed() { 
    if (getSupportFragmentManager().getBackStackEntryCount() == 0) { 
     finish(); 
    } 
} 

public void addFragmentFromMenu(Fragment fragment){ 
    String backStateName = fragment.getClass().getName(); 
    clearBackStack(); 
    FragmentManager manager = getSupportFragmentManager(); 
    if(manager.getBackStackEntryCount()> 0) 
    { 
     boolean fragmentPopped = manager.popBackStackImmediate(backStateName, 0); 

     if (!fragmentPopped && manager.findFragmentByTag(backStateName) == null) { 
      //fragment not in back stack, create it. 
      addFragment(fragment, manager, backStateName); 
     } 
    } 
    else // no fragments 
    { 
     addFragment(fragment, manager, backStateName); 
    } 
} 

public void addFragment(Fragment fragment, FragmentManager manager, String backStateName) 
{ 
    FragmentTransaction ft = manager.beginTransaction(); 
    ft.replace(R.id.container, fragment, backStateName); 
    ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE); 
    ft.addToBackStack(backStateName); 
    ft.commit(); 
} 

public void clearBackStack() { 
    getSupportFragmentManager().popBackStackImmediate(null, FragmentManager.POP_BACK_STACK_INCLUSIVE); 
} 

Và trên nhấp chuột vào ngăn kéo mục trình đơn

@Override 
public boolean onNavigationItemSelected(MenuItem item) { 

    int id = item.getItemId(); 

    if (id == R.id.nav_camera) { 
     addFragmentFromMenu(CameraFragment.newInstance("cam1", "cam2")); 
    } else if (id == R.id.nav_gallery) { 
     addFragmentFromMenu(TestFragment.newInstance("test1","test2")); 
    } 

    DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout); 
    drawer.closeDrawer(GravityCompat.START); 
    return true; 
} 
0

Tôi đã làm theo cách. Xóa tất cả các đoạn sau đó thêm đoạn nhà đầu tiên

FragmentManager fm = getActivity().getSupportFragmentManager(); 
        fm.popBackStack(Constants.TAG_HOME, FragmentManager.POP_BACK_STACK_INCLUSIVE); 

        ((MainActivity) activity).manageFragment(new HomeFragment(), Constants.TAG_HOME); 
//  write down below function in main activity    
    public void manageFragment(Fragment fragment, String tag) { 

      FragmentManager fragmentManager = getSupportFragmentManager(); 
      if (!fragmentManager.popBackStackImmediate(tag, 0)) { 

       FragmentTransaction ft = fragmentManager.beginTransaction(); 
       ft.add(R.id.content_frame, fragment, tag); 
       ft.addToBackStack(tag); 
       ft.commit(); 

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