在自定义视图中获取 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
}
}
});
我的问题是关于 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
}
}
});