Вызвать метод активности из фрагмента

Попытка вызова метода в моей деятельности из фрагмента. Я хочу, чтобы фрагмент передавал данные метода и получал данные при возврате метода. Я хочу добиться аналогичного вызова статического метода, но без использования статического, потому что он создает проблемы в активности.

Новое для фрагментов, поэтому мне нужно легкое и педагогическое объяснение!

Спасибо!

Ответ 1

От фрагмента до активности:

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

Если вы добавили фрагмент через код и использовали строку tag, когда вы добавили фрагмент, вместо этого используйте findFragmentByTag:

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

Ответ 2

Вероятно, вам следует попытаться отделить фрагмент от действия, если вы хотите использовать его где-то еще. Вы можете сделать это, создав интерфейс, который реализует ваша деятельность.

Итак, вы должны определить интерфейс, как показано ниже:

Предположим, например, что вы хотели бы дать операции String и вернуть ее Integer:

public interface MyStringListener{
    public Integer computeSomething(String myString);
}

Это может быть определено в фрагменте или отдельном файле.

Тогда у вас будет ваша реализация интерфейса.

public class MyActivity extends FragmentActivity implements MyStringListener{

  @Override
  public Integer computeSomething(String myString){
   /** Do something with the string and return your Integer instead of 0 **/ 
   return 0;
  }

}

Затем в вашем фрагменте у вас будет переменная MyStringListener, и вы должны установить слушатель в методе onAttach (Activity activity).

public class MyFragment {

        private MyStringListener listener;

        @Override
        public void onAttach(Context context) {
            super.onAttach(context);
            try {
                listener = (MyStringListener) context;
            } catch (ClassCastException castException) {
                /** The activity does not implement the listener. */
            }
        }

    }

изменить (17.12.2015): onAttach(Activity activity) is deprecated, use onAttach(Context context) instead, it works as intended

Первый ответ определенно работает, но он соединяет ваш текущий фрагмент с активностью хоста. Хорошая практика заключается в том, чтобы фрагмент был отделен от активности хоста, если вы хотите использовать его в другой ситуации.

Ответ 3

Для разработчиков Kotlin

(activity as YourActivityClassName).methodName()

Для разработчиков Java

((YourActivityClassName) getActivity()).methodName();

Ответ 4

Обновление после того, как я больше понимаю, как работают фрагменты. Каждый фрагмент принадлежит родительской активности. Поэтому просто используйте:

getActivity().whatever

Изнутри фрагмента. Это лучший ответ, потому что вы избегаете призрачных бросков. Если вы не можете избежать прикладов с помощью этого решения, используйте приведенный ниже.

============

то, что вам нужно сделать, - это включить внешнюю активность

((MainActivity) getActivity()).Method();

создание нового экземпляра будет путать фрейм андроида, и он не сможет его распознать. см. также:

fooobar.com/questions/32184/...

fooobar.com/questions/30336/...

Ответ 5

Хотя я полностью люблю Marco Answer, я думаю, справедливо отметить, что вы также можете использовать структуру публикации/подписки для достижения того же результата, например, если вы идете с шиной событий, вы можете сделать следующее

:

EventBus.getDefault().post(new DoSomeActionEvent()); 

Активность:

 @Subscribe
onSomeActionEventRecieved(DoSomeActionEvent doSomeActionEvent){
//Do something

}

Ответ 6

В kotlin вы можете вызвать метод активности из фрагмента, как показано ниже:

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

Ответ 7

Для доступа к функции, объявленной в вашей деятельности через ваш фрагмент, используйте интерфейс, как показано в ответе marco.

Для доступа к функции, объявленной в вашем фрагменте с помощью вашей активности, вы можете использовать это, если у вас нет тега или id

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


}

Это 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);
    }
}

Этот ответ для нубов вроде меня. Удачного дня.

Ответ 8

Это из класса Фрагмент...

((KidsStoryDashboard)getActivity()).values(title_txt,bannerImgUrl);

Этот код из класса активности...

 public void values(String title_txts, String bannerImgUrl) {
    if (!title_txts.isEmpty()) {

//Do something to set text 
    }
    imageLoader.displayImage(bannerImgUrl, htab_header_image, doption);
}

Ответ 9

Я пробовал все методы, показанные в этой теме, и ни один из них не работал для меня, попробуйте этот. Это сработало для меня.

((MainActivity) getContext().getApplicationContext()).Method();

Ответ 10

Я искал лучший способ сделать это, так как не каждый метод, который мы хотим назвать, находится во Фрагменте с таким же Родом активности.

В вашем фрагменте

public void methodExemple(View view){

        // your code here

        Toast.makeText(view.getContext(), "Clicked clicked",Toast.LENGTH_LONG).show();
    }

В вашей деятельности

new ExempleFragment().methodExemple(context); 

Ответ 11

public class ContohFragment extends Fragment {

public ContohFragment() {
    // Required empty public constructor
}
View view;


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

    view = inflater.inflate(R.layout.fragment_contoh, container, false);

    Button button = (Button)view.findViewById(R.id.buttonsatu);
    button.setOnClickListener(new View.OnClickListener()
    {
        @Override
        public void onClick(View v){
            switch(v.getId()){
                case R.id.buttonsatu:
                    Intent intent = new Intent(getActivity(), Activitydua.class);
                    getActivity().startActivity(intent);
            }
        }
    });

    return view;
}
}

Ответ 12

((YourActivityName)getActivity()).functionName();

Пример: ((SessionActivity)getActivity()).changeFragment();

Примечание: имя класса должно быть публично

Ответ 13

((ваша_активность) getActivity).method_name() Где your_activity - это название вашей активности method_name() - это имя метода, который вы хотите вызвать