试图从片段中调用我的活动中的方法。我想要片段给方法数据,并在方法返回时获得数据。我想实现类似于对静态方法的调用,但不使用静态,因为它会在活动中产生问题。

新的片段,所以我需要一个简单的和教学的解释!

谢谢!


当前回答

我认为在片段初始化时传递活动实例是一个更好的方法。我像下面这样传递实例:

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

注意:我们也可以将活动直接注入到片段构造函数中。但在大多数情况下,我们应该避免这样做,因为它会导致一些运行时问题。

其他回答

从碎片到活动:

((YourActivityClassName) requireActivity ()) .yourPublicMethod ();

谢谢@BIJAY_JHA和@Manaus。我使用Kotlin版本来调用我的signIn()方法,该方法存在于活动中,并且我从一个片段中调用。我在Android中使用导航架构,所以监听器接口模式不在片段中:

 (activity as MainActivity).signIn() 

我认为在片段初始化时传递活动实例是一个更好的方法。我像下面这样传递实例:

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 as YourActivityClassName).methodName()

针对Java开发人员

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

虽然我完全喜欢Marco的回答,但我认为指出你也可以使用基于发布/订阅的框架来实现相同的结果是公平的,例如,如果你使用事件总线,你可以做到以下几点

片段:

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

活动:

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

}