Android Studio Kotlin - Изменить текст EditText из фрагмента - PullRequest
0 голосов
/ 09 ноября 2019

Мне нужно отредактировать 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 из фрагмента?

Ответы [ 3 ]

1 голос
/ 09 ноября 2019

Вы можете вызвать getActivity() из фрагмента, чтобы получить ссылку на его родительское действие:

(activity as? MainActivity)?.changeEditText()

Однако, лучшим подходом будет использование слушателя, чтобы фрагменту было все равно, что онродительская деятельность реализована:

interface Listener {
    fun onTextChanged()
}

fun changeEditText() {
    editText.setText(R.string.name)
    listener?.onTextChanged()
}
1 голос
/ 09 ноября 2019
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
    }
}
1 голос
/ 09 ноября 2019

Вы не можете инициализировать действие через его конструкторы. Вы можете вызвать метод из фрагмента, как показано ниже

((MainActivity)getActivity()).changeEditText();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...