我在Kotlin的一个项目有问题。我需要修改片段中的textView,但无法访问这些textView。我收到的错误是:
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.example/com.example.example.MainActivity}: java.lang.IllegalStateException: emailSettingsText must not be null
在我的MainActivity(片段所在的位置)中,我尝试了此操作:
emailSettingsText.text = sharedPreferences.getString("EMAIL", "")
我也尝试在我的主要活动中创建一个变量:
var = emailVar = sharedPreferences.getString("EMAIL", "")
但是我不能更改片段中的文本。
这是片段:
package com.example.example.ui.settings
import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.TextView
import androidx.fragment.app.Fragment
import androidx.lifecycle.ViewModelProviders
import com.example.example.R
import kotlinx.android.synthetic.main.activity_terms.*
import kotlinx.android.synthetic.main.fragment_settings.*
@Suppress("DEPRECATION")
class SettingsFragment : Fragment() {
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
ViewModelProviders.of(this).get(SettingsViewModel::class.java)
return inflater.inflate(R.layout.fragment_settings, container, false)
}
}
是否有任何方法可以更改片段中名为emailShowSettingsText的textView?感谢您的帮助。
这是我的活动代码:
package com.example.example
import android.content.Context
import android.content.SharedPreferences
import android.os.Bundle
import android.provider.Settings
import android.util.Log
import android.widget.TextView
import com.google.android.material.bottomnavigation.BottomNavigationView
import androidx.appcompat.app.AppCompatActivity
import androidx.fragment.app.FragmentTransaction
import androidx.navigation.findNavController
import androidx.navigation.ui.AppBarConfiguration
import androidx.navigation.ui.setupWithNavController
import com.example.example.ui.settings.SettingsFragment
import kotlinx.android.synthetic.main.fragment_settings.*
import kotlinx.android.synthetic.main.fragment_settings.view.*
import kotlinx.android.synthetic.main.fragment_traffic.*
class MainActivity : AppCompatActivity(), Communicator {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val navView: BottomNavigationView = findViewById(R.id.nav_view)
val sharedPreferences = getSharedPreferences("TOKEN_FILE", Context.MODE_PRIVATE)
val navController = findNavController(R.id.nav_host_fragment)
var dominioVal = sharedPreferences.getString("DOMINIO", "")
AppBarConfiguration(
setOf(
R.id.navigation_traffic, R.id.navigation_ipblocked, R.id.navigation_search_terms, R.id.navigation_settings
)
)
navView.setupWithNavController(navController)
}
}
import kotlinx.android.synthetic.main.activity_terms.*
import kotlinx.android.synthetic.main.fragment_settings.*
您在一个Activity中导入了2个合成xml文件,这里有些问题,
似乎emailSettingsText
属于Fragment,但您尝试在Activity中调用它。
如果片段或您的Activity对其xml文件的引用(在Activity中为setContentView或在片段中为inflate布局,则您只能通过合成控件来控制视图)
emailSettingsText.text = sharedPreferences.getString("EMAIL", "")
我认为如果将上面的代码行移动到Fragment onViewCreated
,问题将会解决。>
您可以从主要活动中的片段中将id称为TextView“ emailSettingsText”。但是,您必须检查两件事:
最后,我使用伴随对象解决了这个问题。