Set on Click Listener for custom view崩溃应用程序
问题描述:
我正在尝试创建一个自定义容器,该容器从包含几个按钮,编辑文本等的线性布局延伸,可以通过编程方式添加到我的应用程序中。到目前为止,我可以加我的自定义布局以编程方式使用LayoutInflater,但是当我试图在上点击监听器设置为包含在布局内的按钮,我的应用程序崩溃,在启动时Set on Click Listener for custom view崩溃应用程序
这里每次都是我的简化代码:
exercise_entry_layout.xml,这是该视图的布局:
<com.mdmil.app.ExerciseEntry xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="60dp"
android:orientation="horizontal">
<TextView
android:id="@+id/textView"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:gravity="center"
android:text="TextView" />
<Button
android:id="@+id/button"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="Button" />
</com.mdmil.app.ExerciseEntry>
ExerciseEntry.java,java类
public class ExerciseEntry extends LinearLayout
{
public ExerciseEntry(Context context) {
this(context, null, 0);
}
public ExerciseEntry(Context context, @Nullable AttributeSet attrs) {
this(context, attrs, 0);
}
public ExerciseEntry(final Context context, @Nullable AttributeSet attrs, int defStyleAttr)
{
super(context, attrs, defStyleAttr);
Button button = findViewById(R.id.button);
button.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View view) {
// stuff
}
});
}
}
这就是我如何MainActivity.java视图添加到应用程序:
View entry = LayoutInflater.from(this).inflate(R.layout.exercise_entry_layout, mConstraintLayout, false);
mConstraintLayout.addView(entry);
的logcat的输出是这样的:
08-14 14:29:14.422 20918-20918/? I/zygote: Not late-enabling -Xcheck:jni (already on)
08-14 14:29:14.451 20918-20918/? W/zygote: Unexpected CPU variant for X86 using defaults: x86
08-14 14:29:14.755 20918-20918/com.mdmil.app I/InstantRun: starting instant run server: is main process
08-14 14:29:15.028 20918-20918/com.mdmil.app D/AndroidRuntime: Shutting down VM
08-14 14:29:15.035 20918-20918/com.mdmil.app E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.mdmil.app, PID: 20918
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.mdmil.app/com.mdmil.app.MainActivity}: android.view.InflateException: Binary XML file line #2: Binary XML file line #2: Error inflating class com.mdmil.app.ExerciseEntry
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2817)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2892)
at android.app.ActivityThread.-wrap11(Unknown Source:0)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1593)
at android.os.Handler.dispatchMessage(Handler.java:105)
at android.os.Looper.loop(Looper.java:164)
at android.app.ActivityThread.main(ActivityThread.java:6540)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:767)
Caused by: android.view.InflateException: Binary XML file line #2: Binary XML file line #2: Error inflating class com.mdmil.app.ExerciseEntry
Caused by: android.view.InflateException: Binary XML file line #2: Error inflating class com.mdmil.app.ExerciseEntry
Caused by: java.lang.reflect.InvocationTargetException
at java.lang.reflect.Constructor.newInstance0(Native Method)
at java.lang.reflect.Constructor.newInstance(Constructor.java:334)
at android.view.LayoutInflater.createView(LayoutInflater.java:650)
at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:793)
at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:733)
at android.view.LayoutInflater.inflate(LayoutInflater.java:495)
at android.view.LayoutInflater.inflate(LayoutInflater.java:426)
at com.mdmil.app.MainActivity.onCreate(MainActivity.java:29)
at android.app.Activity.performCreate(Activity.java:6980)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1213)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2770)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2892)
at android.app.ActivityThread.-wrap11(Unknown Source:0)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1593)
at android.os.Handler.dispatchMessage(Handler.java:105)
at android.os.Looper.loop(Looper.java:164)
at android.app.ActivityThread.main(ActivityThread.java:6540)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:767)
Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.Button.setOnClickListener(android.view.View$OnClickListener)' on a null object reference
at com.mdmil.app.ExerciseEntry.<init>(ExerciseEntry.java:56)
at com.mdmil.app.ExerciseEntry.<init>(ExerciseEntry.java:0)
at java.lang.reflect.Constructor.newInstance0(Native Method)
at java.lang.reflect.Constructor.newInstance(Constructor.java:334)
at android.view.LayoutInflater.createView(LayoutInflater.java:650)
at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:793)
at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:733)
at android.view.LayoutInflater.inflate(LayoutInflater.java:495)
at android.view.LayoutInflater.inflate(LayoutInflater.java:426)
at com.mdmil.app.MainActivity.onCreate(MainActivity.java:29)
at android.app.Activity.performCreate(Activity.java:6980)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1213)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2770)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2892)
at android.app.ActivityThread.-wrap11(Unknown Source:0)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1593)
at android.os.Handler.dispatchMessage(Handler.java:105)
at android.os.Looper.loop(Looper.java:164)
at android.app.ActivityThread.main(ActivityThread.java:6540)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:767)
08-14 14:29:15.061 20918-20925/com.mdmil.app W/zygote: Suspending all threads took: 17.310ms
我是适度的新到Android,等我实施任何反馈是受欢迎的。 谢谢!
答
硬而不日志肯定地说,但最有可能你调用ExerciseEntry正在试图建立一个侦听器尚未
创建的按钮的构造确保您在安装监听
之前充气布局
发布完整的logcat输出,以便我们可以看到错误以及发生了什么行。 “_my app crashes_”没有任何用处。 – csmckelvey
logcat输出张贴在我的编辑:) – mdmiller002
'对null对象引用'引发:java.lang.NullPointerException:试图调用虚拟方法'void android.widget.Button.setOnClickListener(android.view.View $ OnClickListener)' '看起来'findViewById(R.id.button);'返回null。 – csmckelvey