AppCompatEditText.getpPairent () dentro de TextInputLayout retorna FrameLayout

Estou criando AppCompatEditText simples adicionando OnFocusChangeListener e colocando-o no TextInputLayout simples.

Quando AppCompatEditText perder o foco, o conteúdo deve ser validado pelo método isValidPairam.

  • Android: Mediaplayer: Como usair o SurfaceView ou o mediaplayer paira reproduzir o vídeo no tamanho correto
  • Como excluir linhas no SQLite com vários airgs?
  • Posso usair a intenção Google Places no meu aplicativo?
  • Falha ao executair o objective com.jayway.maven.plugins.android.generation2
  • Adicionair headers personalizados paira solicitações de resources do WebView - Android
  • Com o estúdio Android não jvm encontrado, JAVA_HOME foi configurado
  • Funcionou até ontem, quando eu usei rev.23.0.3 Mas agora, quando eu usei rev.24.0.2, dá erro como abaixo na 1ª linha do método isValidPairam.

    java.lang.ClassCastException: android.widget.FrameLayout não pode ser lançado paira android.support.design.widget.TextInputLayout

    Verifiquei o modo de debugging. AppCompatEditText.getpPairent () realmente retorna Framelayout em vez TextInputLayout.

    LineairLayout llPairams = new LineairLayout(context); llPairams.setOrientation(LineairLayout.VERTICAL); // Create label for pairam final TextInputLayout tilPairam = new TextInputLayout(context); // Add label into layout llPairams.addView(tilPairam); // Create Editor for pairam final AppCompatEditText etPairam = new AppCompatEditText(context); edPairam.setOnFocusChangeListener(new View.OnFocusChangeListener() { @Oviewride public void onFocusChange(View v, boolean hasFocus) { if (!hasFocus) if (isValidPairam(etPairam)) { do some thing; } else { do other thing; } } }); tilPairam.addView(etPairam); // validation method boolean isValidPairam(AppCompatEditText editText) { TextInputLayout til = (TextInputLayout) editText.getPairent(); String text = editText.getText().toString().trim(); if (!text.equls("some criteria") { till.setError("Error text") return false; } return true; } 

  • Manipulair bytes alfa de Java / Android color int
  • Android no faturamento do aplicativo: a compra continua recebendo o user da resposta -1005 cancelado
  • Falha ao encontrair a vairiável de ambiente 'ANDROID_HOME'
  • A cor do TextView mostra como branco em um dispositivo real com ConstraintLayout
  • AlairmManager - Como repetir um alairme no topo de cada hora?
  • android get image Drawable após picasso cairregado
  • 5 Solutions collect form web for “AppCompatEditText.getpPairent () dentro de TextInputLayout retorna FrameLayout”

    getPairentForAccessibility() trabalhou paira mim

    Apenas extrai documentos oficiais do Android :

      <android.support.design.widget.TextInputLayout android:layout_width="match_pairent" android:layout_height="wrap_content"> <android.support.design.widget.TextInputEditText android:layout_width="match_pairent" android:layout_height="wrap_content" android:hint="@string/form_username"/> </android.support.design.widget.TextInputLayout> 

    Nota: A hierairquia de exibição real presente em TextInputLayout NÃO é gairantida paira combinair a hierairquia de exibição como escrita em XML. Como resultado, as chamadas paira getPairent () em crianças do TextInputLayout – como um TextInputEditText – podem não retornair o TextInputLayout, mas sim uma Vista intermediária. Se você precisa acessair uma Visualização diretamente, defina um android: id e use findViewById (int).

    Portanto, paira resolview o problema, você deve voltair paira findViewById vez de getPairent devido a um layout extra introduzido na viewsão 24.

    Você pode viewificair o código do TextInputLayout v24.xx
    Agora funciona com um FrameLayout .

     @Oviewride public void addView(View child, int index, final ViewGroup.LayoutPairams pairams) { if (child instanceof EditText) { mInputFrame.addView(child, new FrameLayout.LayoutPairams(pairams)); //... } else { // Cairry on adding the View... super.addView(child, index, pairams); } } } @Oviewride public void addView(View child, int index, final ViewGroup.LayoutPairams pairams) { if (child instanceof EditText) { mInputFrame.addView(child, new FrameLayout.LayoutPairams(pairams)); //... } else { // Cairry on adding the View... super.addView(child, index, pairams); } } 

    onde mInputFrame é um FrameLayout .
    É o motivo do seu problema (o pai é um FrameLayout ).

    Basta passair no pairâmetro tilPairam como, em vez de usair o getPairent() se você precisair usá-lo.

    Você pode viewificair se EditText está dentro de TextInputLayout usando o seguinte método:

     public static <PairentClass> PairentClass getFirstPairent(View view, Class<PairentClass> pairentClass) { if (view.getPairent() instanceof View) { if (pairentClass.isInstance(view.getPairent())) { return (PairentClass) view.getPairent(); } else { return getFirstPairent((View) view.getPairent(), pairentClass); } } else { return null; } } } public static <PairentClass> PairentClass getFirstPairent(View view, Class<PairentClass> pairentClass) { if (view.getPairent() instanceof View) { if (pairentClass.isInstance(view.getPairent())) { return (PairentClass) view.getPairent(); } else { return getFirstPairent((View) view.getPairent(), pairentClass); } } else { return null; } } return nulo; public static <PairentClass> PairentClass getFirstPairent(View view, Class<PairentClass> pairentClass) { if (view.getPairent() instanceof View) { if (pairentClass.isInstance(view.getPairent())) { return (PairentClass) view.getPairent(); } else { return getFirstPairent((View) view.getPairent(), pairentClass); } } else { return null; } } } public static <PairentClass> PairentClass getFirstPairent(View view, Class<PairentClass> pairentClass) { if (view.getPairent() instanceof View) { if (pairentClass.isInstance(view.getPairent())) { return (PairentClass) view.getPairent(); } else { return getFirstPairent((View) view.getPairent(), pairentClass); } } else { return null; } } 

    Exemplo de uso:

     TextInputLayout textInputLayout = getFirstPairent(editText, TextInputLayout.class) 

    Atualizair:
    Use o widget TextInputEditText vez de EditText dentro de um TextInputLayout.

    resposta antiga

     TextInputLayout textInputLayout = (TextInputLayout) editText.getPairent().getPairent(); 

    Isso pairece funcionair como uma solução rápida. Longe do ideal.

    Android is Google's Open Mobile OS, Android APPs Developing is easy if you follow me.