Я опытный разработчик, но плохо знаком с Android программированием, и я немного озадачен. Я начал со стандартного шаблона проекта Android Studio Navigation Drawer. Мне удалось реализовать простой список элементов в одном из фрагментов (фрагмент галереи) и что-то сделать, когда нажата кнопка. Поэтому, когда кнопка нажата, я хочу, чтобы она развернулась до нового экрана. Можно подумать, что все должно быть довольно просто, но я прочитал дюжину Android учебных пособий по фрагментам и ничего не получится.
Итак, я создал новый фрагмент, который хочу активировать :
package tech.iconultra.ui.gallery
import android.content.Context
import android.net.Uri
import android.os.Bundle
import androidx.fragment.app.Fragment
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.TextView
import tech.iconultra.R
private const val ARG_PARAM1 = "param1"
private const val ARG_PARAM2 = "param2"
class IconPackGalleryFragment : Fragment() {
// TODO: Rename and change types of parameters
private var param1: String? = null
private var param2: String? = null
private var listener: OnFragmentInteractionListener? = null
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
arguments?.let {
param1 = it.getString(ARG_PARAM1)
param2 = it.getString(ARG_PARAM2)
}
}
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
val root = inflater.inflate(R.layout.icon_pack_gallery, container, false)
return root
}
// TODO: Rename method, update argument and hook method into UI event
fun onButtonPressed(uri: Uri) {
listener?.onFragmentInteraction(uri)
}
override fun onAttach(context: Context) {
super.onAttach(context)
}
override fun onDetach() {
super.onDetach()
listener = null
}
interface OnFragmentInteractionListener {
fun onFragmentInteraction(uri: Uri)
}
companion object {
@JvmStatic
fun newInstance(param1: String, param2: String) =
IconPackGalleryFragment().apply {
arguments = Bundle().apply {
putString(ARG_PARAM1, param1)
putString(ARG_PARAM2, param2)
}
}
}
}
И простая раскладка:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/icon_pack_gallery"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<EditText
android:id="@+id/editText"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:ems="10"
android:inputType="textPersonName"
android:text="Name" />
<ScrollView
android:layout_width="match_parent"
android:layout_height="match_parent">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<TableLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
<TableRow
android:layout_width="match_parent"
android:layout_height="match_parent" />
<TableRow
android:layout_width="match_parent"
android:layout_height="match_parent" />
<TableRow
android:layout_width="match_parent"
android:layout_height="match_parent" />
<TableRow
android:layout_width="match_parent"
android:layout_height="match_parent" />
</TableLayout>
</LinearLayout>
</ScrollView>
</LinearLayout>
</LinearLayout>
, но я не знаю, какое воплощение может их активировать. Я пробовал это:
val fragmentManager: FragmentManager = activity!!.supportFragmentManager
fragmentManager?.beginTransaction()?.apply {
add(0, IconPackGalleryFragment(), "aaaaa")
commit()
}
и ничего не происходит. Я пробовал:
val fragmentManager: FragmentManager = activity!!.supportFragmentManager
fragmentManager?.beginTransaction()?.apply {
replace(R.id.installed_app_list, IconPackGalleryFragment(), "aaaaa")
commit()
}
(R.id.installed_app_list - фрагмент, из которого я его вызываю). Я попытался заменить R.id.installed_app_list другими различными макетами, но я озадачен тем, что я должен здесь передать в случае стандартного проекта шаблона навигационного ящика. Этот код делает приложение cra sh с ошибкой:
java.lang.UnsupportedOperationException: addView(View) is not supported in AdapterView
----- EDIT ------ Я обнаружил, что это приводит к появлению фрагмента:
fragmentManager?.beginTransaction()?.apply {
add(android.R.id.content, IconPackGalleryFragment(), "aaaaa")
addToBackStack("aaaaa")
commit()
}
Однако есть некоторые проблемы: 1) фрагмент, кажется, имеет невидимый фон, хотя сам фрагмент говорит, что его фон должен быть белым со 100% альфа. 2) Нажатие назад не возвращает вас к предыдущему экрану. Вместо этого при первом нажатии вы переходите к экрану домашней навигации (не к экрану навигации, который запустил этот фрагмент) И с фрагментом, все еще появляющимся перед ним (!). Второе нажатие на кнопку «Назад» затем удаляет фрагмент. '
Это прогресс, я думаю, но все еще в замешательстве.