Thay thế một đoạn bằng một đoạn khác trong nhóm hoạt động


136

Tôi có một đoạn trong một hoạt động nhóm và tôi muốn thay thế nó bằng một đoạn khác:

FragmentTransaction ft = getActivity().getFragmentManager().beginTransaction();
SectionDescriptionFragment bdf = new SectionDescriptionFragment();
ft.replace(R.id.book_description_fragment, bdf);
ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
ft.addToBackStack(null);
ft.commit();

Nó hoạt động tốt khi nó được thực hiện như một dự án riêng biệt mà không sử dụng nhóm hoạt động, mọi thứ đều hoạt động tốt trong log log khi điều khiển đi vào bên trong getview (), nhưng không có chế độ xem nào, thậm chí không có ngoại lệ nào phát sinh, tôi muốn phân đoạn chi tiết cuốn sách được thay thế bởi phần chi tiết.

Xml đoạn chi tiết sách có id book_description_fragment và xml cho đoạn mô tả phần có id part_description_fragment.

Đoạn mã trên nằm trong phương thức onClick của một mục, tôi muốn rằng khi người dùng chạm vào một mục trong chế độ xem cuộn ngang, thì đoạn đó sẽ thay đổi.

Câu trả lời:


249

Các đoạn được mã hóa cứng trong XML, không thể thay thế. Nếu bạn cần thay thế một đoạn bằng một đoạn khác, trước tiên bạn nên thêm chúng một cách linh hoạt.

Lưu ý: R.id.fragment_container là bố cục hoặc thùng chứa mà bạn chọn trong hoạt động bạn đang mang phân đoạn đến.

// Create new fragment and transaction
Fragment newFragment = new ExampleFragment();
FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();

// Replace whatever is in the fragment_container view with this fragment,
// and add the transaction to the back stack if needed
transaction.replace(R.id.fragment_container, newFragment);
transaction.addToBackStack(null);

// Commit the transaction
transaction.commit();

8
R.id.fragment_container trong trường hợp này là gì?
Guy

4
@Guy, Nó có thể là bất kỳ bố cục nào bạn muốn tải đoạn đó vào.
Subin Sebastian

1
Tên của đoạn trong tệp xml là gì? Tôi muốn thêm đoạn động và không muốn bất kỳ đoạn tĩnh nào.
Rajat Mehra

1
@RajatMehra Nếu bạn muốn thêm các đoạn một cách linh hoạt, bạn hoàn toàn không phải chỉ định đoạn trong XML. Bạn có thể sử dụng một khung nhìn container. Xin vui lòng đọc câu trả lời một lần nữa.
Subin Sebastian

4
@AHmed Lý do là, theo kiến ​​trúc, hệ thống thay thế mọi thẻ <Fragment> bằng chế độ xem (nhóm) được cung cấp bởi các đoạn tương ứng ' onCreateView(). Do đó, như bạn có thể giả định, bất kỳ tham chiếu nào đến đoạn thực sự bị mất ở cấp độ xem. Vì vậy, về cơ bản, bạn không thể thay thế một đoạn, nhưng thay vào đó, bạn có thể xóa thủ công các khung nhìn hiện có trong thùng chứa và đặt một đoạn ở đó nếu cần.
Subin Sebastian

35

Xin vui lòng xem câu hỏi này

Bạn chỉ có thể thay thế một " đoạn được thêm động ".

Vì vậy, nếu bạn muốn thêm một đoạn động, hãy xem ví dụ này .


1
Chào . Tôi đã phát hiện ra giải pháp, thực ra tôi đã không đặt nội dung của đoạn trong bố cục thay vào đó tôi đang sử dụng một đoạn khác cho nội dung của đoạn trước
Lion Heart

Không, ở đây tôi đang tìm cách thay thế toàn bộ mảnh bằng một mảnh mới.
Sana

1
@Lion Heart, bạn có thể giải thích các giải pháp bạn tìm thấy không?
Namratha

Liên kết đã chết: /
Chiến tranh neon

8

Tôi đã thực hiện một ý chính với phương pháp hoàn hảo để quản lý thay thế mảnh vỡvòng đời .

Nó chỉ thay thế đoạn hiện tại bằng một đoạn mới, nếu nó không giống nhau và nếu nó không ở trong backstack (trong trường hợp này nó sẽ bật nó).

Nó chứa một số tùy chọn như thể bạn muốn đoạn được lưu trong backstack.

=> Xem Gist tại đây

Sử dụng hoạt động này và một Hoạt động duy nhất, bạn có thể muốn thêm hoạt động này vào hoạt động của mình:

@Override
public void onBackPressed() {
    int fragments = getSupportFragmentManager().getBackStackEntryCount();
    if (fragments == 1) {
            finish();
            return;
    }

    super.onBackPressed();
}

