如何从另一个片段中调用一个片段?

时间:2018-08-08 19:18:09

标签: android

我在片段中设置了一个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
            }
        })
    })
} 

2 个答案:

答案 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的活动。

希望有帮助。