[Kotlin] [Android] Диалог EditTexts, приводящий к скрытию вложенного PagerView2 в RecyclerView - PullRequest
0 голосов
/ 17 февраля 2020

У меня есть проблема, когда при открытии диалога, содержащего EditText любой PagerView2, который находится в позиции 1, скрывается, и я не могу выяснить, почему это происходит. Я пробовал много вариантов этого кода.

Я пытался использовать вложенный RecyclerView Я пытался использовать DialogFragment, и я пытался накачать EditText, когда я выполняю builder.setView(), ничего не кажется работать, и я не понимаю, почему.

Однако я заметил, что следующие значения изменяются / устанавливаются в LayoutInspector

drawing.getPivotY() 50.5 to 0
layout.getHeight() 101 to 0
layout.mBottom 101 to 0
measurement.measuredHeight 101 to 0
properties.mPrivateFlags_DRAWING_CACHE_INVALID set to 0x0

Эти значения применяются к LinearLayout это скрыто. Я предполагаю, что если я смогу сохранить эти значения такими же после нажатия кнопки переименования, проблема прекратится, но я понятия не имею, как.

Установка выглядит следующим образом: фрагмент открывается пользователем

class ManageCategoriesFragment : Fragment() {

    private var add: TextBox? = null

    override fun onCreateView(
        inflater: LayoutInflater,
        container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        val root = inflater.inflate(R.layout.fragment_manage_categories, container, false)
        val cat = Categories(context!!)
        val viewAdapter = CategoryRecyclerAdapter(cat)
        val templateList = root.findViewById<RecyclerView>(R.id.template_manage_category)
        val itemDecoration: RecyclerView.ItemDecoration = DividerItemDecoration(context, DividerItemDecoration.VERTICAL)
        templateList.addItemDecoration(itemDecoration)
        templateList.adapter = viewAdapter
        root.findViewById<View>(R.id.add).setOnClickListener {
            val listener = DialogInterface.OnClickListener { dialog, which->
                viewAdapter.cat.data.add(Categories.Category(add!!.getText()))
                viewAdapter.cat.sort()
                viewAdapter.cat.save()
                viewAdapter.notifyDataSetChanged()
            }
            add = TextBox(
                "Add New Category",
                "Please type the name for the new category",
                "",
                listener,
                context!!
            )
            add?.show()
        }
        return root

    }
}

Это раздувает следующее XML

<?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"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <androidx.recyclerview.widget.RecyclerView
        android:id="@+id/template_manage_category"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        app:layoutManager="LinearLayoutManager" />

    <com.google.android.material.floatingactionbutton.FloatingActionButton
        android:id="@+id/add"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="bottom|end"
        android:layout_margin="@dimen/fab_margin"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:srcCompat="@android:drawable/ic_menu_add" />

    </androidx.constraintlayout.widget.ConstraintLayout>

Адаптер для этого RecyclerView здесь

class CategoryRecyclerAdapter(val cat: Categories) : RecyclerView.Adapter<CategoryRecyclerViewHolder>() {

    lateinit var textView: TextView
    private lateinit var pagerAdapter: CategoryPagerAdapter
    lateinit var pager: ViewPager2

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): CategoryRecyclerViewHolder {
        val layout = LayoutInflater.from(parent.context).inflate(R.layout.list_pager, parent, false)
        return CategoryRecyclerViewHolder(layout)
    }

    override fun onBindViewHolder(holder: CategoryRecyclerViewHolder, position: Int) {
        pagerAdapter = CategoryPagerAdapter(CategoryModel.values(), this)
        pager = holder.itemView.findViewById(R.id.pager)
        pager.adapter = pagerAdapter
        pagerAdapter.text = cat.data[position].name
        pagerAdapter.pager = pager
        pagerAdapter.thisItem = position
    }

    override fun getItemCount() = cat.data.size
}

class CategoryRecyclerViewHolder(v: View) : RecyclerView.ViewHolder(v)

В свою очередь, это затем раздувает XML

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:orientation="horizontal">

    <androidx.viewpager2.widget.ViewPager2
        android:id="@+id/pager"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />
</LinearLayout>

Адаптер, назначенный для ViewPager2

class CategoryPagerAdapter(private val model: Array<CategoryModel>, private val parent: CategoryRecyclerAdapter): RecyclerView.Adapter<CategoryPagerViewHolder>() {

    var thisItem: Int = 0
    var text: String? = null
    var pager: ViewPager2? = null
    private var rename: TextBox? = null

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): CategoryPagerViewHolder {
        val view = model[viewType].layoutResId
        val layout = LayoutInflater.from(parent.context).inflate(view, parent, false)
        return CategoryPagerViewHolder(layout)
    }

    override fun getItemViewType(position: Int): Int = position

    override fun getItemCount() = model.size

    override fun onBindViewHolder(holder: CategoryPagerViewHolder, position: Int) {
        val item = holder.itemView
        if (position == 0 && text != null) {
            val textView = item.findViewById<TextView>(R.id.test_view)
            textView.text = text
            holder.itemView.setOnClickListener {
                pager?.currentItem = 1
            }
        } else if (position == 1) {
            item.findViewById<View>(R.id.back).setOnClickListener {
                pager?.currentItem = 0
            }
            item.findViewById<View>(R.id.rename).setOnClickListener {
                val listener = DialogInterface.OnClickListener { dialog, which->
                    parent.cat.data[thisItem].name = rename!!.getText()
                    parent.cat.sort()
                    parent.cat.save()
                    parent.notifyDataSetChanged()
                }
                rename = TextBox(
                    "Rename",
                    "Please type the new name for \"${parent.cat.data[thisItem].name}\"",
                    parent.cat.data[thisItem].name,
                    listener,
                    parent.pager.context
                )
                rename?.show()
            }
            item.findViewById<View>(R.id.manage).setOnClickListener {
                //TODO set action manage categories
                Log.i("MANAGE", "button pressed")
            }
            item.findViewById<View>(R.id.delete).setOnClickListener {
                val listener = DialogInterface.OnClickListener { dialog, which->
                    parent.cat.data.removeAt(thisItem)
                    parent.cat.save()
                    parent.notifyDataSetChanged()
                }
                val alert = Confirm(
                    "Are you sure you want to delete Category named \"${parent.cat.data[thisItem].name}\"?",
                    "You will not loose any data or any saved templates. This action cannot be undone.",
                    listener,
                    parent.pager.context
                )
                alert.show()
            }
        }
    }
}

class CategoryPagerViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView)

onCreateViewHolder, устанавливает макет динамически из CategoryModel enum

enum class CategoryModel(val layoutResId: Int) {
    TEXT(R.layout.list_item_pager),
    BUTTONS(R.layout.category_button_pager);
}

Первый макет

<?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"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="?android:attr/selectableItemBackground">

    <TextView
        android:id="@+id/test_view"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:padding="15dp"
        android:textSize="15sp"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <ImageView
        android:id="@+id/imageView2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        app:srcCompat="@drawable/ic_keyboard_arrow_right"
        android:contentDescription="@string/arrow_right" />

</androidx.constraintlayout.widget.ConstraintLayout>

Второй макет

<?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"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <androidx.constraintlayout.widget.ConstraintLayout
        android:id="@+id/back"
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:background="?android:attr/selectableItemBackground"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toStartOf="@id/rename"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent">

        <ImageView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:paddingStart="10dp"
            android:paddingEnd="10dp"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintHorizontal_bias="0.493"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toTopOf="parent"
            app:srcCompat="@drawable/ic_keyboard_arrow_left"
            android:contentDescription="@string/back_icon" />

    </androidx.constraintlayout.widget.ConstraintLayout>

    <androidx.constraintlayout.widget.ConstraintLayout
        android:id="@+id/rename"
        android:layout_width="0dp"
        android:layout_height="match_parent"
        android:background="?android:attr/selectableItemBackground"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toStartOf="@id/manage"
        app:layout_constraintStart_toEndOf="@id/back"
        app:layout_constraintTop_toTopOf="parent">

        <LinearLayout
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:orientation="horizontal"
            android:gravity="center"
            android:background="?android:attr/selectableItemBackground"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toTopOf="parent">

            <ImageView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                app:srcCompat="@drawable/ic_rename"
                android:contentDescription="@string/rename_icon" />

            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_gravity="center_vertical"
                android:layout_marginStart="5dp"
                android:text="@string/rename" />

        </LinearLayout>

    </androidx.constraintlayout.widget.ConstraintLayout>

    <androidx.constraintlayout.widget.ConstraintLayout
        android:id="@+id/manage"
        android:layout_width="0dp"
        android:layout_height="match_parent"
        android:background="?android:attr/selectableItemBackground"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toStartOf="@id/delete"
        app:layout_constraintStart_toEndOf="@+id/rename"
        app:layout_constraintTop_toTopOf="parent">

        <LinearLayout
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:orientation="horizontal"
            android:gravity="center"
            android:background="?android:attr/selectableItemBackground"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toTopOf="parent">

            <ImageView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            app:srcCompat="@drawable/ic_manage"
                android:contentDescription="@string/manage_icon" />

            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_gravity="center_vertical"
                android:layout_marginStart="5dp"
                android:text="@string/manage" />
        </LinearLayout>

    </androidx.constraintlayout.widget.ConstraintLayout>

    <androidx.constraintlayout.widget.ConstraintLayout
        android:id="@+id/delete"
        android:layout_width="0dp"
        android:layout_height="match_parent"
        android:background="?android:attr/selectableItemBackground"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toEndOf="@+id/manage"
        app:layout_constraintTop_toTopOf="parent">

        <LinearLayout
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:orientation="horizontal"
            android:gravity="center"
            android:background="?android:attr/selectableItemBackground"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toTopOf="parent">

            <ImageView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                app:srcCompat="@drawable/ic_delete"
                android:contentDescription="@string/delete_icon" />

            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_gravity="center_vertical"
                android:layout_marginStart="5dp"
                android:text="@string/delete" />
        </LinearLayout>
    </androidx.constraintlayout.widget.ConstraintLayout>


</androidx.constraintlayout.widget.ConstraintLayout>

При нажатии кнопки rename открывается диалоговое окно

class TextBox(title: String, message: String, text: String, private val listener: DialogInterface.OnClickListener, context: Context) {

    private val builder = AlertDialog.Builder(context)
    private var dialog: AlertDialog
    private var input = EditText(context)

    init {
        // Set the alert dialog title
        builder.setTitle(title)

        // Display a message on alert dialog
        builder.setMessage(message)
        //builder.setMessage(text)

        input.inputType = InputType.TYPE_CLASS_TEXT
        input.setText(text)
        input.selectAll()
        builder.setView(input)

        // Set a positive button and its click listener on alert dialog
        builder.setPositiveButton("Yes", listener)

        // Display a negative button on alert dialog
        //builder.setNegativeButton("No", null)

        // Display a neutral button on alert dialog
        builder.setNeutralButton("Cancel", null)

        // Finally, make the alert dialog using builder
        dialog = builder.create()
    }

    fun show() {
        // Display the alert dialog on app interface
        dialog.show()
    }

    fun getText(): String {
        return input.text.toString()
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...