Memanggil metode Fragmen dari Aktivitas induk


124

Saya melihat di Panduan Pengembang Fragmen Android bahwa "aktivitas dapat memanggil metode dalam fragmen dengan memperoleh referensi ke Fragmen dari FragmentManager, menggunakan findFragmentById()atau findFragmentByTag()."

Contoh berikut menunjukkan cara mendapatkan referensi fragmen, bukan cara memanggil metode tertentu dalam fragmen.

Adakah yang bisa memberi contoh bagaimana melakukan ini? Saya ingin memanggil metode tertentu dalam Fragmen dari Aktivitas induk. Terima kasih.

Jawaban:


210

tidak mendapatkan pertanyaan persis karena terlalu sederhana:

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

Pembaruan: Bagi mereka yang menggunakan Kotlin

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

10
OK itu mudah, terima kasih (saya baru mengenal fragmen). Sekarang bagian yang sulit adalah saya tidak bisa mendapatkan referensi ke fragmen di tempat pertama. Ini tidak ditentukan dalam layout XML, jadi saya tidak bisa menggunakan findFragmentById (). Dan tidak jelas bagi saya dari kode yang saya ikuti (ref di atas) bagaimana / di mana fragmen dibuat. Jika ya, saya bisa menambahkan tag dan menggunakan findFragmentByTag (). Bagian AccountListActivity contoh memang memiliki panggilan ke beginTransaction (). Add (), tetapi menurut jejak saya, itu tidak pernah dipanggil. Di sinilah saya menggaruk-garuk kepala. Saya menghargai semua saran.
gcl1

34
bagaimana cara mendapatkan id fragmen?
Narendra Singh

8
Dengan melakukan ini saya berakhir di referensi objek null!
Alok Rajasukumaran

3
@ Fattie, bagaimana jika saya tidak memiliki tag fragmen?
Vaclovas Rekašius Jr.

5
Saya tidak mendeklarasikan fragmen dalam xml ... jadi saya tidak punya id fragmen, Apa yang harus saya lakukan ??
akash bs

76

Jika Anda menggunakan "import android.app.Fragment;" Kemudian gunakan salah satu:

1)

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

Di mana R.id.example_fragment kemungkinan besar adalah id FrameLayout di dalam tata letak xml Anda. ATAU

2)

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

Di mana FragTagName adalah nama yang Anda tentukan saat Anda melakukannya:

TabHost mTabHost.newTabSpec(“FragTagName”)

Jika Anda menggunakan "import android.support.v4.app.Fragment;" Kemudian gunakan salah satu:

1)

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

ATAU

2)

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

1
Saya memiliki CoordinatorLayout dengan id R.id.example_fragment, mengembalikan null. Saya menggunakan import android.support.v4.app.Fragment; apa yang harus dilakukan?
Kishore

Saya sarankan Anda memposting ini sebagai pertanyaan baru dan menyertakan kode sampel Anda. Sulit untuk mengetahui sumber masalahnya tanpa melihat kode sebenarnya.
Gene

9

Jika Anda menggunakan pustaka dukungan, Anda akan ingin melakukan sesuatu seperti ini:

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

4
  1. Jika Anda tidak menggunakan Fragmen pustaka dukungan, lakukan hal berikut:

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


2. Jika Anda menggunakan Fragmen pustaka dukungan, lakukan hal berikut:

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


3

Saya pikir yang terbaik adalah memeriksa apakah fragmen ditambahkan sebelum memanggil metode dalam fragmen. Lakukan sesuatu seperti ini untuk menghindari pengecualian nol.

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

2

Dari fragmen hingga aktivasi:

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

Dari aktivitas menjadi fragmen:

FragmentManager fm = getSupportFragmentManager ();

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

Jika Anda menambahkan fragmen melalui kode dan menggunakan string tag saat Anda menambahkan fragmen, gunakan findFragmentByTag sebagai gantinya:

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

1

Pertama Anda membuat metode fragmentseperti Anda

public void name()
{


}

dalam diri Anda, activityAnda menambahkan ini

tambahkan onCreate()metode

myfragment fragment=new myfragment()

terakhir panggil metode di mana Anda ingin memanggil menambahkan ini

fragment.method_name();

coba kode ini


1
FragmentManager fm = getFragmentManager(); 
MainFragment frag = (MainFragment)fm.findFragmentById(R.id.main_fragment); 
frag.<specific_function_name>(); 

1

Saya tidak tahu tentang Java, tetapi di C#(Xamarin.Android) tidak perlu mencari fragmen setiap kali Anda perlu memanggil metode ini, lihat di bawah:

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()
    {
        // ...
    }   
}

Saya pikir JavaAnda bisa melakukan hal yang sama.


1

Anda juga memanggil metode fragmen menggunakan antarmuka seperti

pertama Anda membuat antarmuka

public interface InterfaceName {
    void methodName();
}

setelah membuat antarmuka, Anda mengimplementasikan antarmuka di fragmen Anda

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

    }
}

dan Anda membuat referensi antarmuka dalam aktivitas Anda

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

0
((HomesFragment)getSupportFragmentManager().findFragmentById(R.id.fragment_container)).filterValidation();
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.