val fm = fragmentManager
if (fm?.findFragmentByTag("c1") == null && fm?.findFragmentByTag("c2") == null) {
val c1 = ChildFragment1()
val c2 = ChildFragment2()
fm?.beginTransaction()?.add(R.id.container_c_1, c1, "c1")?.commit()
c1.setTargetFragment(c2,101)
fm?.beginTransaction()?.add(R.id.container_c_2, c2, "c2")?.commit()
}
fragmentManager?.beginTransaction()?.add(R.id.container_c_1, ChildFragment1(), "c1")?.commit()
ChildFragment1().setTargetFragment(ChildFragment2(),1)
fragmentManager?.beginTransaction()?.add(R.id.container_c_2, ChildFragment2(), "c2")?.commit()
class SavedRepoFragment : BaseFragment<FragmentSavedRepoBinding>(),ISavedRepoFragment {
companion object{
const val SAVED_ARRAY = "saved_array"
}
private var adapter:ArrayAdapter<String>?=null
private var arrayList:ArrayList<String> = ArrayList()
private var presenter:SavedRepoPresenter?=null
override val bindingInflater: (LayoutInflater, ViewGroup?, Boolean) -> FragmentSavedRepoBinding
get() = FragmentSavedRepoBinding::inflate
override fun setupViews() {
presenter = SavedRepoPresenter(this)
presenter?.initArgs(requireContext())
adapter = ArrayAdapter(requireContext(), android.R.layout.simple_list_item_1, arrayList)
creatingListView(adapter!!, arrayList)
creatingSearchView(adapter!!,arrayList)
val login = presenter?.getCurrentLogin(requireActivity())
presenter?.observeSavedRepos(login, adapter!!, arrayList)
}
private fun creatingSearchView(adapter: ArrayAdapter<String>,arrayList: ArrayList<String>) {
val searchView = binding.searchView
searchView.setOnQueryTextListener(object : SearchView.OnQueryTextListener {
override fun onQueryTextSubmit(query: String?): Boolean {
searchView.clearFocus()
if (arrayList.contains(query)) {
adapter.filter.filter(query)
}
return false
}
override fun onQueryTextChange(newText: String?): Boolean {
adapter.filter.filter(newText)
return false
}
})
}
private fun creatingListView(adapter: ArrayAdapter<String>,arrayList: ArrayList<String>) {
val listView = binding.listView
listView.adapter = adapter
listView.setOnItemLongClickListener { parent, view, position, id ->
val dialogBuilder = AlertDialog.Builder(requireContext())
dialogBuilder.setMessage("Удалить этот репозиторий?")
dialogBuilder.setNegativeButton(
"Нет",
DialogInterface.OnClickListener { dialog, which -> })
dialogBuilder.setPositiveButton("Да", DialogInterface.OnClickListener { dialog, which ->
val repoName = arrayList[position]
presenter?.removeRepo(repoName,adapter)
})
dialogBuilder.create()
dialogBuilder.show()
true
}
}
override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) {
super.onCreateOptionsMenu(menu, inflater)
if (arrayList.isNotEmpty()) {
menu.add(0,2,0, R.string.remove_all)
}
}
override fun onPrepareOptionsMenu(menu: Menu) {
super.onPrepareOptionsMenu(menu)
if (arrayList.isEmpty()){
menu.removeItem(2)
}
}
override fun onOptionsItemSelected(item: MenuItem): Boolean {
when(item.itemId){
2 -> presenter?.removeAllRepos()
}
return super.onOptionsItemSelected(item)
}
override fun onSaveInstanceState(outState: Bundle) {
outState.putStringArrayList(SAVED_ARRAY,arrayList)
super.onSaveInstanceState(outState)
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
val arr = savedInstanceState?.getStringArrayList(SAVED_ARRAY)
arr?.let { arrayList.addAll(it) }
}
override fun showMessage(message: String) {
Toast.makeText(requireContext(),message,Toast.LENGTH_SHORT).show()
}
}
Когда лямбда упростит код? Например при передачи колбек функции в метод
Когда нужно например обобщить метод. Допустим метод сортировки. Можно написать n разных методов которые будут сортировать массив, который содержит определенный тип данных. Например сегодня нам нужно сортировать массив строк. Мы пишем массив который на входе принимает тип данных String. А завтра нам нужно сортировать массив целых чисел. И мы снова пишем метод который сортирует числа. По факту это два одинаковых метода которые будут различаться лишь принимаемым типом данных, а это дублирование кода, что не есть хорошо.
<?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:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<fragment
android:id="@+id/fragment"
android:name="androidx.navigation.fragment.NavHostFragment"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:defaultNavHost="true"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:navGraph="@navigation/nav_graph" />
</androidx.constraintlayout.widget.ConstraintLayout>
class FirstFragment : Fragment() {
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
return inflater.inflate(R.layout.fragment_first, container, false)
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
button1.setOnClickListener {
findNavController().navigate(R.id.action_firstFragment_to_secondFragment)
}
}
}
class SecondFragment : Fragment() {
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
// Inflate the layout for this fragment
return inflater.inflate(R.layout.fragment_second, container, false)
}
override fun onStart() {
super.onStart()
button.setOnClickListener {
findNavController().navigate(R.id.action_secondFragment_to_thirdFragment)
}
}
}