如何在片段中膨胀不同的视图

How to inflate different views in a fragment

在我的 Java 代码中处理片段 我检查了用户是否登录到他的 Firebase 帐户,如果他登录了,他会显示正确的视图,否则 "You are not logged in" 片段得到膨胀了。

public View onCreateView(LayoutInflater inflater, final ViewGroup container,
                         Bundle savedInstanceState) {
    FirebaseUser user = FirebaseAuth.getInstance().getCurrentUser();
    if (user != null) {
        /**
         * USER IS SIGNED IN
          */

        View view = inflater.inflate(R.layout.fragment_calendar, container, false);
        return view;
       } else {
         /**
         * NO USER IS SIGNED IN
         */

        View view = inflater.inflate(R.layout.fragment_unregistred, container, false);
        return view;
        }
      }

现在在 Kotlin 中这样做似乎并不像它应该的那么容易,它说 "return" 不允许出现在与我在 Java 中得到的位置相同的位置:

override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?,
                          savedInstanceState: Bundle?): View? {

    if(getUID.requestUserExistence() != null) {
        FirebaseAuth.getInstance().currentUser!!.getIdToken(true).addOnCompleteListener{task ->
            if(task.isSuccessful) {

                val view = inflater.inflate(R.layout.fragment_crackthecode, container, false)

                return view


            }
        }
    }
}

为什么会这样?

运算符 if 在 Kotlin 中是一个 expression。考虑到您的情况,我们可以将其重写为:

override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?,
                          savedInstanceState: Bundle?): View? {

    val user = FirebaseAuth.getInstance().getCurrentUser()
    return if (user != null) {
        inflater.inflate(R.layout.fragment_calendar, container, false)
    } else {
        inflater.inflate(R.layout.fragment_unregistred, container, false)
    }
}

考虑到您在 Kotlin 中的第二个示例,它看起来与 Java 不同:有一个 OnCompleteListener,您不能将其用于 return View 用于 onCreateView 方法。如果你想要 return 来自 onCreateView 方法的变量,你不应该 return 来自回调(侦听器)方法的变量。如果您在 Java 中重写相同的代码,添加 OnCompleteListener,您将得到相同或相似的错误,您的代码将不会被编译。