Android Kotlin:TextView.text 未按预期工作

Android Kotlin : TextView.text not working as expected

我有一个应用程序可以让用户在尚未登录的情况下使用 Firebase 登录。如果用户登录,他们的用户个人资料信息会正确显示。关闭应用程序并重新打开后,用户名和电子邮件未设置并转到我的默认文本。但是,如果我退出并重新登录,它将显示。我觉得它与更新 ui 有关但卡住了。

如果需要,我可以在午休结束后post编码

更新代码

这是 MainActivity 中的相关代码,这是我检查用户是否登录的地方,如果登录的话允许他们从那里开始登录 activity。

class MainActivity : AppCompatActivity(), NavigationView.OnNavigationItemSelectedListener {

val TAG = "MainActivity"

var mAuth: FirebaseAuth? = null
var mUser: FirebaseUser? = null
var userEmailTV: TextView? = null
var userDispNameTV: TextView? = null
val RC_SIGN_IN = 123

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)
    setSupportActionBar(toolbar)

    val toggle = ActionBarDrawerToggle(
            this, drawer_layout, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close)
    drawer_layout.addDrawerListener(toggle)
    toggle.syncState()
    nav_view.setNavigationItemSelectedListener(this)

}

 override fun onStart() {
    super.onStart()

    mAuth = FirebaseAuth.getInstance()
    mUser = mAuth?.currentUser

    if (mUser != null) {

        userEmailTV = findViewById<View>(R.id.userEmail) as TextView?
        userEmailTV?.text = mUser?.email
        userDispNameTV = findViewById<View>(R.id.userName) as TextView?
        userDispNameTV?.text = mUser?.displayName

        Log.i(TAG, "User Display Name : ${mUser?.displayName}")
        Log.i(TAG, "Users Email :  ${mUser?.email}")

    } else {
        startActivityForResult(
                // Get an instance of AuthUI based on the default app
                AuthUI.getInstance().createSignInIntentBuilder().build(),
                RC_SIGN_IN)
    }


}

这是在导航抽屉中保存用户个人资料信息的布局信息

 <TextView
    android:id="@+id/userName"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:paddingTop="@dimen/nav_header_vertical_spacing"
    android:textAppearance="@style/TextAppearance.AppCompat.Body1"
    android:text="Username"/>

<TextView
    android:id="@+id/userEmail"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="youremail@something.com"/>

经过反复试验和研究,我的理论是.....这个问题不是因为 TextView 在错误的位置初始化,正如其他人在上面的评论中所想的那样。由于导航 header 视图还没有时间膨胀。我将致力于编码初始化导航 header 然后是 TextView 并使用结果进行编辑。

编辑

以下是我为让它发挥作用所做的工作。 我添加了

        uemail = findViewById<View>(R.id.nav_view) as NavigationView
    navHead = uemail.getHeaderView(0)
    tvEmail = navHead.findViewById(R.id.userEmail) as TextView
    tvDisplayName = navHead.findViewById(R.id.userName) as TextView
    tvEmail.text = mUser?.email
    tvDisplayName.text = mUser?.displayName

我将它放在我在 onCreate 和 onStart 中调用的函数中。如果我不这样做,它只会在登录后填充或根本不会填充。这样它就可以始终填充正确的数据。我发现它与 Android Studio 在 23.1 之后或类似的东西之后使用 recyclerview 作为导航视图有关。

你确定"findView"成功了吗?尝试在导航中调用它 header 查看接收器