试图从片段中调用我的活动中的方法。我想要片段给方法数据,并在方法返回时获得数据。我想实现类似于对静态方法的调用,但不使用静态,因为它会在活动中产生问题。
新的片段,所以我需要一个简单的和教学的解释!
谢谢!
试图从片段中调用我的活动中的方法。我想要片段给方法数据,并在方法返回时获得数据。我想实现类似于对静态方法的调用,但不使用静态,因为它会在活动中产生问题。
新的片段,所以我需要一个简单的和教学的解释!
谢谢!
当前回答
在kotlin中,你可以从片段中调用activity方法,如下所示:
var mainActivity: MainActivity = activity as MainActivity
mainActivity.showToast() //Calling show toast method of activity
其他回答
((YourActivityName) getActivity ()) .functionName ();
示例:((SessionActivity)getActivity()).changeFragment();
注意:类名应该是公开的
我认为在片段初始化时传递活动实例是一个更好的方法。我像下面这样传递实例:
class FragmentSignUp : Fragment() {
private lateinit var authActivity: AuthenticateActivity
...
companion object {
fun newInstance(a: AuthenticateActivity): FragmentSignUp {
val fragment = FragmentSignUp()
fragment.authActivity = a
return fragment
}
}
}
现在,您可以使用传递的活动实例初始化片段,也可以调用活动中的任何公共方法。像下图:
val fragmentManager = supportFragmentManager
val fragment = FragmentSignUp.newInstance(this)
fragmentManager.beginTransaction().replace(R.id.authenticate_fragment, fragment, FragmentSignUp::class.java.simpleName)
.commit()
你现在可以在你的片段中访问你的activity公共方法;就像我的例子:
authactivity.goToLogInFragment()
在Java中,你的片段类应该是:
public class FragmentSignUp extends Fragment {
private AuthenticateActivity authActivity;
public static FragmentSignUp newInstance(AuthenticateActivity a) {
FragmentSignUp fragment = new FragmentSignUp();
fragment.authActivity = a;
return fragment;
}
}
注意:我们也可以将活动直接注入到片段构造函数中。但在大多数情况下,我们应该避免这样做,因为它会导致一些运行时问题。
在kotlin中,你可以从片段中调用activity方法,如下所示:
var mainActivity: MainActivity = activity as MainActivity
mainActivity.showToast() //Calling show toast method of activity
虽然我完全喜欢Marco的回答,但我认为指出你也可以使用基于发布/订阅的框架来实现相同的结果是公平的,例如,如果你使用事件总线,你可以做到以下几点
片段:
EventBus.getDefault().post(new DoSomeActionEvent());
活动:
@Subscribe
onSomeActionEventRecieved(DoSomeActionEvent doSomeActionEvent){
//Do something
}
对于通过fragment访问Activity中声明的函数,请使用接口,如marco的回答所示。
如果你没有标签或id,你可以通过活动访问Fragment中声明的函数
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);
}
}
这个答案是给像我这样的新手的。祝你有愉快的一天。