1
@ RémiP liên kết đang hoạt động như mong đợi. Bạn có thể kiểm tra cái này có thể tốt hơn IMO github.com/HugoGresse/Anecdote/blob/master/app/src/main/java/io/iêu
Hugo Gresse

8

Sử dụng mã dưới đây trong android.support.v4

FragmentTransaction ft1 = getFragmentManager().beginTransaction();
WebViewFragment w1 = new WebViewFragment();
w1.init(linkData.getLink());
ft1.addToBackStack(linkData.getName());
ft1.replace(R.id.listFragment, w1);
ft1.commit();

4

Sử dụng mã này bằng v4

 ExampleFragment newFragment = new ExampleFragment();     
 FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();  
 // Replace whatever is in the fragment_container view with this fragment,  
 // and add the transaction to the back stack so the user can navigate back   
 transaction.replace(R.id.container, newFragment);
 transaction.addToBackStack(null);  
 // Commit the transaction   
 transaction.commit();

3

hy vọng bạn đang làm tốt. Khi tôi bắt đầu làm việc Android Fragmentsthì tôi cũng gặp vấn đề tương tự sau đó tôi đọc về 1- Cách chuyển đoạn với người khác. 2- Cách thêm đoạn nếu Fragment containerkhông có đoạn nào.

Sau đó, sau một số nghiên cứu và phát triển, tôi đã tạo ra một chức năng giúp tôi trong nhiều Dự án cho đến bây giờ và tôi vẫn đang sử dụng chức năng đơn giản này.

public void switchFragment(BaseFragment baseFragment) {
    try {
        FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
        ft.setCustomAnimations(android.R.anim.slide_in_left, android.R.anim.slide_out_right);
        if (getSupportFragmentManager().findFragmentById(R.id.home_frame) == null) {
            ft.add(R.id.home_frame, baseFragment);
        } else {
            ft.replace(R.id.home_frame, baseFragment);
        }
        ft.addToBackStack(null);
        ft.commit();
    } catch (Exception e) {
        e.printStackTrace();
    }
}

tận hưởng thời gian mã của bạn :)


3

Sử dụng ViewPager. Đó là công việc của tôi.

final ViewPager viewPager = (ViewPager) getActivity().findViewById(R.id.vp_pager); 
button = (Button)result.findViewById(R.id.button);
button.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        viewPager.setCurrentItem(1);
    }
});

1

Bạn có thể sử dụng mã này

((AppCompatActivity) getActivity()).getSupportFragmentManager().beginTransaction().replace(R.id.YourFrameLayout, new YourFragment()).commit();

hoặc bạn có thể sử dụng mã này

YourFragment fragments=(YourFragment) getSupportFragmentManager().findFragmentById(R.id.FrameLayout);

        if (fragments==null) {
            getSupportFragmentManager().beginTransaction().replace(R.id.FrameLayout, new Fragment_News()).commit();
        }

0

Trong kotlin bạn có thể làm:

// instantiate the new fragment
val fragment: Fragment = ExampleFragment()

val transaction = supportFragmentManager.beginTransaction()
transaction.replace(R.id.book_description_fragment, fragment)
transaction.addToBackStack("transaction_name")
// Commit the transaction
transaction.commit()

0

bạn có thể sử dụng mã đơn giản để làm việc

Fragment newFragment = new MainCategoryFragment();
FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
ft.replace(R.id.content_frame_NavButtom, newFragment);
ft.commit(); 

0

Tôi thay đổi phân đoạn động trong mã dòng đơn.
Nó hoạt động trong mọi phiên bản SDK và androidx
tôi sử dụng điều hướng nhưBottomNavigationView

    BottomNavigationView btn_nav;
    FragmentFirst fragmentFirst;
    FragmentSecond fragmentSecond;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_search);
        fragmentFirst = new FragmentFirst();
        fragmentSecond = new FragmentSecond ();
        changeFragment(fragmentFirst); // at first time load the fragmentFirst
        btn_nav = findViewById(R.id.bottomNav);
        btn_nav.setOnNavigationItemSelectedListener(new BottomNavigationView.OnNavigationItemSelectedListener() {
            @Override
            public boolean onNavigationItemSelected(@NonNull MenuItem menuItem) {
                switch(menuItem.getItemId()){
                    case R.id.menu_first_frag:
                        changeFragment(fragmentFirst); // change fragmentFirst
                        break;
                    case R.id.menu_second_frag:
                        changeFragment(fragmentSecond); // change fragmentSecond
                        break;
                        default:
                            Toast.makeText(SearchActivity.this, "Click on wrong bottom SORRY!", Toast.LENGTH_SHORT).show();
                }
                return true;
            }
        });
    }
public void changeFragment(Fragment fragment) {
        getSupportFragmentManager().beginTransaction().replace(R.id.fragment_layout_changer, fragment).commit();
    }
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.