Вызвать метод активности из фрагмента
Попытка вызова метода в моей деятельности из фрагмента. Я хочу, чтобы фрагмент передавал данные метода и получал данные при возврате метода. Я хочу добиться аналогичного вызова статического метода, но без использования статического, потому что он создает проблемы в активности.
Новое для фрагментов, поэтому мне нужно легкое и педагогическое объяснение!
Спасибо!
Ответы
Ответ 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() - это имя метода, который вы хотите вызвать