在安卓中访问任何视图的父视图

3

我的xml代码中有一个TextInputLayout内部包含一个TextInputEditText

<android.support.design.widget.TextInputLayout
        android:id="@+id/textfieldContainer2"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        app:errorEnabled="true"
        app:errorTextAppearance="@style/customErrorTextColor"
        app:hintTextAppearance="@style/customHintTextAppearance"
        app:layout_constraintTop_toBottomOf="@id/textfieldContainer">

        <android.support.design.widget.TextInputEditText
            android:id="@+id/bottomtextfield"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:hint="add bottom text"
            android:layout_marginLeft="10dp"
            android:layout_marginRight="10dp" />

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

问题

我正在尝试通过下面的方式,通过 TextInputEditText 获取 TextInputLayout

TextInputLayout parentInputLayout = (TextInputLayout) textfield.getParent();

但是这行代码会抛出 java.lang.IllegalStateException 异常。

问题

我在这里做错了什么,如何通过 TextInputEditText 的引用获取任何 TextInputEditText 的父 TextInputLayout

堆栈跟踪

E/AndroidRuntime: FATAL EXCEPTION: main
                  Process: com.example.yousafkhan.memegeneratorapp, PID: 10425
                  java.lang.IllegalStateException: Could not execute method for android:onClick
                      at android.support.v7.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:390)
                      at android.view.View.performClick(View.java:6597)
                      at android.view.View.performClickInternal(View.java:6574)
                      at android.view.View.access$3100(View.java:778)
                      at android.view.View$PerformClick.run(View.java:25885)
                      at android.os.Handler.handleCallback(Handler.java:873)
                      at android.os.Handler.dispatchMessage(Handler.java:99)
                      at android.os.Looper.loop(Looper.java:193)
                      at android.app.ActivityThread.main(ActivityThread.java:6669)
                      at java.lang.reflect.Method.invoke(Native Method)
                      at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
                      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)
                   Caused by: java.lang.reflect.InvocationTargetException
                      at java.lang.reflect.Method.invoke(Native Method)
                      at android.support.v7.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:385)
                      at android.view.View.performClick(View.java:6597) 
                      at android.view.View.performClickInternal(View.java:6574) 
                      at android.view.View.access$3100(View.java:778) 
                      at android.view.View$PerformClick.run(View.java:25885) 
                      at android.os.Handler.handleCallback(Handler.java:873) 
                      at android.os.Handler.dispatchMessage(Handler.java:99) 
                      at android.os.Looper.loop(Looper.java:193) 
                      at android.app.ActivityThread.main(ActivityThread.java:6669) 
                      at java.lang.reflect.Method.invoke(Native Method) 
                      at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493) 
                      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858) 
                   Caused by: java.lang.ClassCastException: android.widget.FrameLayout cannot be cast to android.support.design.widget.TextInputLayout
                      at com.example.yousafkhan.memegeneratorapp.MainActivity.textFieldEmpty(MainActivity.java:64)
                      at com.example.yousafkhan.memegeneratorapp.MainActivity.createMeme(MainActivity.java:53)

完整的Java堆栈跟踪是什么? - pskink
@pskink发布了。 - user7500403
Caused by: java.lang.ClassCastException: android.widget.FrameLayout cannot be cast to android.support.design.widget.TextInputLayout - pskink
2个回答

5

获取包含TextInputEditTextTextInputLayout的引用,可以按照以下方式进行:

TextInputEditText textfield = findViewById(R.id.bottomtextfield);
ViewGroup containingLayout = (ViewGroup) textfield.getParent();
TextInputLayout textInputLayout = (TextInputLayout) containingLayout.getParent();

这是因为 TextInputLayout 上有一个包含关联的 TextInputEditTextFrameLayout

1
XML 中的视图层次结构可能与 Android 返回的视图层次结构不同。因此 getParent() 可能无法返回您期望的视图。
因此,您应该优先使用:
TextInputLayout parentInputLayout = findViewById(R.id.textfieldContainer2);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接