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,等我实施任何反馈是受欢迎的。 谢谢!

+0

发布完整的logcat输出,以便我们可以看到错误以及发生了什么行。 “_my app crashes_”没有任何用处。 – csmckelvey

+0

logcat输出张贴在我的编辑:) – mdmiller002

+0

'对null对象引用'引发:java.lang.NullPointerException:试图调用虚拟方法'void android.widget.Button.setOnClickListener(android.view.View $ OnClickListener)' '看起来'findViewById(R.id.button);'返回null。 – csmckelvey

硬而不日志肯定地说,但最有可能你调用ExerciseEntry正在试图建立一个侦听器尚未

创建的按钮的构造确保您在安装监听

之前充气布局