在自定义视图中获取 LinearLayout 参考

Get LinearLayout reference at custom view

我的问题是关于 Android/Java。

我想从我的自定义视图访问其他视图。

我的main.xml:

<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:id="@+id/mainLinearLayout1">

    <org.javaforum.input
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:inputType="textEmailAddress"
        required=""
        android:hint="Enter your E-Mail"
        oninvalid="this.setCustomValidity('SO - Please enter a correct E-Mail!!!')"/>

    <org.javaforum.input
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        inputType="submit"/>

</LinearLayout>

因此,当单击第二个“输入”视图时,我想检查第一个“输入”视图是否存在名为“required”的属性。

我在 input.java 中试过这个:

public class input extends TextView{
    public input(Context context, AttributeSet attr) {
        super(context, attr, getIdentifier(context,attr));
    }

    @Override
    public void onFinishInflate() {
        setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                LinearLayout layout = (LinearLayout)findViewById(R.id.mainLinearLayout1);
                View v = null;
                for(int i=0; i<layout.getChildCount(); i++) {//Error
                    //Code
                }
            }
        });
    }
}

但是我收到以下错误:

java.lang.NullPointerException: Attempt to invoke virtual method 'int android.widget.LinearLayout.getChildCount()' on a null object reference

我不明白为什么它是空的。应该已经创建了吧?

那么如何在我的自定义视图中正确获取 main.xml 的 LinearLayout 引用?

要解决空指针异常,您需要在父 LinearLayout 中搜索其他小部件。您可以使用 View.getParent() 来识别父级。由于您要查找的视图是当前视图的兄弟视图,因此您会在父视图中找到它。

至于确定是否设置了某个属性,我建议通过其视图捕获该值,并提供一种方法来根据请求显示该值。假设该值是您的“必需”值,然后在本地捕获该值并提供一种方法,例如 getRequiredValue() 来公开它。

您可以使用

 LinearLayout layout = (LinearLayout) getRootView().findViewById(R.id.mainLinearLayout1);

如果您只在自定义视图中调用 findViewById,它只会查找子视图。

这应该在 Activity 的 onCreate 而不是 TextView 的 onFinishInflate 中调用。

首先给提交按钮一个id,例如btn_submit,然后在onCreate

    Button btn_submit = (Button)findViewById(R.id.btn_submit);
    btn_submit.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            LinearLayout layout = (LinearLayout)findViewById(R.id.mainLinearLayout1);
            View v = null;
            for(int i=0; i<layout.getChildCount(); i++) {
                //Code
            }
        }
    });