Làm cách nào tôi có thể truy cập getSupportFragmentManager () trong một đoạn?


157

Tôi có một FragmentActivity và tôi muốn sử dụng một mảnh bản đồ bên trong nó. Tôi gặp sự cố khi yêu cầu trình quản lý phân đoạn hỗ trợ truy cập.

 if (googleMap == null) {
            googleMap = ((SupportMapFragment) getSupportFragmentManager()
                    .findFragmentById(R.id.map1)).getMap();

            // check if map is created successfully or not
            if (googleMap == null) {
                Toast.makeText(getApplicationContext(),
                        "Sorry! unable to create maps", Toast.LENGTH_SHORT)
                        .show();
            }
        }

            // create marker
            MarkerOptions marker = new MarkerOptions().position(
                    new LatLng(latitude, longitude)).title("Hello Maps ");

            CameraPosition cameraPosition = new CameraPosition.Builder()
                    .target(new LatLng(latitude, longitude)).zoom(15).build();

            googleMap.animateCamera(CameraUpdateFactory
                    .newCameraPosition(cameraPosition));

            // adding marker
            googleMap.addMarker(marker);

Câu trả lời:


278

Bạn có thể gọi trực tiếp

getFragmentManager() 

để có được người quản lý mảnh.

hoặc là

Trong mảnh của bạn,

Tạo trường:

private FragmentActivity myContext;

ghi đè phương thức onAttach của đoạn của bạn:

@Override
public void onAttach(Activity activity) {
    myContext=(FragmentActivity) activity;
    super.onAttach(activity);
}

Khi bạn cần nhận được cuộc gọi Trình quản lý phân đoạn hỗ trợ:

FragmentManager fragManager = myContext.getSupportFragmentManager(); //If using fragments from support v4

hoặc là

FragmentManager fragManager = myContext.getFragmentManager();

Bạn xong việc rồi.


3
Khi tôi nhấp vào lần đầu tiên nó hoạt động nhưng sau đó tiếp tục một số phân đoạn khác, tôi nhấp vào trang này, nó hiển thị trang trống ..
DjP

11
Đây là một chi phí. Xem câu trả lời của tôi dưới đây ... getFragmentManager () thực sự là tất cả những gì bạn cần.
Đánh dấu

4
Bạn không cần biến mContext toàn cầu ở đây, chỉ cần sử dụng getActivity () bất cứ nơi nào trong mã của bạn mà bạn cần. Vui lòng chỉnh sửa câu trả lời của bạn để bạn không hiểu sai người.
Varundroid

3
@Varundroid. Tôi đồng ý với thực tế là chúng ta có thể gọi getFragmentManager () bất cứ lúc nào. Nếu bạn có thể gửi cho tôi Id email của bạn, tôi có thể gửi cho bạn mã mẫu để chứng minh rằng có cơ hội trên trái đất để getActivity () trả về null.
Eldhose M Babu

1
@ androidplusios.design Bạn cần gọi getFragmentManager () chứ không phải getSupportFragementManager bên trong đoạn của bạn. getFragmentManager () là một hàm cá thể của lớp Fragment và vì vậy bạn có thể gọi nó trong một Fragment và nó sẽ lấy tham chiếu thể hiện hiện tại của lớp Fragment.
Eldhose M Babu

83

Tất cả bạn cần làm là sử dụng

getFragmentManager()

phương pháp trên mảnh của bạn. Nó sẽ cung cấp cho bạn trình quản lý phân đoạn hỗ trợ, khi bạn sử dụng nó trong khi thêm đoạn này.

Tài liệu mảnh


8
Đây phải là câu trả lời được chấp nhận, không nên giữ một tham chiếu đến hoạt động của phụ huynh như được đề xuất bởi câu trả lời đầu tiên.
Yoann Hercouet

1
@Mark đây là một câu trả lời hoàn hảo và nên là câu trả lời được chấp nhận.
Varundroid

3
Điều này sẽ trả về android.app.Fragment. Trong một số trường hợp, bạn cần android.support.app.v4.Fragment để nó không hoạt động mọi lúc.
mã hóa

1
Làm thế nào để khắc phục điều này? tôi nghĩ rằng tôi cần sự hỗ trợ.app.v4.Thực hiện một
Dennis Lukas

5
Điều này sẽ trả về FragmentManager thích hợp. Nếu trong một android.support.app.v4.Fragment, nó sẽ trả về điều tương tự như phương thức getSupportFragmentManager () trong Activity. Lý do phương thức được gọi đơn giản là getFragmentManager () trong trường hợp này là vì nó không tuyệt vời, không giống như trong trường hợp Hoạt động.
sai lầm

44

Đơn giản chỉ cần có được nó như thế này -

getFragmentManager() // This will also give you the SupportFragmentManager or FragmentManager based on which Fragment class you have extended - android.support.v4.app.Fragment OR android.app.Fragment.

HOẶC LÀ

getActivity().getSupportFragmentManager();

trong phương thức onActivityCreated () của Fragment và bất kỳ phương thức nào được gọi sau onActivityCreated ().


Đây là những gì tôi sử dụng, mặc dù tôi còn khá mới đối với phát triển Android và tôi không chắc liệu đó có phải là cách làm đúng hay không.
Papipo

@codecaster bạn cũng có thể lấy FragmentManager bằng phương thức getFragmentManager () của chính Fragment. Tôi đã chỉnh sửa câu trả lời của tôi.
Varundroid

1
Tôi có một dự án ở đây đã làm những điều kỳ lạ cho đến khi tôi trao đổi getFragmentManager () cho getActivity.getSupportFragmentManager ().
Papipo

