Android фрагментов: я использую xml для определения подсказки или текста: когда я хочу динамически обновлять текст или подсказку, новый текст перекрывается - PullRequest
0 голосов
/ 27 мая 2020

Нужен ли фрагменту очень точный способ обработки текстов, установленных в xml фрагмента?

У меня два раза были очень похожие проблемы: текст, написанный в xml, не может быть обновлен должным образом .

Вот мой первый фрагмент. У меня раньше был текст fooli sh, написанный в xml для текстового представления msg2ndfragment. Проблема, с которой я столкнулся, заключалась в том, что во время onViewCreated текст, отправленный новым действием в текст, перекрывал текст fooli sh, записанный в Xml. Поэтому я удалил текст fooli sh, и теперь все в порядке. (Я мог бы обновить ваш текст три раза подряд, это будет работать, пока текст не был изначально определен в xml),

class SecondFragment : Fragment() {

//Passer par new instance pour créé le fragment en lui donnant le nom à afficher
companion object {
    fun newInstance(title: String?): SecondFragment {
        val fragmentSecond = SecondFragment()
        val args = Bundle()
        args.putString(MainActivity.MESSAGE_SECOND_ACTIVITE, title)
        fragmentSecond.arguments = args
        return fragmentSecond
    }
}

private lateinit var viewModel: SecondViewModel

override fun onCreateView(
    inflater: LayoutInflater, container: ViewGroup?,
    savedInstanceState: Bundle?
): View {
    return inflater.inflate(R.layout.second_fragment, container, false)
}


override fun onActivityCreated(savedInstanceState: Bundle?) {
    super.onActivityCreated(savedInstanceState)
    viewModel = ViewModelProviders.of(this).get(SecondViewModel::class.java)

    val message = arguments!!.getString(MainActivity.MESSAGE_SECOND_ACTIVITE, "")


    val aries = view?.findViewById<TextView>(R.id.msg2ndfragment);
    aries?.text = message
}


}

Но теперь у меня очень похожая проблема: в другой фрагмент в другом действии У меня есть editText с подсказкой. Я хочу, чтобы подсказка исчезла. Та же проблема: если подсказка записана в Xml: любой текст, написанный пользователем, будет только перекрывать старый текст. Если я изначально определяю подсказку динамически, подсказка исчезает, когда пользователь начинает писать.

class MainFragment : Fragment() {

companion object {
    fun newInstance() = MainFragment()
}

private lateinit var viewModel: MainViewModel

override fun onCreateView(
    inflater: LayoutInflater, container: ViewGroup?,
    savedInstanceState: Bundle?
): View {

    return inflater.inflate(R.layout.main_fragment, container, false)
}

override fun onActivityCreated(savedInstanceState: Bundle?) {
    super.onActivityCreated(savedInstanceState)
    viewModel = ViewModelProviders.of(this).get(MainViewModel::class.java)
    val aries = view?.findViewById<Button>(R.id.btnGo2ndActivity);
    aries?.setOnClickListener { onGoSecondFragmentClick(it) }
    Log.d("p1", "p1");
    //Faire disparaitre le int au touch car cela ne se fait pas automatiquement
    val edTxtTo2nd = view?.findViewById<EditText>(R.id.edt2ndActEditText)
    edTxtTo2nd?.hint =  "a"
    Log.d("pouf", "pouf");

    /*val edTxtTo2nd = view?.findViewById<EditText>(R.id.edt2ndActEditText)
    edTxtTo2nd?.setOnClickListener(View.OnClickListener { v ->
        edTxtTo2nd?.setHint("")
    }) */
}


private var listener: onMvmtClickListener? = null

public interface onMvmtClickListener {
    fun onNextActivityClick(name1: String)
}

// Store the listener (activity) that will have events fired once the fragment is attached
override fun onAttach(context: Context) {
    super.onAttach(context)
    if (context is onMvmtClickListener) {
        listener = context as onMvmtClickListener
    } else {
        throw ClassCastException(
            "$context must implement nMvmtClickListener"
        )
    }
}

fun onGoSecondFragmentClick(v: View?) {
    val nom = view?.findViewById<EditText>(R.id.edt2ndActEditText);
    listener?.onNextActivityClick(nom?.text.toString())
}


}




<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/main"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".ui.main.MainFragment">

    <TextView
        android:id="@+id/message"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/hello_world"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <Button
        android:id="@+id/btnGo2ndActivity"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="21dp"
        android:text="@string/go_to_2nd_act"
        app:layout_constraintTop_toBottomOf="@+id/edt2ndActEditText"
        tools:layout_editor_absoluteX="111dp"
        tools:ignore="MissingConstraints" />

    <EditText
        android:id="@+id/edt2ndActEditText"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="35dp"
        android:layout_marginBottom="21dp"
        android:ems="10"
        android:inputType="textPersonName"
        app:layout_constraintBottom_toTopOf="@+id/btnGo2ndActivity"
        app:layout_constraintTop_toTopOf="@+id/message"
        tools:layout_editor_absoluteX="95dp"
        tools:ignore="MissingConstraints" />

</androidx.constraintlayout.widget.ConstraintLayout>

Изменить: вот котелин main_activity и xml

class MainActivity : AppCompatActivity(), MainFragment.onMvmtClickListener  {
companion object{
    const val MESSAGE_SECOND_ACTIVITE = "Message.s

econd.activite"
    }

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.main_activity)
        if (savedInstanceState == null) {
            supportFragmentManager.beginTransaction()
                    .replace(R.id.container, MainFragment.newInstance())
                    .commitNow()
        }
    }

    override fun onNextActivityClick(name1: String) {
        var intent = Intent(this, SecondActivity::class.java)
        intent.putExtra(MESSAGE_SECOND_ACTIVITE, name1)
        startActivity(intent)
    }

}



<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id

/container"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity" >

    <fragment
        android:id="@+id/fragment"
        android:name="com.example.myapplication.ui.main.MainFragment"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />
</FrameLayout>

Использование этого обходного пути для определять любой текст или намек кажется мне неправильным. Как я могу определить их в Xml фрагменте без этой проблемы с перекрытием?

Заранее благодарим вас за любую помощь.

...