Задать вопрос
  • Как выбирать, создать поток или корутину?

    @foonfyrick Автор вопроса
    Щас у меня все с ног на голову перевернулось, где бы я не читал, везде пишется примерно одно и тоже: любые действия, не связанные с UI, нужно выполнять в отдельном потоке, так же и всю работу с бд или сетью. А тут вы говорите, что создавать потоки не нужно. Что вы имеете ввиду?
  • Почему webView.loadData не всегда отображает все символы?

    @foonfyrick Автор вопроса
    Но мне не понятно немного другое, почему если эту строчку написать val webData = text.replace("#", "0"), то все символы отображаются на странице, хотя в ней заменяется лишь символ "#", как я прочитал, метод loadData не может отображать некоторые символы, но все же он их отображает.
  • Что значит фраза "пайтон, язык с самым полным ООП"?

    @foonfyrick Автор вопроса
    Barmunk, единственный интересный ответ
  • Как передать данные из фрагмента в таб?

    @foonfyrick Автор вопроса
    Денис Загаевский, Вы сказали как данные отправлять из вложенного фрагмента в родительский, а наоборот как? Из родительского во вложенный. Вот есть у меня фрагмент "A" я хочу из него данные отправлять во вложенный в него фрагмент "B".
  • Как передать данные из фрагмента в таб?

    @foonfyrick Автор вопроса
    Денис Загаевский, Спасибо, разобрался, через интерфейс все передается. Еще такой вопрос, получается только через интерфейс можно передавать, а разово данные нельзя через таргет передать, там через точку можно к arguments обратиться, но почему-то ничего не передается, тогда зачем он targetFragment.arguments?
  • Как передать данные из фрагмента в таб?

    @foonfyrick Автор вопроса
    Денис Загаевский, А если эти 2 фрагмента находятся в другом фрагменте? Просто добавить фрагменты я могу, но если я еще и таргет устанавливаю, то ошибку пишет:
    Fragment ChildFragment1 declared target fragment ChildFragment2 that does not belong to this FragmentManager!

    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()
            }
  • Как передать данные из фрагмента в таб?

    @foonfyrick Автор вопроса
    Денис Загаевский, Не смог разобраться с передачей аргументов через targetFragment, вы говорите, что они должны находиться на экране оба, после завершения транзакции нужно установить ему таргет, то есть я пишу так:
    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()

    А как данные туда положить и получить их?
    Написано что targetFragment вернет тот фрагмент, который я установил, то есть в данном случае(ChildFragment2()), если arguments вызывать, то никакие аргументы никуда не приходят, onActivityResult тоже не приходят, и в инете вообще я не нашел чтобы через таргет передавали аргументы ,если только из fragmentDialog
  • Linkedlist, однонаправленный или двунаправленный?

    @foonfyrick Автор вопроса
    А где тогда однонаправленный linked list?
  • После смены ориентации экрана в логи данные приходят, а на экране пусто?

    @foonfyrick Автор вопроса
    Денис Загаевский, Вот код, я весь день проверяю, все методы отрабатывают тогда, когда нужно, но после смены ориентации экрана данные перестают обновляться, хотя в логи приходят, еще раз ориентацию экрана меняю, на экране появляются изменения, которые вносились до смены ориентации и снова перестает обновляться.

    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()
        }
    
    }
  • Как передать данные из фрагмента в таб?

    @foonfyrick Автор вопроса
    Еще небольшой вопрос, а что плохого в том, чтобы создать Object с какой-то переменной внутри, и к ней можно обращаться хоть откуда, я просто никогда не видел чтобы так кто-то делал, значит это плохое решение, но почему плохое? Например я без проблем могу обратиться из автивити к этой переменной, записать в нее значение, и потом получить это значение где-то в дочернем фрагменте и что-нибудь с ним сделать.
  • Как передать данные из фрагмента в таб?

    @foonfyrick Автор вопроса
    То есть, напрямую невозможно передать? Я думал раз он вложенный, то у них взаимодействие попроще.
  • Разница между тегами fragment и FragmentContainerView?

    @foonfyrick Автор вопроса
    Денис Загаевский, А у вас не найдется пары минут взглянуть на репозиторий, может какие ошибки в построении архитектуры, или я какие-то ошибки при написании кода допускаю, а дальше я уже буду их решать, просто у меня опыта нету, я не вижу плохой или хороший код https://github.com/Cepreu-01/SkeletMVP , примерно это буду уже как презентацию своего кода скидывать.
  • Разница между тегами fragment и FragmentContainerView?

    @foonfyrick Автор вопроса
    Денис Загаевский, Подскажите, а если перед тем как пригласить на собеседование, просят выслать код, подразумевается что я должен какой-то большой проект на гите показать который я делал пару месяцев, или я могу что-го за пару часов набросать, как костяк приложения, и скинуть, или это будет глупо так делать? А то у меня на гите только один старый ужасный репозиторий который я писал 2 недели, а можно было за день написать такое и лучше.
  • Как понять, что в коде, при рефакторинге, код лучше заменить на лямбду, inline, дженерик?

    @foonfyrick Автор вопроса
    Когда лямбда упростит код? Например при передачи колбек функции в метод

    А какие еще есть сценарии, когда лямбда что-то упрощает, кроме колбэка? Просто я ни разу нигде не находил информацию, в которой говорится, вот если видите эту проблему она решается так, только в паттернах такое написано, но не видел чтобы там были лямбды или дженерики, или инлайн функциии.
  • Как понять, что в коде, при рефакторинге, код лучше заменить на лямбду, inline, дженерик?

    @foonfyrick Автор вопроса
    Когда нужно например обобщить метод. Допустим метод сортировки. Можно написать n разных методов которые будут сортировать массив, который содержит определенный тип данных. Например сегодня нам нужно сортировать массив строк. Мы пишем массив который на входе принимает тип данных String. А завтра нам нужно сортировать массив целых чисел. И мы снова пишем метод который сортирует числа. По факту это два одинаковых метода которые будут различаться лишь принимаемым типом данных, а это дублирование кода, что не есть хорошо.

    Дак так можно каждый метод делать дженериком, мне же не известно завтра как захотят чтобы я изменил код, получается мне всегда нужно стараться дженерики писать?
  • Как понять, что в коде, при рефакторинге, код лучше заменить на лямбду, inline, дженерик?

    @foonfyrick Автор вопроса
    Василий Банников, я вопрос подкорректировал, хотел сэкономить и написал, как оказалось, не понятно.
  • Разница между тегами fragment и FragmentContainerView?

    @foonfyrick Автор вопроса
    Вот, при использовании библиотеки navigation component, я могу использовать как тег fragment, так и FragmentContainerView, и первый фрагмент полностью заменяется на следующий в обоих случаях.

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