Создание простого Android фрагмента с помощью Navigation Drawer - PullRequest
0 голосов
/ 30 января 2020

Я опытный разработчик, но плохо знаком с 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) Нажатие назад не возвращает вас к предыдущему экрану. Вместо этого при первом нажатии вы переходите к экрану домашней навигации (не к экрану навигации, который запустил этот фрагмент) И с фрагментом, все еще появляющимся перед ним (!). Второе нажатие на кнопку «Назад» затем удаляет фрагмент. '

Это прогресс, я думаю, но все еще в замешательстве.

Ответы [ 2 ]

0 голосов
/ 01 февраля 2020

Чтобы ответить на мой собственный вопрос, очевидно, шаблон ящика навигации android использует компонент навигации, а это значит, что мне нужно научиться использовать дизайнер навигации в mobile_navigation. xml, добавить новый экран там, сделать связь между моим предыдущим экраном и моим новым экраном, а затем, когда я хочу активировать его, я вызываю следующее, передавая идентификатор связи между моими экранами.

findNavController().navigate(R.id.action_nav_gallery_to_iconPackGalleryFragment)

После Делая это, это работает. Мне все еще нужно узнать и понять, когда использовать менеджер фрагментов, а когда использовать контроллер навигации, но, похоже, в этом случае используйте контроллер навигации, а не менеджер фрагментов.

0 голосов
/ 30 января 2020

попробуйте это:

val fragmentManager = (activity as MainActivity).supportFragmentManager
val fragmentTransaction = fragmentManager.beginTransaction()
val fragment = IconPackGalleryFragment()
fragmentTransaction.add(R.id.fragment_iconpackgallery, fragment)
fragmentTransaction.commit()

и в файле xml добавьте:

   <FrameLayout
        android:id="@+id/fragment_iconpackgallery"
        android:layout_width="0dp"
        android:layout_height="0dp"/>

где вам это нужно.

...