Получить родительский texInputlayout из дочернего textInputEditText

Я реализую функциональность, чтобы изменить случай textInputlayout Текст подсказки к верхнему регистру, когда подсказка всплывает, и наоборот.

Для этого я использую OnFocusChangeListener на своего ребенка textInputEditText, Чтобы облегчить реализацию, я реализую View.OnFocusChangeListener на моей деятельности, как:

public class LoginActivity extends BaseActivity implements View.OnFocusChangeListener

и переопределение метода в деятельности, как:

@Override
public void onFocusChange(View v, boolean hasFocus) {
    if(findViewById(v.getId()) instanceof TextInputEditText){
        TextInputLayout textInputLayout = (TextInputLayout) findViewById(v.getId()).getParent();
        if(hasFocus){
            textInputLayout.setHint(textInputLayout.getHint().toString().toUpperCase());
        }else{
            textInputLayout.setHint(Utility.modifiedLowerCase(textInputLayout.getHint().toString()));
        }
    }
}

В приведенном выше методе я пытаюсь получить мнение родителей textInputLayout используя линию

TextInputLayout textInputLayout = (TextInputLayout) findViewById(v.getId()).getParent();

Приведенная выше строка кода вызывает фатальную ошибку

java.lang.ClassCastException: android.widget.FrameLayout не может быть приведен к android.support.design.widget.TextInputLayout

и это очень очевидно, потому что это возвращает Framelayout который не может быть брошен в textInputLayout

И если я использую

TextInputLayout textInputLayout = (TextInputLayout) findViewById(v.getId()).getRootView();

это снова приводит к фатальной ошибке, потому что getRootView() возвращается DecorView который не может быть брошен в textInputLayout

Мой вопрос, как получить родителя textInputLayout от ребенка textInputEditText?

Пожалуйста, руководство.

3 ответа

Решение

Я решил проблему с помощью следующей строки кода:

TextInputLayout textInputLayout = (TextInputLayout) findViewById(v.getId()).getParent().getParent();

Возвращается textInputlayout как требуется.

Вместо использования TextInputLayout textInputLayout = (TextInputLayout) findViewById(v.getId()).getParent();используйте экземпляр представления, например TextInputEditText et = (TextInputEditText) v;а потом TextInputLayout lay = (TextInputLayout)et.getParent().getParent();

Вы можете добавить идентификатор в TextInputLayout следующим образом:

<android.support.design.widget.TextInputLayout
    android:id="@+id/nameLayout"
    style="@style/LightInputLayoutNoBox"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:hint="@string/create_contact_account_data_name"
    app:hintTextAppearance="@style/TextSmall.Bold">

    <android.support.design.widget.TextInputEditText
        android:id="@+id/name"
        style="@style/LightInputFieldNoBox"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:drawableEnd="@drawable/ic_book_contacts" />

</android.support.design.widget.TextInputLayout>

И вызвать findViewById к TextInputLayout в действии