Làm cách nào để mở một phân đoạn mới từ một phân đoạn khác?


79

Tôi đã thử thực hiện điều hướng giữa các mảnh. Tôi đã làm việc NewFragment.javavới phân đoạn mới. Vấn đề của tôi là:

Làm cách nào để làm cho điều này onClickListenerchạy NewFragment.javachính xác?

button.setOnClickListener(new OnClickListener() {
    @Override
    public void onClick(View v) {

        Intent i = new Intent(getActivity(), NewFragment.class);
        startActivity(i);

    }
});

FYI: Đây là từ bên trong một mảnh vỡ (tôi không biết liệu điều đó có quan trọng không).


QUAN TRỌNG: Khi làm việc với phân mảnh, điều hướng có liên quan chặt chẽ đến tính năng máy chủ lưu trữ, do đó, bạn không thể chỉ nhảy từ phân mảnh này sang phân mảnh khác mà không triển khai lớp phân mảnh đó trong Hoạt động của máy chủ lưu trữ. Mẫu: public class MyHostActivity extends AppCompatActivity implements MyFragmentOne.OnFragmentInteractionListener { Ngoài ra, hãy kiểm tra hoạt động máy chủ của bạn có chức năng ghi đè tiếp theo không: `` @Override public void onFragmentInteraction (Uri uri) {} `Hy vọng điều này sẽ giúp ích ...
Gerry R

Câu trả lời:


148

Thêm mã sau vào chức năng nghe nhấp chuột của bạn,

NextFragment nextFrag= new NextFragment();
getActivity().getSupportFragmentManager().beginTransaction()
             .replace(R.id.Layout_container, nextFrag, "findThisFragment")
             .addToBackStack(null)
             .commit();

Chuỗi "findThisFragment"có thể được sử dụng để tìm đoạn sau này, nếu bạn cần.


13
sẽ là Layout_containergì?
Shailendra Madda

5
bất cứ ai có thể làm rõ những gì Layout_containernên được?
Huw Davies

8
Layout_container là id của phân đoạn hiện tại. Tôi khuyên bạn nên sử dụng ((ViewGroup) .getView (). GetParent ()). GetId () thay vì R.id.Layout_container.
BTR Naidu

layout_container là id của quan điểm hiện nay trong cách bố trí hoạt động mà bạn muốn thay thế một đoạn
Asad Ali

9
@BTRNaidu Nên là: ((ViewGroup) getView (). GetParent ()). GetId ();
KvnH

9

Đây là mã được mô tả nhiều hơn về mã của @ Narendra,

Đầu tiên, bạn cần một thể hiện của phân đoạn thứ hai. Sau đó, bạn sẽ có các đối tượng của FragmentManager và FragmentTransaction. Mã hoàn chỉnh như bên dưới,

Fragment2 fragment2=new Fragment2();
FragmentManager fragmentManager=getActivity().getFragmentManager();
FragmentTransaction fragmentTransaction=fragmentManager.beginTransaction();
fragmentTransaction.replace(R.id.content_main,fragment2,"tag");
fragmentTransaction.addToBackStack(null);
fragmentTransaction.commit();

Hy vọng điều này sẽ hiệu quả. Trong trường hợp bạn sử dụng android x , bạn cần getSupportFragmentManager () thay vì getFragmentManager ().


và sẽ content_mainlà gì?
Huw Davies

1
@HuwDavies giá trị của id cha Chế độ xem trong tệp bố cục Hoạt động máy chủ. Ví dụ: <FrameLayout android: id = "@ + id /gment_container" android: layout_width = "match_parent" android: layout_height = "match_parent" />
Eaweb

4

Bạn nên tạo một hàm bên trong hoạt động để mở phân đoạn mới và chuyển tham chiếu hoạt động đến phân đoạn và trên một số sự kiện bên trong phân đoạn gọi hàm này.


2
Từ bên trong một phân đoạn, bạn đã tự động có một tham chiếu đến hoạt động chính. Sử dụng getActivity () hoặc nếu bạn sử dụng onAttach thì hoạt động nằm trong các đối số.
miva2 21/09

3

Dùng cái này,

AppCompatActivity activity = (AppCompatActivity) view.getContext();
Fragment myFragment = new MyFragment();
activity.getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container, myFragment).addToBackStack(null).commit();

Tôi gặp lỗi addView (View) không được hỗ trợ trong AdapterView khi tôi sử dụng mã này bên trong customadapter mở rộng từ listadapter ... nên thay đổi như thế nào?
stefanosn

2
@Override
public void onListItemClick(ListView l, View v, int pos, long id) {
    super.onListItemClick(l, v, pos, id);
    UserResult nextFrag= new UserResult();
    this.getFragmentManager().beginTransaction()
    .replace(R.id.content_frame, nextFrag, null)
    .addToBackStack(null)
    .commit();  
}

Content_frame ở đâu? Là một bố cục khung?
luke chéo

2

Sử dụng Kotlin để thay thế một Fragmentbằng một cái khác chocontainer , bạn có thể làm

button.setOnClickListener {
    activity!!
        .supportFragmentManager
        .beginTransaction()
        .replace(R.id.container, NewFragment.newInstance())
        .commitNow()
}

0
 Fragment fr = new Fragment_class();
             FragmentManager fm = getFragmentManager();
            FragmentTransaction fragmentTransaction = fm.beginTransaction();
            fragmentTransaction.add(R.id.viewpagerId, fr);
            fragmentTransaction.commit();

R.id.viewpagerIdNói một cách chính xác, được đặt trong bố cục lớp hiện tại của bạn, khi gọi, phân đoạn mới sẽ tự động bị xâm nhập.


0

Đang thêm vào giải pháp @Narendra ...

QUAN TRỌNG: Khi làm việc với các phân đoạn, điều hướng có liên quan chặt chẽ đến tính năng máy chủ lưu trữ, do đó, bạn không thể chỉ nhảy từ phân mảnh này sang phân mảnh khác mà không triển khai lớp phân mảnh đó trong Hoạt động của máy chủ.

Mẫu vật:

public class MyHostActivity extends AppCompatActivity implements MyFragmentOne.OnFragmentInteractionListener {

Ngoài ra, hãy kiểm tra hoạt động máy chủ của bạn có chức năng ghi đè tiếp theo không:

@Override public void onFragmentInteraction(Uri uri) {} Hi vọng điêu nay co ich...


0

Chà vấn đề của tôi là tôi đã sử dụng mã từ câu trả lời, được kiểm tra như một giải pháp ở đây, nhưng sau khi thay thế được thực hiện, lớp đầu tiên vẫn hiển thị và hoạt động dưới phân đoạn vừa mở. Giải pháp của tôi rất đơn giản, tôi đã thêm

.remove(CourseListFragment.this)

CourseListFragment là một tệp lớp cho phân đoạn mà tôi đã cố gắng đóng. (MainActivity.java, nhưng đối với phần cụ thể (phân đoạn ngăn điều hướng), nếu nó có ý nghĩa hơn đối với bạn) vì vậy mã của tôi bây giờ trông giống như sau:

LecturesFragment nextFrag= new LecturesFragment();

                    getActivity().getSupportFragmentManager().beginTransaction()
                            .remove(CourseListFragment.this)
                            .replace(((ViewGroup)getView().getParent()).getId(), nextFrag, "findThisFragment")
                            .addToBackStack(null)
                            .commit();

Và nó hoạt động như một cái duyên đối với tôi.


0

trước hết, hãy đặt một ID cho bố cục Fragment của bạn, ví dụ:

<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
**android:id="@+id/cameraFragment"**
tools:context=".CameraFragment">

và sử dụng ID đó để thay thế dạng xem bằng một tệpgment.java khác. ví dụ

 ivGallary.setOnClickListener(new View.OnClickListener() {
      @Override
      public void onClick(View v) {
          UploadDoc uploadDoc= new UploadDoc();
          (getActivity()).getSupportFragmentManager().beginTransaction()
                  .replace(**R.id.cameraFragment**, uploadDoc, "findThisFragment")
                  .addToBackStack(null)
                  .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.