gpt4 book ai didi

android - FindViewById 在自定义相对布局上返回 null

转载 作者:太空宇宙 更新时间:2023-11-03 12:50:48 24 4
gpt4 key购买 nike

在 init 方法中,findViewById 在 R.id.disable_view_content 上返回 null。

public class DisableView extends RelativeLayout {

private View content;
private View disableView;
private int disableBackgroundColor;
private boolean isEnabled;

public DisableView(Context context) {
super(context);
init();
}

public DisableView(Context context, AttributeSet attrs) {
super(context, attrs);
obtainAttributes(context, attrs);
init();
}

public DisableView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
obtainAttributes(context, attrs);
init();
}

@TargetApi(Build.VERSION_CODES.LOLLIPOP)
public DisableView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
super(context, attrs, defStyleAttr, defStyleRes);
obtainAttributes(context, attrs);
init();
}

private void obtainAttributes(Context context, AttributeSet attributeSet) {
TypedArray typedArray = context.getTheme().obtainStyledAttributes(attributeSet, R.styleable.DisableView, 0, 0);
disableBackgroundColor = typedArray.getColor(R.styleable.DisableView_disableBackground, 0x00000000);
isEnabled = typedArray.getBoolean(R.styleable.DisableView_enabled, false);
typedArray.recycle();
}

private void init() {
content = findViewById(R.id.disable_view_content);
disableView = new View(getContext());
RelativeLayout.LayoutParams lp = new LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);
lp.addRule(RelativeLayout.ALIGN_TOP, R.id.disable_view_content);
lp.addRule(RelativeLayout.ALIGN_BOTTOM, R.id.disable_view_content);
lp.addRule(RelativeLayout.ALIGN_LEFT, R.id.disable_view_content);
lp.addRule(RelativeLayout.ALIGN_TOP, R.id.disable_view_content);
disableView.setBackgroundResource(disableBackgroundColor);
disableView.setLayoutParams(lp);
setEnabled(isEnabled);
}

public void setEnabled(boolean enabled) {
content.setEnabled(enabled);
if(enabled) disableView.setVisibility(View.GONE);
else disableView.setVisibility(View.VISIBLE);
}
}

这是xml

<com....view.common.DisableView
android:id="@+id/..._disableView_...Disable"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<LinearLayout
android:id="@id/disable_view_content"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<TextView
android:id="@+id/..._textView_..."
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@drawable/shape_rect_green"
android:gravity="center"
android:paddingTop="18dp"
android:paddingBottom="18dp"
android:layout_marginBottom="12dp"
android:textSize="@dimen/size_text"
android:text="@string/..."
android:textColor="@android:color/white"
android:duplicateParentState="true"/>
</LinearLayout>
</com....view.common.DisableView>

id disable_view_content 在 attr.xml 中

<resources>
<item type="id" name="disable_view_content"/>
</resources>

一切似乎都很好,id 为 disable_view_content 的 View 是 DisableView 的直接 subview 。但是无论是在编辑模式下还是在应用程序上,我都会得到一个空指针,因为引用内容是空的。

编辑:这是堆栈跟踪:

 Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.view.View.setEnabled(boolean)' on a null object reference
at com....view.common.DisableView.setEnabled(DisableView.java:71)
at com....view.common.DisableView.init(DisableView.java:67)
at com....view.common.DisableView.<init>(DisableView.java:35)

最佳答案

您在 View 的生命周期中过早地调用了 findViewById()

您的 init() 是直接从您的构造函数调用的,甚至在您为自己的 View 创建布局之前。此时,您的 View 没有布局,也没有 subview 。

最早您可以访问 subview 是在 addView() 之一之后方法已被调用。

关于android - FindViewById 在自定义相对布局上返回 null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31883242/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com