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

Posted

技术标签:

【中文标题】在自定义视图中获取 LinearLayout 参考【英文标题】:Get LinearLayout reference at custom view 【发布时间】:2021-10-21 14:36:54 【问题描述】:

我的问题是关于 android/Java。

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

我的 main.xml:

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

    <org.javaforum.input
        android:layout_
        android:layout_
        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_
        android:layout_
        inputType="submit"/>

</LinearLayout>

所以当点击第二个“输入”视图时,我想检查第一个“输入”视图中是否存在名为“必需”的属性。

我在 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 引用?

【问题讨论】:

【参考方案1】:

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

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

【讨论】:

提供方法和提供变量来获取“需要”的值是一样的吗? @Button 由于“必需”值是您定义的,因此是自定义属性,您需要做一些工作来定义和从 XML 检索它的值。见Define Custom Attributes。 我从 AttributeSet 对象中提取了“必需”属性。但我有一个问题。也许我需要就这个问题提出另一个问题......【参考方案2】:

你可以使用

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

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

【讨论】:

哈哈,难以置信,一点点内联修改可以改变整个应用程序... 但我应该建议你看看@Cheticamp 解决方案,它只找到父视图而不是找到根视图并再次找到父视图。如果您想找到另一个 id 而不是父视图,我的解决方案会更好。【参考方案3】:

这应该在 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
            
        
    );

【讨论】:

以上是关于在自定义视图中获取 LinearLayout 参考的主要内容,如果未能解决你的问题,请参考以下文章

在自定义视图中获取android attr

存储选定的 ID,获取以显示在自定义路由视图中

在自定义视图中处理 UITapGestureRecognizer

如何在自定义单元格的 initWithStyle: 方法中获取 UITableView 的宽高?

使用 Swift 在 Xcode 6 中使用 xib 在自定义 uiview 中获取 SIGABRT

我在自定义表格视图中有 FB 朋友的图像和名称。如何获取 FB ID 中的选定行并将请求发送给多个朋友?