Вызов метода активности из фрагмента
попытка вызвать метод в моей деятельности из фрагмента. Я хочу, чтобы фрагмент давал данные метода и получал данные при возврате метода. Я хочу добиться аналогичного вызова статического метода, но без использования статики, потому что это создает проблемы в деятельности.
новое для фрагментов, поэтому мне нужно легкое и педагогическое объяснение!
спасибо!
9 ответов:
от фрагмента к действию:
((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");
вы, вероятно, должны попытаться отделить фрагмент от действия в случае, если вы хотите использовать его где-то еще. Вы можете сделать это, создав интерфейс, который реализует ваша деятельность.
таким образом, вы бы определили интерфейс следующим образом:
предположим, например, вы хотите дать activity строку и вернуть целое число:
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, и вы установите прослушиватель в методе fragment 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. */ } } }edit (17.12.2015):
onAttach(Activity activity) is deprecated, use onAttach(Context context) instead, it works as intendedпервый ответ определенно работает, но он связывает ваш текущий фрагмент с активностью хоста. Его хорошая практика, чтобы сохранить фрагмент отделен от активности хоста в случае, если вы хотите использовать его в другой активности.
обновление после того, как я больше понимаю, как работают фрагменты. Каждый фрагмент принадлежит родительскому действию. Так что просто используйте:
getActivity().whateverизнутри фрагмента. Это лучший ответ, потому что вы избегаете чрезмерных бросков. Если вы не можете избежать приведений с этим решением, используйте приведенное ниже.
============
то, что вам нужно сделать, это бросить во внешнюю деятельность
((MainActivity) getActivity()).Method();создание нового экземпляра будет путать фрейм android, и он будет не смогу его распознать. Смотрите также:
на Котлин разработчики
(activity as YourActivityClassName).methodName()на Java разработчики
((YourActivityClassName) getActivity()).methodName();
хотя мне полностью нравится ответ Марко, я думаю, что справедливо отметить, что вы также можете использовать платформу на основе публикации/подписки для достижения того же результата, например, если вы идете с шиной событий, вы можете сделать следующее
фрагмент :
EventBus.getDefault().post(new DoSomeActionEvent());действие:
@Subscribe onSomeActionEventRecieved(DoSomeActionEvent doSomeActionEvent){ //Do something }
для доступа к функции, объявленной в вашей деятельности через ваш фрагмент, пожалуйста, используйте интерфейс, как показано в ответе Марко.
для доступа к функции, объявленной в вашем фрагменте через вашу активность, вы можете использовать это, если у вас нет тега или идентификатора
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 }Это 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); } }этот ответ для нубов, как я. Хорошего дня.
это из класса фрагментов...
((KidsStoryDashboard)getActivity()).values(title_txt,bannerImgUrl);Этот Код Из Класса Activity...
public void values(String title_txts, String bannerImgUrl) { if (!title_txts.isEmpty()) { //Do something to set text } imageLoader.displayImage(bannerImgUrl, htab_header_image, doption); }
в kotlin вы можете вызвать метод activity из фрагмента, как показано ниже:
var mainActivity: MainActivity = activity as MainActivity mainActivity.showToast() //Calling show toast method of activity
Я искал лучший способ сделать это, так как не каждый метод, который мы хотим вызвать, находится во фрагменте с тем же родителем активности.
в вашем фрагменте
public void methodExemple(View view){ // your code here Toast.makeText(view.getContext(), "Clicked clicked",Toast.LENGTH_LONG).show(); }в работе
new ExempleFragment().methodExemple(context);
Comments