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.

gcl1
sumber

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()
Dheeresh Singh
sumber
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(); 
Gen
sumber
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();
JDJ
sumber
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();

Chintan Shah
sumber
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>(); 
}
Surjit Singh
sumber
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");
Bharat Vasoya
sumber
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

Cepat Belajar
sumber
1
FragmentManager fm = getFragmentManager(); 
MainFragment frag = (MainFragment)fm.findFragmentById(R.id.main_fragment); 
frag.<specific_function_name>(); 
Kishore Reddy
sumber
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.

Mehdi Dehghani
sumber
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();
            }
        });
    }
}
mXaln
sumber
0
((HomesFragment)getSupportFragmentManager().findFragmentById(R.id.fragment_container)).filterValidation();
pangeran bersemangat
sumber