【问题标题】:Android Studio Kotlin - Change EditText text from a fragmentAndroid Studio Kotlin - 从片段中更改 EditText 文本
【发布时间】:2019-11-10 04:55:15
【问题描述】:
我需要从片段而不是MainActivity() 编辑main_layout 上的editText。
我尝试将 main_layout 膨胀为片段,但这不起作用(editText 不会改变),然后我尝试创建方法
fun changeEditText(){
editText.setText(R.string.name)
}
但是当我在我的片段中调用它时使用
MainActivity().changeEditText()
它给了我这个错误:
java.lang.NullPointerException:尝试在空对象引用上调用虚拟方法“android.content.pm.ApplicationInfo android.content.Context.getApplicationInfo()”
如何从片段中编辑 editText?
【问题讨论】:
标签:
android
android-fragments
kotlin
【解决方案1】:
您不能通过其构造函数初始化活动。您可以从片段中调用方法,如下所示
((MainActivity)getActivity()).changeEditText();
【解决方案2】:
您可以从 Fragment 调用 getActivity() 以获取对其父活动的引用:
(activity as? MainActivity)?.changeEditText()
但是,更好的方法是使用监听器,这样片段就不会关心它的父 Activity 实现了什么:
interface Listener {
fun onTextChanged()
}
fun changeEditText() {
editText.setText(R.string.name)
listener?.onTextChanged()
}
【解决方案3】:
class MainActivity : AppCompatActivity() {
//override ......
fun changeText() {
EditText editText = findViewById(R.id.my_edittext)
edittext.text = "something"
}
}
class MyFragment : Fragment() {
private lateinit var hostActivity: AppCompatActivity
override fun onAttach(context: Context){
hostActivity = context as AppCompatActivity
}
override fun onViewCreated(){
hostActivity.changeText()
}
}
或者
class MainActivity :AppCompatActivity(), MyCallback() {
// override ......
override fun onTextChange(){
val editText = findViewById(R.id.my_edittext)
edittext.text = "something"
}
}
class MyFragment : Fragment() {
private lateinit var myCallback: MyCallback
override fun onAttach(context: Context){
myCallback = context as MyCallback
}
override fun onViewCreated(){
myCallback.onTextChange()
}
}
interface MyCallback {
fun onTextChange()
}
或者
class MainActivity :AppCompatActivity(), MyCallback() {
override fun onCreate(savedInstanceState: Bundle?){
val sharedViewmodel = ViewmodelProviders.of(this).get(SharedViewModel.class)
sharedViewmodel.text.observe(this, object: Observer<String> {
override fun onChanged(text: String?){
val editText = findViewById(R.id.my_edittext)
edittext.text = text
}
})
}
}
class MyFragment : Fragment() {
private lateinit var hostActivity: AppCompatActivity
override fun onAttach(context: Context){
hostActivity = context as AppCompatActivity
}
override fun onViewCreated(){
val sharedViewmodel = ViewmodelProviders.of(hostActivity).get(SharedViewModel.class)
sharedViewmodel.text = "My new text"
}
}
class sharedViewModel: ViewModel(){
private val textHolderLiveData = MutableLiveData<String>()
fun getText(): LiveData<String> {
return textHolderLiveData
}
fun setText(text: String) {
textHolderLiveData.value = text
}
}