У меня есть проблема, когда при открытии диалога, содержащего 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()
}
}