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 查看接收器
我有一个应用程序可以让用户在尚未登录的情况下使用 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 查看接收器