ฉันจะเข้าถึง getSupportFragmentManager () ในส่วนได้อย่างไร


157

ฉันมี FragmentActivity และฉันต้องการใช้ชิ้นส่วนแผนที่ภายใน ฉันมีปัญหาในการรับตัวจัดการชิ้นส่วนสนับสนุนเพื่อเข้าถึง

 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);

คำตอบ:


278

คุณสามารถโทรโดยตรง

getFragmentManager() 

เพื่อรับตัวจัดการส่วน

หรือ

ในส่วนของคุณ

สร้างฟิลด์:

private FragmentActivity myContext;

แทนที่ onAttach วิธีการในส่วนของคุณ:

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

เมื่อคุณต้องการรับสายผู้จัดการฝ่ายสนับสนุน:

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

หรือ

FragmentManager fragManager = myContext.getFragmentManager();

คุณทำเสร็จแล้ว


3
เมื่อฉันคลิกครั้งแรกที่มันทำงาน แต่หลังจากนั้นไปในส่วนอื่น ๆ บางอย่างอีกครั้งฉันคลิกที่นี้มันแสดงให้เห็นหน้าว่าง ..
DJP

11
นี่คือค่าใช้จ่าย ดูคำตอบของฉันด้านล่าง ... getFragmentManager () เป็นสิ่งที่คุณต้องการจริงๆ
Mark

4
คุณไม่ต้องการตัวแปร mContext ทั่วโลกที่นี่เพียงใช้ getActivity () ทุกที่ในรหัสที่คุณต้องการ โปรดแก้ไขคำตอบของคุณเพื่อไม่ให้ผู้อื่นเข้าใจผิดในทิศทางที่ผิด
Varundroid

3
@Varundroid ฉันยอมรับความจริงที่ว่าเราสามารถโทรหา getFragmentManager () ได้ทุกเวลา หากคุณสามารถส่งรหัสอีเมลของคุณให้ฉันฉันสามารถส่งรหัสตัวอย่างเพื่อพิสูจน์ว่ามีโอกาสบนโลกที่ getActivity () เพื่อส่งคืน null
Eldhose M Babu

1
@ androidplusios.design คุณต้องโทรหา getFragmentManager () และไม่ใช่ getSupportFragementManager ภายในแฟรกเมนต์ของคุณ getFragmentManager () เป็นฟังก์ชั่นอินสแตนซ์ของคลาส Fragment และคุณสามารถเรียกมันได้ใน Fragment และมันจะทำการอ้างอิงอินสแตนซ์ปัจจุบันของคลาส Fragment ที่มี
Eldhose M Babu

83

สิ่งที่คุณต้องทำคือใช้

getFragmentManager()

วิธีการในส่วนของคุณ มันจะให้ผู้จัดการชิ้นส่วนสนับสนุนเมื่อคุณใช้มันในขณะที่เพิ่มส่วนนี้

เอกสารชิ้นส่วน


8
นี่ควรเป็นคำตอบที่ยอมรับไม่แนะนำให้อ้างอิงกิจกรรมหลักตามคำแนะนำแรก
Yoann Hercouet

1
@ มาร์คเป็นคำตอบที่สมบูรณ์แบบและควรเป็นคำตอบที่ยอมรับได้
Varundroid

3
นี่จะส่งคืน android.app.Fragment ในบางกรณีคุณต้องมี android.support.app.v4.Fragment ดังนั้นมันจะไม่ทำงานตลอดเวลา
codingpuss

1
จะแก้ไขได้อย่างไร? ฉันคิดว่าฉันต้องการ support.app.v4.Fragment one
Dennis Lukas

5
สิ่งนี้จะส่งคืน FragmentManager ที่เหมาะสม หากใน android.support.app.v4.Fragment มันจะส่งคืนสิ่งเดียวกันกับเมธอด getSupportFragmentManager () ใน Activity เหตุผลที่วิธีการที่เรียกว่าเพียงแค่ getFragmentManager () ในกรณีนี้เป็นเพราะมันไม่ได้เป็นที่น่าสงสัยเหมือนในกรณีของกิจกรรม
Blunden

44

รับแบบนี้ -

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.

หรือ

getActivity().getSupportFragmentManager();

ในเมธอด onActivityCreated () ของ Fragment และวิธีการใด ๆ ที่ถูกเรียกหลังจาก onActivityCreated ()


นี่คือสิ่งที่ฉันใช้แม้ว่าฉันจะค่อนข้างใหม่สำหรับการพัฒนา Android และฉันไม่แน่ใจว่ามันเป็นวิธีที่ถูกต้องในการทำสิ่งต่าง ๆ
Papipo

@codecaster คุณสามารถรับ FragmentManager โดยใช้วิธี getFragmentManager () ของ Fragment เองเช่นกัน ฉันได้แก้ไขคำตอบของฉัน
Varundroid

