การเรียกใช้เมธอด Fragment จากกิจกรรมหลัก


124

ฉันเห็นในคู่มือนักพัฒนาAndroid Fragmentsว่า "กิจกรรมสามารถเรียกใช้เมธอดในแฟรกเมนต์ได้โดยรับการอ้างอิงถึง Fragment จาก FragmentManager โดยใช้findFragmentById()หรือfindFragmentByTag()"

ตัวอย่างต่อไปนี้แสดงวิธีรับการอ้างอิงแฟรกเมนต์ แต่ไม่ใช่วิธีการเรียกใช้เมธอดเฉพาะในแฟรกเมนต์

ใครสามารถยกตัวอย่างวิธีการทำเช่นนี้? ฉันต้องการเรียกวิธีการเฉพาะใน Fragment จากกิจกรรมหลัก ขอบคุณ

คำตอบ:


210

ไม่ได้รับคำถามตรงตามที่ง่ายเกินไป:

ExampleFragment fragment = (ExampleFragment) getFragmentManager().findFragmentById(R.id.example_fragment);
fragment.<specific_function_name>(); 

Update: สำหรับผู้ที่ใช้ Kotlin

var fragment = supportFragmentManager.findFragmentById(R.id.frameLayoutCW) as WebViewFragment
fragment.callAboutUsActivity()

10
โอเคมันง่ายมากขอบคุณ (ฉันใหม่สำหรับเศษชิ้นส่วน) ตอนนี้ส่วนที่ยากคือฉันไม่สามารถอ้างอิงถึงส่วนย่อยได้ในตอนแรก ไม่ได้กำหนดไว้ในเค้าโครง XML ดังนั้นฉันจึงไม่สามารถใช้ findFragmentById () ได้ และไม่ชัดเจนสำหรับฉันจากรหัสที่ฉันกำลังติดตาม (อ้างอิงด้านบน) ว่าจะสร้างส่วนอย่างไร / ที่ไหน ถ้าเป็นฉันสามารถเพิ่มแท็กและใช้ findFragmentByTag () ได้ ส่วน AccountListActivity ของตัวอย่างมีการเรียก startTransaction (). add () แต่ตามการติดตามของฉันมันไม่เคยถูกเรียก นี่คือจุดที่ฉันเกาหัว ฉันขอขอบคุณข้อเสนอแนะใด ๆ
gcl1

34
ฉันจะรับรหัสชิ้นส่วนได้อย่างไร
Narendra Singh

9
ด้วยการทำสิ่งนี้ฉันลงเอยด้วยการอ้างอิงวัตถุว่าง!
ลกราชสุกุมารัน

3
@ แฟตตี้ถ้าไม่มีแฟตตี้แท็กล่ะ?
Vaclovas Rekašius Jr.

5
ฉันไม่ได้ประกาศ Fragment ใน xml ... ดังนั้นฉันจึงไม่มี Fragment id ฉันจะทำอย่างไร ??
akash bs

76

หากคุณกำลังใช้“ import android.app.Fragment;” จากนั้นใช้อย่างใดอย่างหนึ่ง:

1)

ExampleFragment fragment = (ExampleFragment) getFragmentManager().findFragmentById(R.id.example_fragment); 
fragment.specific_function_name(); 

โดยที่ R.id.example_fragment น่าจะเป็นรหัส FrameLayout ในเลย์เอาต์ xml ของคุณ หรือ

2)

ExampleFragment fragment = (ExampleFragment) getFragmentManager().findFragmentByTag(“FragTagName”); 
fragment.specific_function_name(); 

โดย FragTagName เป็นชื่อที่คุณระบุเมื่อคุณทำ:

TabHost mTabHost.newTabSpec(“FragTagName”)

หากคุณกำลังใช้“ import android.support.v4.app.Fragment;” จากนั้นใช้อย่างใดอย่างหนึ่ง:

1)

ExampleFragment fragment = (ExampleFragment) getSupportFragmentManager().findFragmentById(R.id.example_fragment); 
fragment.specific_function_name(); 

หรือ

2)

ExampleFragment fragment = (ExampleFragment) getSupportFragmentManager().findFragmentByTag(“FragTagName”); 
fragment.specific_function_name(); 

2
ฉันมี CoordinatorLayout ที่มี id R.id.example_fragment ซึ่งส่งคืนค่าว่าง ฉันใช้การนำเข้า android.support.v4.app.Fragment; จะทำยังไง?
Kishore

