【问题标题】: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
          }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-01-16
        • 2011-04-11
        • 2021-12-03
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多