Fixed custom dialog behaving oddly while displaying scrollable content

This commit is contained in:
Viktor De Pasquale 2019-12-06 20:34:25 +01:00
parent 848be8f806
commit eae4eff92f
2 changed files with 58 additions and 34 deletions

View File

@ -9,9 +9,12 @@ import android.os.Bundle
import android.view.LayoutInflater import android.view.LayoutInflater
import android.view.View import android.view.View
import android.view.ViewGroup import android.view.ViewGroup
import android.view.WindowManager
import androidx.annotation.DrawableRes import androidx.annotation.DrawableRes
import androidx.annotation.StringRes import androidx.annotation.StringRes
import androidx.appcompat.app.AlertDialog import androidx.appcompat.app.AppCompatDialog
import androidx.core.view.ViewCompat
import androidx.core.view.updatePadding
import androidx.databinding.ViewDataBinding import androidx.databinding.ViewDataBinding
import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView import androidx.recyclerview.widget.RecyclerView
@ -26,7 +29,7 @@ import me.tatarka.bindingcollectionadapter2.ItemBinding
class MagiskDialog @JvmOverloads constructor( class MagiskDialog @JvmOverloads constructor(
context: Context, theme: Int = 0 context: Context, theme: Int = 0
) : AlertDialog(context, theme) { ) : AppCompatDialog(context, theme) {
private val binding: DialogMagiskBaseBinding = private val binding: DialogMagiskBaseBinding =
DialogMagiskBaseBinding.inflate(LayoutInflater.from(context)) DialogMagiskBaseBinding.inflate(LayoutInflater.from(context))
@ -34,12 +37,30 @@ class MagiskDialog @JvmOverloads constructor(
init { init {
binding.setVariable(BR.data, data) binding.setVariable(BR.data, data)
super.setView(binding.root)
} }
override fun onCreate(savedInstanceState: Bundle?) { override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState) super.onCreate(savedInstanceState)
window?.setBackgroundDrawable(ColorDrawable(Color.TRANSPARENT)) super.setContentView(binding.root)
window?.apply {
setBackgroundDrawable(ColorDrawable(Color.TRANSPARENT))
setLayout(
WindowManager.LayoutParams.MATCH_PARENT,
WindowManager.LayoutParams.MATCH_PARENT
)
}
ViewCompat.setOnApplyWindowInsetsListener(binding.root) { view, insets ->
view.updatePadding(
top = view.paddingTop + insets.systemWindowInsetTop,
bottom = view.paddingBottom + insets.systemWindowInsetBottom
)
insets
}
binding.dialogBaseOutsideContainer.setOnClickListener {
setCanceledOnTouchOutside(true)
}
} }
inner class Data { inner class Data {

View File

@ -13,6 +13,7 @@
<androidx.constraintlayout.widget.ConstraintLayout <androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent" android:layout_width="match_parent"
android:id="@+id/dialog_base_outside_container"
android:layout_height="match_parent"> android:layout_height="match_parent">
<com.google.android.material.card.MaterialCardView <com.google.android.material.card.MaterialCardView
@ -20,10 +21,11 @@
android:layout_width="0dp" android:layout_width="0dp"
android:layout_height="wrap_content" android:layout_height="wrap_content"
app:cardElevation="@dimen/margin_generic" app:cardElevation="@dimen/margin_generic"
app:layout_constrainedHeight="true"
app:cardUseCompatPadding="true" app:cardUseCompatPadding="true"
app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent" app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintRight_toRightOf="parent" app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" app:layout_constraintTop_toTopOf="parent"
app:layout_constraintWidth_default="percent" app:layout_constraintWidth_default="percent"
app:layout_constraintWidth_max="400dp" app:layout_constraintWidth_max="400dp"
@ -51,8 +53,9 @@
android:id="@+id/dialog_base_icon" android:id="@+id/dialog_base_icon"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
app:layout_constraintLeft_toLeftOf="parent" app:layout_constraintBottom_toTopOf="@+id/dialog_base_title"
app:layout_constraintRight_toRightOf="parent" app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"> app:layout_constraintTop_toTopOf="parent">
<androidx.appcompat.widget.AppCompatImageView <androidx.appcompat.widget.AppCompatImageView
@ -82,64 +85,64 @@
android:gravity="center" android:gravity="center"
android:text="@{data.title}" android:text="@{data.title}"
android:textAppearance="@style/AppearanceFoundation.Title" android:textAppearance="@style/AppearanceFoundation.Title"
app:layout_constraintLeft_toLeftOf="@+id/dialog_base_start" app:layout_constraintEnd_toEndOf="@+id/dialog_base_end"
app:layout_constraintRight_toRightOf="@+id/dialog_base_end" app:layout_constraintStart_toStartOf="@+id/dialog_base_start"
app:layout_constraintTop_toBottomOf="@+id/dialog_base_icon" app:layout_constraintTop_toBottomOf="@+id/dialog_base_icon"
tools:lines="1" tools:lines="1"
tools:text="@tools:sample/lorem/random" /> tools:text="@tools:sample/lorem/random" />
<androidx.core.widget.NestedScrollView <FrameLayout
android:id="@+id/dialog_base_scroll" android:id="@+id/dialog_base_scroll"
android:layout_width="0dp" android:layout_width="0dp"
android:layout_height="wrap_content" android:layout_height="wrap_content"
app:layout_constrainedHeight="true"
android:layout_marginTop="@dimen/l_50" android:layout_marginTop="@dimen/l_50"
app:layout_constrainedHeight="true"
app:layout_constraintBottom_toTopOf="@+id/dialog_base_space" app:layout_constraintBottom_toTopOf="@+id/dialog_base_space"
app:layout_constraintLeft_toLeftOf="@+id/dialog_base_start" app:layout_constraintEnd_toEndOf="@+id/dialog_base_end"
app:layout_constraintRight_toRightOf="@+id/dialog_base_end" app:layout_constraintStart_toStartOf="@+id/dialog_base_start"
app:layout_constraintTop_toBottomOf="@+id/dialog_base_title"> app:layout_constraintTop_toBottomOf="@+id/dialog_base_title">
<LinearLayout <androidx.core.widget.NestedScrollView
gone="@{data.message.length == 0}"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content">
android:orientation="vertical">
<androidx.appcompat.widget.AppCompatTextView <androidx.appcompat.widget.AppCompatTextView
android:id="@+id/dialog_base_message" android:id="@+id/dialog_base_message"
gone="@{data.message.length == 0}"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="match_parent"
android:gravity="center" android:gravity="center"
android:text="@{data.message}" android:text="@{data.message}"
android:textAppearance="@style/AppearanceFoundation.Body" android:textAppearance="@style/AppearanceFoundation.Body"
tools:lines="3" tools:lines="3"
tools:text="@tools:sample/lorem/random" /> tools:text="@tools:sample/lorem/random" />
<FrameLayout </androidx.core.widget.NestedScrollView>
android:id="@+id/dialog_base_container"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
</LinearLayout> <FrameLayout
android:id="@+id/dialog_base_container"
gone="@{data.message.length != 0}"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
</androidx.core.widget.NestedScrollView> </FrameLayout>
<Space <Space
android:id="@+id/dialog_base_space" android:id="@+id/dialog_base_space"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="@dimen/l1" android:layout_height="@dimen/l1"
app:layout_constraintLeft_toLeftOf="parent" app:layout_constraintBottom_toTopOf="@+id/dialog_base_buttons"
app:layout_constraintRight_toRightOf="parent" app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintBottom_toTopOf="@+id/dialog_base_buttons" /> app:layout_constraintStart_toStartOf="parent" />
<ScrollView <FrameLayout
android:id="@+id/dialog_base_buttons" android:id="@+id/dialog_base_buttons"
style="?attr/buttonBarStyle" style="?attr/buttonBarStyle"
android:layout_width="match_parent" android:layout_width="0dp"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:fillViewport="true" app:layout_constraintBottom_toBottomOf="parent"
android:scrollbarAlwaysDrawVerticalTrack="true" app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintBottom_toBottomOf="parent"> app:layout_constraintStart_toStartOf="parent">
<com.android.internal.widget.ButtonBarLayout <com.android.internal.widget.ButtonBarLayout
android:layout_width="match_parent" android:layout_width="match_parent"
@ -223,7 +226,7 @@
</com.android.internal.widget.ButtonBarLayout> </com.android.internal.widget.ButtonBarLayout>
</ScrollView> </FrameLayout>
</androidx.constraintlayout.widget.ConstraintLayout> </androidx.constraintlayout.widget.ConstraintLayout>