use Material styling for all dialogs

This commit is contained in:
johan12345
2022-08-20 18:40:48 +02:00
parent fc5e77b01a
commit 17bd7f024e
7 changed files with 72 additions and 40 deletions

View File

@@ -6,7 +6,6 @@ import android.view.LayoutInflater
import android.view.MotionEvent
import android.view.View
import android.view.ViewGroup
import androidx.appcompat.app.AlertDialog
import androidx.databinding.DataBindingUtil
import androidx.fragment.app.Fragment
import androidx.fragment.app.viewModels
@@ -17,6 +16,7 @@ import androidx.navigation.ui.setupWithNavController
import androidx.recyclerview.widget.DividerItemDecoration
import androidx.recyclerview.widget.LinearLayoutManager
import com.google.android.material.color.MaterialColors
import com.google.android.material.dialog.MaterialAlertDialogBuilder
import com.google.android.material.snackbar.Snackbar
import com.google.android.material.transition.MaterialContainerTransform
import net.vonforst.evmap.MapsActivity
@@ -69,7 +69,7 @@ class ChargepriceFragment : Fragment() {
}
private fun showDonationDialog() {
AlertDialog.Builder(requireContext())
MaterialAlertDialogBuilder(requireContext())
.setTitle(R.string.chargeprice_donation_dialog_title)
.setMessage(R.string.chargeprice_donation_dialog_detail)
.setNegativeButton(R.string.ok) { di, _ ->

View File

@@ -4,13 +4,12 @@ import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.appcompat.app.AppCompatDialogFragment
import net.vonforst.evmap.databinding.DialogDataSourceSelectBinding
import net.vonforst.evmap.model.FILTERS_DISABLED
import net.vonforst.evmap.storage.PreferenceDataSource
import java.util.*
import net.vonforst.evmap.ui.MaterialDialogFragment
class DataSourceSelectDialog : AppCompatDialogFragment() {
class DataSourceSelectDialog : MaterialDialogFragment() {
private lateinit var binding: DialogDataSourceSelectBinding
var okListener: ((String) -> Unit)? = null
@@ -41,11 +40,7 @@ class DataSourceSelectDialog : AppCompatDialogFragment() {
override fun onStart() {
super.onStart()
// dialog with 95% screen height
dialog?.window?.setLayout(
ViewGroup.LayoutParams.MATCH_PARENT,
(resources.displayMetrics.heightPixels * 0.95).toInt()
)
setFullSize()
}
private lateinit var prefs: PreferenceDataSource

View File

@@ -20,7 +20,6 @@ import android.widget.Toast
import androidx.activity.OnBackPressedCallback
import androidx.activity.result.contract.ActivityResultContracts
import androidx.annotation.RequiresPermission
import androidx.appcompat.app.AlertDialog
import androidx.appcompat.widget.PopupMenu
import androidx.core.content.ContextCompat
import androidx.core.location.LocationListenerCompat
@@ -52,6 +51,7 @@ import com.car2go.maps.model.BitmapDescriptor
import com.car2go.maps.model.LatLng
import com.car2go.maps.model.Marker
import com.car2go.maps.model.MarkerOptions
import com.google.android.material.dialog.MaterialAlertDialogBuilder
import com.google.android.material.snackbar.Snackbar
import com.google.android.material.transition.MaterialArcMotion
import com.google.android.material.transition.MaterialContainerTransform
@@ -805,7 +805,7 @@ class MapFragment : Fragment(), OnMapReadyCallback, MapsActivity.FragmentCallbac
it.name
}
}
AlertDialog.Builder(activity)
MaterialAlertDialogBuilder(activity)
.setTitle(R.string.charge_cards)
.setItems(names.toTypedArray()) { _, i ->
val card = data[i]

View File

@@ -4,20 +4,16 @@ import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.view.WindowManager
import androidx.appcompat.app.AppCompatDialogFragment
import androidx.core.widget.doAfterTextChanged
import androidx.recyclerview.widget.LinearLayoutManager
import net.vonforst.evmap.R
import net.vonforst.evmap.adapter.DataBindingAdapter
import net.vonforst.evmap.adapter.Equatable
import net.vonforst.evmap.databinding.DialogMultiSelectBinding
import net.vonforst.evmap.ui.MaterialDialogFragment
import java.util.*
import kotlin.collections.HashMap
import kotlin.collections.HashSet
import kotlin.math.roundToInt
class MultiSelectDialog : AppCompatDialogFragment() {
class MultiSelectDialog : MaterialDialogFragment() {
companion object {
fun getInstance(
title: String,
@@ -54,16 +50,7 @@ class MultiSelectDialog : AppCompatDialogFragment() {
override fun onStart() {
super.onStart()
val density = resources.displayMetrics.density
val width = resources.displayMetrics.widthPixels
val maxWidth = (500 * density).roundToInt()
// dialog with 95% screen height
dialog?.window?.setLayout(
if (width < maxWidth) WindowManager.LayoutParams.MATCH_PARENT else maxWidth,
(resources.displayMetrics.heightPixels * 0.95).toInt()
)
setFullSize(maxWidthDp = 500)
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {

View File

@@ -4,15 +4,13 @@ import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.view.WindowManager
import androidx.appcompat.app.AppCompatDialogFragment
import androidx.navigation.fragment.findNavController
import net.vonforst.evmap.R
import net.vonforst.evmap.databinding.DialogOpensourceDonationsBinding
import net.vonforst.evmap.storage.PreferenceDataSource
import kotlin.math.roundToInt
import net.vonforst.evmap.ui.MaterialDialogFragment
class OpensourceDonationsDialogFramgent : AppCompatDialogFragment() {
class OpensourceDonationsDialogFramgent : MaterialDialogFragment() {
private lateinit var binding: DialogOpensourceDonationsBinding
override fun onCreateView(
@@ -45,13 +43,6 @@ class OpensourceDonationsDialogFramgent : AppCompatDialogFragment() {
override fun onStart() {
super.onStart()
val density = resources.displayMetrics.density
val width = resources.displayMetrics.widthPixels
val maxWidth = (500 * density).roundToInt()
dialog?.window?.setLayout(
if (width < maxWidth) WindowManager.LayoutParams.MATCH_PARENT else maxWidth,
WindowManager.LayoutParams.WRAP_CONTENT
)
setFullSize(maxWidthDp = 500)
}
}

View File

@@ -1,14 +1,20 @@
package net.vonforst.evmap.ui
import android.app.Dialog
import android.content.Context
import android.content.DialogInterface
import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.view.WindowManager
import android.view.inputmethod.EditorInfo
import android.widget.EditText
import android.widget.FrameLayout
import androidx.appcompat.app.AlertDialog
import androidx.appcompat.app.AppCompatDialogFragment
import com.google.android.material.dialog.MaterialAlertDialogBuilder
import kotlin.math.roundToInt
private fun dialogEditText(ctx: Context): Pair<View, EditText> {
val container = FrameLayout(ctx)
@@ -49,4 +55,55 @@ fun showEditTextDialog(
false
}
return dialog
}
/**
* DialogFragment that uses Material styling.
* This needs a bit of a workaround, see also
* https://github.com/material-components/material-components-android/issues/540 and
* https://dev.to/bhullnatik/how-to-use-material-dialogs-with-dialogfragment-28i1
*/
open class MaterialDialogFragment : AppCompatDialogFragment() {
private lateinit var dialogView: View
override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
val dialog = MaterialAlertDialogBuilder(requireContext(), theme).apply {
dialogView =
onCreateView(LayoutInflater.from(requireContext()), null, savedInstanceState)!!
setView(dialogView)
}.create()
onViewCreated(dialogView, savedInstanceState)
return dialog
}
override fun getView(): View {
return dialogView
}
override fun onStart() {
super.onStart()
// make sure that custom view fills whole dialog height
(view.parent as View).layoutParams.height = ViewGroup.LayoutParams.MATCH_PARENT
(view.parent.parent as View).layoutParams.height = ViewGroup.LayoutParams.MATCH_PARENT
(view.parent.parent.parent as View).layoutParams.height =
ViewGroup.LayoutParams.MATCH_PARENT
}
/**
* Makes the dialog fill the whole width & height of the screen, with an optional maximum
* width in dp. Call this during onStart.
*/
fun setFullSize(maxWidthDp: Int? = null) {
val width = resources.displayMetrics.widthPixels
val maxWidth = if (maxWidthDp != null) {
val density = resources.displayMetrics.density
(maxWidthDp * density).roundToInt()
} else null
dialog?.window?.setLayout(
if (maxWidth == null || width < maxWidth) WindowManager.LayoutParams.MATCH_PARENT else maxWidth,
WindowManager.LayoutParams.MATCH_PARENT
)
}
}

View File

@@ -13,6 +13,7 @@
<item name="colorOnSecondaryContainer">@color/colorSecondaryDark</item>
<item name="android:windowTranslucentStatus">true</item>
<item name="preferenceTheme">@style/AppTheme.Preference</item>
<item name="alertDialogTheme">@style/AppTheme.AlertDialog</item>
<item name="materialAlertDialogTheme">@style/AppTheme.AlertDialog</item>
</style>
@@ -71,6 +72,7 @@
<style name="AppTheme.AlertDialog" parent="ThemeOverlay.Material3.MaterialAlertDialog">
<!-- this is necessary to make sure the dialog gets "pushed up" when the keyboard appears -->
<item name="android:windowTranslucentStatus">false</item>
<item name="dialogCornerRadius">28dp</item>
</style>
</resources>