ฉันขอแนะนำให้คุณโพสต์คำถามนี้เป็นคำถามใหม่และใส่โค้ดตัวอย่างของคุณ เป็นการยากที่จะบอกที่มาของปัญหาโดยไม่ต้องดูรหัสจริง
ยีน

9

หากคุณกำลังใช้ไลบรารีการสนับสนุนคุณจะต้องทำสิ่งนี้:

FragmentManager manager = getSupportFragmentManager();
Fragment fragment = manager.findFragmentById(R.id.my_fragment);
fragment.myMethod();

4
  1. หากคุณไม่ได้ใช้ Support Library Fragment ให้ทำดังต่อไปนี้:

((FragmentName) getFragmentManager().findFragmentById(R.id.fragment_id)).methodName();


2. หากคุณกำลังใช้ Support Library Fragment ให้ทำดังต่อไปนี้:

((FragmentName) getSupportFragmentManager().findFragmentById(R.id.fragment_id)).methodName();


3

ฉันคิดว่าวิธีที่ดีที่สุดคือตรวจสอบว่ามีการเพิ่มส่วนย่อยหรือไม่ก่อนที่จะเรียกวิธีการในส่วนย่อย ทำสิ่งนี้เพื่อหลีกเลี่ยงข้อยกเว้นว่าง

ExampleFragment fragment = (ExampleFragment) getFragmentManager().findFragmentById(R.id.example_fragment);
if(fragment.isAdded()){
  fragment.<specific_function_name>(); 
}

2

จากส่วนย่อยเป็นกิจกรรม:

((YourActivityClassName)getActivity()).yourPublicMethod();

จากกิจกรรมเป็นส่วนย่อย:

FragmentManager fm = getSupportFragmentManager ();

//if you added fragment via layout xml
YourFragmentClass fragment = 
(YourFragmentClass)fm.findFragmentById(R.id.your_fragment_id);
fragment.yourPublicMethod();

หากคุณเพิ่มแฟรกเมนต์ผ่านโค้ดและใช้สตริงแท็กเมื่อคุณเพิ่มแฟรกเมนต์ของคุณให้ใช้findFragmentByTagแทน:

YourFragmentClass fragment = (YourFragmentClass)fm.findFragmentByTag("yourTag");

1

แรกที่คุณสร้างในวิธีการของคุณfragmentเช่น

public void name()
{


}

ในของactivityคุณคุณเพิ่มสิ่งนี้

เพิ่มonCreate()วิธีการ

myfragment fragment=new myfragment()

สุดท้ายเรียกเมธอดที่คุณต้องการเรียกว่าเพิ่มสิ่งนี้

fragment.method_name();

ลองใช้รหัสนี้



1

ฉันไม่รู้เกี่ยวกับJavaแต่ในC#(Xamarin.Android) ไม่จำเป็นต้องค้นหาชิ้นส่วนทุกครั้งที่คุณต้องเรียกใช้วิธีการดูด้านล่าง:

public class BrandActivity : Activity
{
    MyFragment myFragment;

    protected override void OnCreate(Bundle bundle)
    {       
        // ...
        myFragment = new MyFragment();      
        // ...
    }

    void someMethod()
    {
        myFragment.MyPublicMethod();
    }
}

public class MyFragment : Android.Support.V4.App.Fragment
{
    public override void OnCreate(Bundle bundle)
    {
        // ...
    }

    public override View OnCreateView(LayoutInflater inflater, ViewGroup container, Bundle bundle)
    {
        // ...
    }

    public void MyPublicMethod()
    {
        // ...
    }   
}

ฉันคิดว่าในตัวJavaคุณสามารถทำได้เช่นเดียวกัน


1

คุณยังเรียกวิธีการแยกส่วนโดยใช้อินเทอร์เฟซเช่น

ก่อนอื่นคุณสร้างอินเทอร์เฟซ

public interface InterfaceName {
    void methodName();
}

หลังจากสร้างอินเทอร์เฟซคุณใช้อินเทอร์เฟซในส่วนของคุณ

MyFragment extends Fragment implements InterfaceName {
    @overide
    void methodName() {

    }
}

และคุณสร้างการอ้างอิงของอินเทอร์เฟซในกิจกรรมของคุณ

class Activityname extends AppCompatActivity {
    Button click;
    MyFragment fragment;

    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity);

        click = findViewById(R.id.button);

        fragment = new MyFragment();

        click.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
               fragment.methodName();
            }
        });
    }
}

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.