Hừm lạ. Không bao giờ gặp phải một vấn đề như thế này cho đến nay nhưng không có giải pháp nào ở trên là xấu để bạn có thể sử dụng bất cứ điều gì hiệu quả cho bạn.
Varundroid

2
Tôi đã nhìn sâu vào các lớp từ tất cả các cách. Có vẻ đây là giải pháp tốt nhất cho những người sử dụng android.support.v4.app.Fragment
DearDhruv

16

Người dùng Kotlin thử câu trả lời này

(activity as AppCompatActivity).supportFragmentManager

3
Thật tốt là bạn đã đặt cái này ở đây, nếu không nó sẽ khiến tôi phát điên Ty
MePo

@ GiedriusŠlikas không hoạt động trong các mảnh hoặc hoạt động?
Ranjith Kumar

13

Nếu bạn gặp vấn đề này và đang ở cấp độ api 21+, hãy làm điều này:

   map = ((SupportMapFragment) getChildFragmentManager().findFragmentById(R.id.map))
                    .getMap();

cái này sẽ lấy bản đồ khi được sử dụng bên trong một mảnh.


1
Tôi đã thử tất cả các sửa lỗi mã được đề xuất ở trên, nhưng không thể làm cho chúng hoạt động được. getChildFragmentManager () đã thực hiện thủ thuật này! Cám ơn.
John Ward

Làm thế nào về mức độ api dưới 21? Api cấp 19 chẳng hạn?
Aliton Oliveira

6

Bạn có thể sử dụng getActivity().getSupportFragmentManager()bất cứ lúc nào bạn muốn để getSupportFragmentManager.

hệ thống phân cấp là Hoạt động -> phân đoạn. đoạn không có khả năng gọi trực tiếp getSupportFragmentManger nhưng Activity có thể. Vì vậy, bạn có thể sử dụng getActivity để gọi hoạt động hiện tại mà đoạn đó nằm trong và lấygetSupportFragmentManager()


5

Hoạt động cha mẹ của tôi mở rộng AppCompatActivity vì vậy tôi phải chuyển ngữ cảnh của mình sang AppCompatActivity thay vì chỉ Activity.

ví dụ.

FragmentAddProduct fragmentAddProduct = FragmentAddProduct.newInstance();
FragmentTransaction fragmentTransaction = ((AppCompatActivity)mcontext).getSupportFragmentManager().beginTransaction();

1
((AppCompatActivity) mContext)một phần là chính xác những gì tôi đang tìm kiếm. Cảm ơn bạn!
sHOLE

3

làm điều này trong mảnh của bạn

getActivity().getSupportFragmentManager()

3

getActivity().getFragmentManager() Điều này làm việc hoặc tôi.

Cũng hãy xem ở đây.



3

trong java bạn có thể thay thế bằng

getChildFragmentManager()

trong kotlin, làm cho nó đơn giản bằng

childFragmentManager

hy vọng nó sẽ giúp :)


2

Các mã sau đây lừa tôi

 SupportMapFragment mapFragment = ((SupportMapFragment) getChildFragmentManager().findFragmentById(R.id.map));
    mapFragment.getMapAsync(this);


1

Bạn chỉ có thể truy cập như

Context mContext;

public View onCreateView(LayoutInflater inflater,
                             @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {

mContext = getActivity();

}

và sau đó sử dụng

FragmentManager fm = ((FragmentActivity) mContext)
                        .getSupportFragmentManager();

1

Một số mã Kotlin để sử dụng supportFragmentManager bên trong Fragment.

  override fun onCreateView(
      inflater: LayoutInflater,
      container: ViewGroup?,
      savedInstanceState: Bundle?

  ): View? {

    super.onCreateView(inflater, container, savedInstanceState)
    val rootView = inflater.inflate(R.layout.fragment_home, container, false)

    // ....

    if (rootView.home_play_btn != null) {

      rootView.home_play_btn.setOnClickListener {
        val fragment: BaseFragment = ListFragment.newInstance()
        val fragManager: FragmentManager = (activity as AppCompatActivity).supportFragmentManager
        fragManager.beginTransaction()
            .replace(R.id.content_home_frame, fragment, TAG).commit()

      }

0

getSupportFragmentManager() được sử dụng khi bạn đang hoạt động và muốn lấy một đoạn nhưng trong đoạn bạn có thể truy cập

getSupportFragmentManager()

bằng cách sử dụng một phương thức khác được gọi là getFragmentMangaer()hoạt động tương tự getSupportFragmentManager()và bạn có thể sử dụng nó như bạn đã từng:

fragmentTransaction =getFragmentManager().beginTransaction();

0

Cách làm mới đơn giản trong kotlin

requireActivity().supportFragmentManager

-1

Thử cái này:

private SectionsPagerAdapter mSectionsPagerAdapter = new SectionsPagerAdapter(getActivity().getSupportFragmentManager());

Yêu cầu của bạn là gì, tôi nghĩ yêu cầu của bạn là xác định một máy nhắn tin bên trong một máy nhắn tin khác với sự trợ giúp của các mảnh vỡ bên trong các mảnh vỡ ..! tức là bạn cần vuốt một bố cục bên trong một bố cục có thể thay đổi?
Maddy

1
Lý do @VJ yêu cầu bạn mở rộng câu trả lời của mình là vì một dòng mã không phải là câu trả lời có chất lượng tốt. Nhiều người không phải là người hỏi ban đầu của câu hỏi sẽ thấy câu trả lời của bạn và có thể muốn sử dụng nó để giải quyết vấn đề của riêng họ. Sẽ rất hữu ích cho những người dùng đó nếu bạn thực sự giải thích vấn đề ban đầu là gì với câu hỏi, tại sao nó không hoạt động và tại sao giải pháp của bạn lại hiệu quả.
psubsee2003 17/07/14
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.