试图从片段中调用我的活动中的方法。我想要片段给方法数据,并在方法返回时获得数据。我想实现类似于对静态方法的调用,但不使用静态,因为它会在活动中产生问题。
新的片段,所以我需要一个简单的和教学的解释!
谢谢!
试图从片段中调用我的活动中的方法。我想要片段给方法数据,并在方法返回时获得数据。我想实现类似于对静态方法的调用,但不使用静态,因为它会在活动中产生问题。
新的片段,所以我需要一个简单的和教学的解释!
谢谢!
当前回答
从碎片到活动:
((YourActivityClassName) requireActivity ()) .yourPublicMethod ();
其他回答
谢谢@BIJAY_JHA和@Manaus。我使用Kotlin版本来调用我的signIn()方法,该方法存在于活动中,并且我从一个片段中调用。我在Android中使用导航架构,所以监听器接口模式不在片段中:
(activity as MainActivity).signIn()
更新后,我了解更多的碎片如何工作。每个片段都属于一个父活动。所以只需使用:
getActivity().whatever
从片段内部。这是一个更好的答案,因为可以避免多余的类型转换。如果这个解决方案不能避免强制转换,请使用下面的方法。
============
你要做的就是投射到外部活动
((MainActivity) getActivity()).Method();
创建一个新的实例将使android框架感到困惑,它将无法识别它。 参见:
https://stackoverflow.com/a/12014834/1984636
https://stackoverflow.com/a/2042829/1984636
以下是我的做法:
首先制作接口
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()
}
虽然我完全喜欢Marco的回答,但我认为指出你也可以使用基于发布/订阅的框架来实现相同的结果是公平的,例如,如果你使用事件总线,你可以做到以下几点
片段:
EventBus.getDefault().post(new DoSomeActionEvent());
活动:
@Subscribe
onSomeActionEventRecieved(DoSomeActionEvent doSomeActionEvent){
//Do something
}
我认为在片段初始化时传递活动实例是一个更好的方法。我像下面这样传递实例:
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;
}
}
注意:我们也可以将活动直接注入到片段构造函数中。但在大多数情况下,我们应该避免这样做,因为它会导致一些运行时问题。