Получить родительский 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 в действии