我需要从一个片段而不是从editText
中编辑一个在main_layout
上的MainActivity()
。我尝试过将main_layout膨胀成片段,但这不起作用(editText
不改变),然后我尝试创建方法
fun changeEditText(){
editText.setText(R.string.name)
}
但是当我在我的片段中调用它时
MainActivity().changeEditText()
它给了我这个错误:
java.lang.NullPointerException:尝试在空对象引用上调用虚拟方法'android.content.pm.ApplicationInfo android.content.Context.getApplicationInfo()‘
如何从片段中编辑这个editText
?
发布于 2019-11-09 11:34:22
不能通过活动的构造函数初始化活动。您可以从片段中调用方法,如下所示
((MainActivity)getActivity()).changeEditText();
发布于 2019-11-09 11:58:37
您可以从片段中调用getActivity()
以获取对其父活动的引用:
(activity as? MainActivity)?.changeEditText()
但是,更好的方法是使用监听器,这样片段就不会关心它的父活动实现了什么:
interface Listener {
fun onTextChanged()
}
fun changeEditText() {
editText.setText(R.string.name)
listener?.onTextChanged()
}
发布于 2019-11-09 12:55:15
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
}
}
https://stackoverflow.com/questions/58782779
复制相似问题