对片段新手,需要简单易懂的解释!
谢谢!
从片段到活动:
((YourActivityClassName)getActivity()).yourPublicMethod();
从Activity到Fragment:
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");
如果您想在其他地方使用它,最好将片段与活动解耦。您可以通过创建一个接口来实现这一点,而该接口由您的活动实现。
因此,您可以定义以下接口:
例如,假设您想给该活动一个字符串并让其返回一个整数:
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. */
}
}
}
编辑(2015年12月17日):onAttach(Activity activity)
已过时,改用onAttach(Context context)
,它能正常工作。
第一个答案肯定有效,但它会将您当前的片段与宿主活动耦合在一起。最好的做法是将片段与宿主活动解耦,以防您想在另一个活动中使用它。
MyFragment
重写onDetach
并将监听器设置为null以避免内存泄漏也非常重要。 - Mateus Gondim对于Kotlin开发者
(activity as YourActivityClassName).methodName()
针对Java开发人员
((YourActivityClassName) getActivity()).methodName();
在我更深入了解片段(fragments)的工作原理后,更新此内容。每个片段都属于一个父活动(parent activity)。因此只需使用:
getActivity().whatever
在片段内部,这是更好的答案,因为您可以避免不必要的转换。如果您无法使用此解决方案避免转换,请使用下面的解决方案。((MainActivity) getActivity()).Method();
创建一个新实例将会混淆安卓框架,导致无法识别。另请参见:
EventBus.getDefault().post(new DoSomeActionEvent());
活动:
@Subscribe
onSomeActionEventRecieved(DoSomeActionEvent doSomeActionEvent){
//Do something
}
DefaultLifecycleObserver
,将其附加到活动上以在onResume()
或onPause()
中订阅/取消订阅它,这个“事件总线”可以是您想要的任何类。 - Eduardo这是我完成此任务的步骤:
首先创建一个接口
interface NavigationInterface {
fun closeActivity()
}
接下来确保activity实现了接口并覆盖了接口方法
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()
}
}
请确保在片段中创建接口监听器。
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
}
那么你可以像这样进行调用:
view.findViewById<Button>(R.id.button_second).setOnClickListener {
navigationInterface.closeActivity()
}
从它们各自的fragment中调用activity方法的最佳方式
(activity as YourActivity).activtiyMethod()
在您的活动中使用此行。例如
假设您有活动A和方法add(),以及您的碎片ABC,您想从碎片ABC调用方法add,
(activity as A).add()
var mainActivity: MainActivity = activity as MainActivity
mainActivity.showToast() //Calling show toast method of activity
感谢@BIJAY_JHA和@Manaus。我使用了Kotlin版本来调用位于Activity中的signIn()方法,并从Fragment中调用它。我在Android中使用导航架构,因此Listener接口模式不在Fragment中:
(activity as MainActivity).signIn()
如果你想要通过片段访问在你的Activity中声明的函数,请使用接口,如marco所示的答案。
如果你没有标签或ID,你可以使用此方法来通过你的Activity访问在片段中声明的函数。
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
}
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);
}
}
这篇答案是为像我一样的新手准备的。祝你有美好的一天。