material-components / material-components/material-components-android

[TextInputEditText +BottomSheetDialogFragment] Input method buttons cannot be displayed on Android12

Aperta
#4,256 3 commenti 0 reazioni 0 assegnatari Vedi su GitHub

Nessuno ha ancora preso questa issue.

bug Need more info
Lingua principale
Java
Stelle
17.4k
Fork
3.2k
Metriche di merge delle PR
Nessuna PR unita negli ultimi 30g

Descrizione

Description: On Android 12 devices, the input method that pops up by clicking on the input box is gray and cannot be entered normally

Expected behavior: 如图所示,点击输入框后弹出的是灰色的一片内容,
image

Source code:

# xml file 
<?xml version="1.0" encoding="utf-8"?>
<androidx.coordinatorlayout.widget.CoordinatorLayout
  xmlns:android="http://schemas.android.com/apk/res/android"
  xmlns:app="http://schemas.android.com/apk/res-auto"
  xmlns:tools="http://schemas.android.com/tools"
  android:layout_width="match_parent"
  android:layout_height="match_parent">

    <com.google.android.material.bottomsheet.BottomSheetDragHandleView
      android:id="@+id/drag_handle"
      android:layout_width="match_parent"
      android:layout_height="wrap_content"/>


    <androidx.constraintlayout.widget.ConstraintLayout
      android:layout_width="match_parent"
      android:layout_height="match_parent"
      >

      <Button
        android:id="@+id/close"
        style="?attr/materialIconButtonStyle"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:visibility="gone"
        app:icon="@drawable/close"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"/>


      <Button
        android:id="@+id/done"
        style="?attr/materialIconButtonStyle"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        app:icon="@drawable/done"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintTop_toTopOf="parent"/>

      <TextView
        android:id="@+id/title"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="15dp"
        android:text="@string/add_input_title"
        android:textColor="@color/black"
        android:textSize="@dimen/mediumFont"
        app:layout_anchorGravity="top|center"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="0.498"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"/>


      <com.google.android.material.divider.MaterialDivider
        android:id="@+id/cascade_divider"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/done"/>

      <com.google.android.material.progressindicator.LinearProgressIndicator
        android:id="@+id/loading"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="4dp"
        android:indeterminate="true"
        android:visibility="gone"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="0.498"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@id/cascade_divider"/>


      <com.google.android.material.textfield.TextInputLayout
        android:id="@+id/ip"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="8dp"
        android:layout_marginStart="8dp"
        android:layout_marginEnd="8dp"
        android:hint="@string/add_input_ip"
        app:endIconMode="clear_text"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/loading">
        <com.google.android.material.textfield.TextInputEditText
          android:id="@+id/ip_input"
          android:layout_width="match_parent"
          android:layout_height="wrap_content"
          android:inputType="text"
          android:singleLine="true"
         />

      </com.google.android.material.textfield.TextInputLayout>

      <com.google.android.material.textfield.TextInputLayout
        android:id="@+id/port"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="8dp"
        android:layout_marginBottom="100dp"
        android:layout_marginStart="8dp"
        android:layout_marginEnd="8dp"
        android:hint="@string/add_input_port"
        app:endIconMode="clear_text"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/ip"
        app:layout_constraintVertical_bias="0.0">
        <com.google.android.material.textfield.TextInputEditText
          android:id="@+id/port_input"
          android:layout_width="match_parent"
          android:layout_height="wrap_content"
          android:inputType="number"
          android:singleLine="true" />

      </com.google.android.material.textfield.TextInputLayout>
    </androidx.constraintlayout.widget.ConstraintLayout>
</androidx.coordinatorlayout.widget.CoordinatorLayout>
# in kotlin code
class AddressInputDialog : BottomSheetDialogFragment() {
  lateinit var binding: AddressInputDialogBinding
    private set

  var log: Logger
    private set
  private val model: CommonModel by viewModels<CommonModel> { ViewModelProvider.NewInstanceFactory() }

  init {
    log = LoggerFactory.getLogger(AddressInputDialog::class.java)
  }