1
ฉันมีโครงการที่ทำสิ่งแปลก ๆ จนกว่าฉันจะเปลี่ยน getFragmentManager () สำหรับ getActivity.getSupportFragmentManager ()
Papipo

อืมแปลกมาก ไม่เคยพบปัญหาแบบนี้มาก่อน แต่ไม่มีวิธีการแก้ปัญหาใดที่กล่าวมาข้างต้นไม่ดีดังนั้นคุณสามารถใช้สิ่งที่เหมาะกับคุณได้
Varundroid

2
ฉันดูลึกลงไปในชั้นเรียนจากทุกทาง ดูเหมือนว่านี่เป็นทางออกที่ดีที่สุดที่ใช้ android.support.v4.app.Fragment
DearDhruv

16

ผู้ใช้ Kotlin ลองคำตอบนี้

(activity as AppCompatActivity).supportFragmentManager

3
สิ่งที่ดีที่คุณใส่ไว้ที่นี่ไม่เช่นนั้นมันจะทำให้ฉันเป็นบ้า Ty
MePo

@ GiedriusŠlikasไม่ทำงานในชิ้นส่วนหรือกิจกรรม?
Ranjith Kumar

13

หากคุณมีปัญหานี้และอยู่ในระดับ api 21+ ให้ทำดังนี้

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

สิ่งนี้จะได้รับแผนที่เมื่อใช้งานภายในแฟรกเมนต์


1
ฉันพยายามแก้ไขรหัสที่แนะนำทั้งหมดข้างต้น แต่ไม่สามารถใช้งานได้ getChildFragmentManager () ได้หลอกลวง! ขอบคุณ.
John Ward

ระดับ api ต่ำกว่า 21 อย่างไร Api ระดับ 19 เช่น?
Aliton Oliveira

6

คุณสามารถใช้getActivity().getSupportFragmentManager()ทุกเวลาที่คุณต้องการรับ SupportFragmentManager

ลำดับชั้นคือกิจกรรม -> ส่วน แฟรกเมนต์ไม่สามารถโทรหา getSupportFragmentManger โดยตรง แต่สามารถทำกิจกรรมได้ ดังนั้นคุณสามารถใช้ getActivity เพื่อเรียกใช้กิจกรรมปัจจุบันที่มีแฟรกเมนต์อยู่และรับgetSupportFragmentManager()


5

กิจกรรมผู้ปกครองของฉันขยาย AppCompatActivity ดังนั้นฉันจึงต้องนำบริบทของฉันไปใช้กับ AppCompatActivity แทนที่จะเป็นเพียงกิจกรรม

เช่น.

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

1
((AppCompatActivity) mContext)ส่วนหนึ่งคือสิ่งที่ฉันกำลังมองหา ขอบคุณ!
2560




3

ใน java คุณสามารถแทนที่ด้วย

getChildFragmentManager()

ใน kotlin ทำให้ง่ายขึ้นด้วย

childFragmentManager

หวังว่ามันจะช่วย :)


2

รหัสต่อไปนี้จะเป็นการหลอกลวงสำหรับฉัน

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


1

คุณสามารถเข้าถึงได้อย่างง่ายดาย

Context mContext;

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

mContext = getActivity();

}

แล้วใช้

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

1

โค้ด Kotlin บางตัวเพื่อใช้ supportFragmentManager ภายใน 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() ใช้เมื่อคุณอยู่ในกิจกรรมและต้องการรับแฟรกเมนต์ แต่ในแฟรกเมนต์คุณสามารถเข้าถึงได้

getSupportFragmentManager()

โดยใช้วิธีอื่นที่เรียกว่าgetFragmentMangaer()ทำงานเหมือนกันgetSupportFragmentManager()และคุณสามารถใช้งานได้เหมือนที่เคยทำ:

fragmentTransaction =getFragmentManager().beginTransaction();


-1

ลองสิ่งนี้:

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

ความต้องการของคุณคืออะไรฉันคิดว่าความต้องการของคุณคือการกำหนดเพจเจอร์ภายในเพจเจอร์อื่นด้วยความช่วยเหลือของชิ้นส่วนภายในแฟรกเมนต์ .. ! เช่นคุณต้องปัดเค้าโครงภายในเค้าโครงที่เลื่อนได้หรือไม่
แมดดี้

1
เหตุผลที่ @VJ ขอให้คุณขยายคำตอบของคุณเป็นเพราะบรรทัดของรหัสไม่ใช่คำตอบที่มีคุณภาพดี หลายคนที่ไม่ใช่ผู้ถามดั้งเดิมของคำถามจะเห็นคำตอบของคุณและอาจต้องการใช้เพื่อแก้ปัญหาของพวกเขาเอง มันจะเป็นประโยชน์สำหรับผู้ใช้เหล่านั้นถ้าคุณอธิบายว่าปัญหาดั้งเดิมของปัญหาคืออะไรทำไมมันไม่ทำงานและทำไมการแก้ปัญหาของคุณถึงใช้ได้
psubsee2003
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.