Android Studio Kotlin-从片段中更改EditText文本



我需要从片段而不是MainActivity()中编辑main_layout上的editText。我尝试过将main_layout膨胀为碎片,但没有成功(editText没有改变(,然后我尝试创建方法

fun changeEditText(){
editText.setText(R.string.name)
}

但是当我使用在片段中调用它时

MainActivity().changeEditText()

它给了我一个错误:

java.lang.NullPointerException:尝试在空对象引用上调用虚拟方法"android.content.pm.ApplicationInfo android.coontent.Context.getApplicationInfo((">

如何从片段中编辑此editText

不能通过构造函数初始化活动。你可以像下面的一样从片段中调用方法

((MainActivity)getActivity()).changeEditText();

您可以从Fragment调用getActivity()以获得对其父活动的引用:

(activity as? MainActivity)?.changeEditText()

然而,更好的方法是使用监听器,这样片段就不在乎它的父活动实现了什么:

interface Listener {
fun onTextChanged()
}
fun changeEditText() {
editText.setText(R.string.name)
listener?.onTextChanged()
}
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
}
}

最新更新