  override fun onCreateView(
    inflater: LayoutInflater,
    container: ViewGroup?,
    savedInstanceState: Bundle?
  ): View? {
    binding = AddressInputDialogBinding.inflate(inflater, container, false)
    val ret: View = binding.root
    initView()
    return ret
  }

  fun initView() {
    val properties = Tools.loadConfig(context, "config.properties")
    if (properties.getProperty("ServerUrl") != null) {
      if (properties.getProperty("ip") != null) {

        binding.ipInput.setText(properties.getProperty("ip"))
        binding.portInput.setText(properties.getProperty("port"))
      } else {
        val regex = "http://([0-9]+\\.[0-9]+\\.[0-9]+\\.[0-9]+):([0-9]+)/.*".toRegex()
        val matchResult = regex.find(properties.getProperty("ServerUrl")!!)
        if (matchResult != null) {
          val ip = matchResult.groupValues[1]
          val name = matchResult.groupValues[2]
          binding.ipInput.setText(ip)
          binding.portInput.setText(name)
        }

      }
    } else {
      binding.ipInput.setText("192.168.18.110")
      binding.portInput.setText("8082")
    }
    binding.done.setOnClickListener {
      val ip = binding.ipInput.text.toString()
      if (ip.isEmpty()) {
        binding.ipInput.error = getString(R.string.add_input_tip_1)
        return@setOnClickListener
      }
      val port = binding.portInput.text.toString()
      if (port.isEmpty()) {
        binding.portInput.error = getString(R.string.add_input_tip_2)
        return@setOnClickListener
      }
      val ipPattern =
        "^((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$"
      val domainPattern =
        "^(?=^.{1,253}$)(^(?:(?!\\d|-)[a-zA-Z0-9\\-]{1,63}(?<!-)\\.)+[a-zA-Z]{2,63}$)"
      if (!ip.matches(ipPattern.toRegex()) && !ip.matches(domainPattern.toRegex())) {
        binding.ipInput.error = getString(R.string.add_input_tip_3)
        return@setOnClickListener
      }
      log.info("ip:$ip port:$port")

      val url = "http://$ip:$port/MesWhsWebService"
      properties.setProperty("ServerUrl", url)
      properties.setProperty("ip", ip)
      properties.setProperty("port", port)
      Tools.saveConfig(context, "config.properties", properties)
      model.setOdin(true)
      dismiss()
    }
  }
}
 AddressInputDialog dialog = new AddressInputDialog();
      dialog.show(getSupportFragmentManager(), "AddressInputDialog");

Minimal sample app repro:

Android API version: Android API 31

Material Library version: Material Android Library android-material="1.12.0"

Device: android emulator Virtual Device android 12; and other android 12 Device ,eg: XIAOMI 10S

Guida per i contributori

Apri la guida per i contributori

Come iniziare

  1. Leggi tutta la issue e poi la guida ai contributi del progetto.
  2. Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
  3. Fai un fork del repository e lavora su un branch.
  4. Apri una pull request che faccia riferimento al numero della issue.

Direzione di ricerca

Inizia con l’AddressInputDialog fornito, il relativo punto di ingresso BottomSheetDialogFragment e il layout TextInputEditText. Riproduci il flusso di input su Android API 31 utilizzando l’XML e Kotlin forniti, quindi confronta il comportamento sui dispositivi segnalati. Il lavoro è completato quando il metodo di input è utilizzabile con uno dei due campi focalizzato, senza introdurre regressioni nella UI del bottom sheet.

Scritto dal modello di indicizzazione a partire dal testo della issue.

Valutazione

Stack tecnologico
android, kotlin, xml
Ambito
mobile
Tipo di issue
Bug
Difficoltà
4/5
Tempo stimato
3-5 giorni
Stato di attività
Ferma
Chiarezza
Abbastanza chiara
Idoneità per principianti
35/100

Ricevi le nuove issue nella tua casella

Un breve riepilogo di issue GitHub adatte ai principianti.