387 Stimmen

Aufruf einer Aktivitätsmethode aus einem Fragment

Ich versuche, eine Methode in meiner Aktivität von einem Fragment aus aufzurufen. Ich möchte, dass das Fragment der Methode Daten gibt und die Daten erhält, wenn die Methode zurückkehrt. Ich möchte erreichen, ähnlich wie auf eine statische Methode aufrufen, aber ohne die Verwendung von statischen, weil es Probleme in der Aktivität erstellen.

Ich bin neu bei Fragmenten und brauche eine einfache und pädagogische Erklärung!

Danke!

9voto

Droid Chris Punkte 2584

Ich habe das folgendermaßen gemacht:

erste Schnittstelle herstellen

interface NavigationInterface {
    fun closeActivity()
}

Als Nächstes stellen Sie sicher, dass die Aktivität die Schnittstelle implementiert und die Schnittstellenmethode(n) überschreibt.

class NotesActivity : AppCompatActivity(), NavigationInterface {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_notes)
        setSupportActionBar(findViewById(R.id.toolbar))
    }

    override fun closeActivity() {
        this.finish()
    }
}

dann stellen Sie sicher, dass Sie einen Interface-Listener im Fragment erstellen

private lateinit var navigationInterface: NavigationInterface

override fun onCreateView(
        inflater: LayoutInflater, container: ViewGroup?,
        savedInstanceState: Bundle?
): View? {
    //establish interface communication
    activity?.let {
        instantiateNavigationInterface(it)
    }
    // Inflate the layout for this fragment
    return inflater.inflate(R.layout.fragment_notes_info, container, false)
}

private fun instantiateNavigationInterface(context: FragmentActivity) {
    navigationInterface = context as NavigationInterface
}

dann können Sie solche Anrufe tätigen:

view.findViewById<Button>(R.id.button_second).setOnClickListener {
    navigationInterface.closeActivity()
}

7voto

Peter Punkte 478

Der beste Weg, die Aktivitätsmethode von ihrem jeweiligen Fragment aus aufzurufen

(activity as YourActivity).activtiyMethod()

verwenden Sie diese Zeile aus Ihrer Aktivität. Zum Beispiel

Angenommen, Sie haben eine Aktivität A und Methode add() und Ihr Fragment ABC und Sie möchten die Methode add aus dem Fragment ABC aufrufen,

(activity as A).add()

6voto

Maya Mohite Punkte 634

In Kotlin können Sie Activity-Methode von Fragment wie unten aufrufen:

var mainActivity: MainActivity = activity as MainActivity
        mainActivity.showToast() //Calling show toast method of activity

4voto

Lucy Punkte 426

Danke @BIJAY_JHA und @Manaus. Ich habe die Kotlin-Version verwendet, um meine signIn()-Methode aufzurufen, die sich in der Activity befindet und die ich aus einem Fragment aufrufe. Ich verwende die Navigationsarchitektur in Android, sodass das Listener-Schnittstellenmuster nicht im Fragment enthalten ist:

 (activity as MainActivity).signIn()

3voto

hispeed Punkte 171

Für den Zugriff auf eine in Ihrer Activity deklarierte Funktion über Ihr Fragment verwenden Sie bitte eine Schnittstelle, wie in der Antwort von marco gezeigt.

Für den Zugriff auf eine in Ihrem Fragment deklarierte Funktion über Ihre Aktivität können Sie dies verwenden, wenn Sie kein Tag oder keine ID haben

private void setupViewPager(ViewPager viewPager) {
    //fragmentOne,fragmentTwo and fragmentThree are all global variables
    fragmentOne= new FragmentOne();
    fragmentTwo= new FragmentTwo();
    fragmentThree = new FragmentThree();

    viewPagerAdapteradapter = new ViewPagerAdapter(getSupportFragmentManager());
    viewPagerAdapteradapter.addFragment(fragmentOne, "Frag1");
    viewPagerAdapteradapter.addFragment(fragmentTwo, "Frag2");
    viewPagerAdapteradapter.addFragment(fragmentThree, "Frag3");

    //viewPager has to be instantiated when you create the activity:
    //ViewPager viewPager = (ViewPager)findViewById(R.id.pager);
    //setupViewPager(viewPager);
    //Where R.id.pager is the id of the viewPager defined in your activity's xml page.

    viewPager.setAdapter(viewPagerAdapteradapter);

    //frag1 and frag2 are also global variables
    frag1 = (FragmentOne)viewPagerAdapteradapter.mFragmentList.get(0);
    frag2 = (FragmentTwo)viewPagerAdapteradapter.mFragmentList.get(1);;

    //You can use the variable fragmentOne or frag1 to access functions declared in FragmentOne

}

Dies ist die ViewpagerAdapterClass

    class ViewPagerAdapter extends FragmentPagerAdapter {
    public final List<Fragment> mFragmentList = new ArrayList<>();
    private final List<String> mFragmentTitleList = new ArrayList<>();

    public ViewPagerAdapter(FragmentManager manager) {
        super(manager);
    }

    @Override
    public Fragment getItem(int position) {
        return mFragmentList.get(position);
    }

    @Override
    public int getCount() {
        return mFragmentList.size();
    }

    public void addFragment(Fragment fragment, String title) {
        mFragmentList.add(fragment);
        mFragmentTitleList.add(title);
    }

    @Override
    public CharSequence getPageTitle(int position) {
        return mFragmentTitleList.get(position);
    }
}

Diese Antwort ist für Neulinge wie mich. Ich wünsche Ihnen einen schönen Tag.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X