繁体   English   中英

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

[英]Android Studio Kotlin - Change EditText text from a fragment

我需要从片段而不是MainActivity()编辑editText上的main_layout 我尝试将 main_layout 膨胀为片段,但这不起作用( editText不会改变),然后我尝试创建方法

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

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

MainActivity().changeEditText()

它给了我这个错误:

java.lang.NullPointerException: Attempt to invoke virtual method 'android.content.pm.ApplicationInfo android.content.Context.getApplicationInfo()' on a null object reference

如何从片段编辑此editText

您不能通过其构造函数初始化活动。 您可以从片段中调用该方法,如下所示

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

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

(activity as? MainActivity)?.changeEditText()

但是,更好的方法是使用监听器,这样片段就不会关心它的父 Activity 实现了什么:

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
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM