我在片段中设置了一个Facebook登录产品,并向其中提出了Graph请求 接收到数据后,我要从图形api获取一些数据,我想转到另一个片段来处理结果,但是在单击登录按钮时,我仍然处于同一活动中,只有登录按钮变为更改为注销按钮,这意味着单击侦听器是 工作。如果我尝试使用意图进行活动,则会显示工作良好的新活动,但我需要进入片段,我该怎么做呢?这是我的代码?
override fun onActivityCreated(savedInstanceState: Bundle?) {
super.onActivityCreated(savedInstanceState)
loginButton?.setOnClickListener({
callbackManager = CallbackManager.Factory.create()
loginButton?.setFragment(this)
// loginButton = view.findViewById(R.id.log)
loginButton?.setReadPermissions("email")
loginButton?.registerCallback(callbackManager, object : FacebookCallback<LoginResult> {
override fun onSuccess(loginResult: LoginResult) {
val request: GraphRequest = GraphRequest.newMeRequest(loginResult.getAccessToken()
, GraphRequest.GraphJSONObjectCallback { `object`, response ->
// Override fun onCompleted( `object`:JSONObject, response:GraphResponse) {
Log.e(TAG, `object`.toString())
Log.e(TAG, response.toString())
try {
userId = `object`.getString("id");
profilePicture = URL("https://graph.facebook.com/" + userId + "/picture?width=500&height=500");
if (`object`.has("first_name"))
firstName = `object`.getString("first_name");
if (`object`.has("last_name"))
lastName = `object`.getString("last_name");
if (`object`.has("email"))
email = `object`.getString("email");
if (`object`.has("birthday"))
birthday = `object`.getString("birthday");
if (`object`.has("gender")) {
gender = `object`.getString("gender")
}
/* var main:Intent = Intent(this@MainActivity, Display::class.java)
main.putExtra("name", firstName)
main.putExtra("surname", lastName)
main.putExtra("imageUrl",profilePicture.toString())
startActivity(main);
finish(); */
mainFrameFragment = MainFrameFragment()
parameters?.putString("name", firstName)
parameters?.putString("surname", lastName)
parameters?.putString("imageUrl",profilePicture.toString())
mainFrameFragment?.arguments = parameters
fragmentManager?.beginTransaction()
?.replace(R.id.displayFragment, mainFrameFragment as MainFrameFragment,"MainFrameFragment")
?.commit()
// moveToNewActivity()
} catch (e: JSONException) {
e.printStackTrace();
} catch (e: MalformedURLException) {
e.printStackTrace();
}// App code
})
// mainFrameFragment = MainFrameFragment()
parameters = Bundle()
parameters?.putString("fields", "id, first_name, last_name, email, birthday, gender")
request.setParameters(parameters)
request.executeAsync()
}
override fun onCancel() {
// App code
}
override fun onError(exception: FacebookException) {
// App code
}
})
})
}
答案 0 :(得分:1)
如果要将整个Fragment1替换为Fragment2,则需要在MainActivity中使用以下命令进行操作:
Fragment1 fragment2 = new Fragment2();
FragmentManager fragmentManager = getFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
fragmentTransaction.replace(android.R.id.content, fragment2);
fragmentTransaction.commit();
只需将此代码放在MainActivity的一个方法中,然后从Fragment1中调用该方法即可。
答案 1 :(得分:0)
如果您的A / B布局的主要细节在屏幕上显示2个片段,那么您希望两个片段进行通信就很有意义。
通常的做法是使用片段A需要在片段B中调用的项目创建一个接口,反之亦然。然后在片段中实现接口。片段中的下一个片段构造器传入片段(fragmentBInterface),反之亦然。
如果您希望获得懒惰的答案,则可以使用Otto Bus并将事件触发给订阅者。那是一个简单的注释,可以捕获它,而简单的一行即可发布,但是使用了反射,许多工程师不喜欢这种样式编码。
最后,如果一次只在屏幕上显示一个片段,则您的片段可能没有充分的理由进行交流,在这种情况下,允许活动在片段之间进行调解。如果您只想尝试登录按钮,只需在活动中添加某种成功回调,然后创建一个mainActivity接口,该接口将赋予其构造函数中的片段。
最后一点,如果一个屏幕是全屏并且严格启动另一个屏幕,则实际上没有理由使用片段。有些人过于关注“一切都必须成为碎片”。该框架为每个用例提供了不错的选择。登录通常是一个全屏活动,包括初始屏幕。片段使用良好的一个例子是注册之类的向导或应用程序第1层内容的导航抽屉。当您深入研究某个细节时,我将进入启用了up的活动。
希望有帮助。