[英]Android app force closes - setOnClickListener [simple app] [beginner]
Program functions as normal on start up. 程序在启动时正常运行。 As soon as button is clicked, app force closes and the log cat (at bottom) is shown.
单击按钮后,应用程序强制关闭,并显示日志猫(在底部)。
XML File - layout is fully functional XML文件-布局功能齐全
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="com.example.figurehowtodo.MainActivity$PlaceholderFragment" >
<TextView
android:id="@+id/produceText1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/hello_world" />
<Button
android:id="@+id/myactualbutton"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="ClickMe" />
</LinearLayout>
MainActivity.java MainActivity.java
package com.example.figurehowtodo;
import android.app.Activity;
import android.os.Bundle;
import android.widget.Button;
import android.widget.TextView;
public class MainActivity extends Activity {
Button mybutton;
TextView tvView;
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.fragment_main);
mybutton = (Button) findViewById(R.id.myactualbutton);
tvView = (TextView) findViewById(R.id.produceText1);
mybutton.setOnClickListener(new MyOwnOnClickListener());
}
}
MyOwnOnClickListener.java MyOwnOnClickListener.java
package com.example.figurehowtodo;
import android.app.Activity;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.TextView;
public class MyOwnOnClickListener extends Activity implements OnClickListener{
//int id;
TextView id2;
//TextView id3;
/* MainActivity caller;
public MyOwnOnClickListener() {
addiTion();
IGNORE THIS BIT
} */
public void onClick(View v) {
addiTion(v);
}
public void addiTion(View v){
//id = hello.getId();
id2 = (TextView) findViewById(R.id.produceText1);
id2.setText("fgdsgdfhgdfh");
}
}
Logcat: Logcat:
03-27 20:56:31.710: E/AndroidRuntime(2132): FATAL EXCEPTION: main
03-27 20:56:31.710: E/AndroidRuntime(2132): java.lang.NullPointerException
03-27 20:56:31.710: E/AndroidRuntime(2132): at android.app.Activity.findViewById(Activity.java:1647)
03-27 20:56:31.710: E/AndroidRuntime(2132): at com.example.figurehowtodo.MyOwnOnClickListener.addiTion(MyOwnOnClickListener.java:29)
03-27 20:56:31.710: E/AndroidRuntime(2132): at com.example.figurehowtodo.MyOwnOnClickListener.onClick(MyOwnOnClickListener.java:22)
03-27 20:56:31.710: E/AndroidRuntime(2132): at android.view.View.performClick(View.java:2485)
03-27 20:56:31.710: E/AndroidRuntime(2132): at android.view.View$PerformClick.run(View.java:9080)
03-27 20:56:31.710: E/AndroidRuntime(2132): at android.os.Handler.handleCallback(Handler.java:587)
03-27 20:56:31.710: E/AndroidRuntime(2132): at android.os.Handler.dispatchMessage(Handler.java:92)
03-27 20:56:31.710: E/AndroidRuntime(2132): at android.os.Looper.loop(Looper.java:123)
03-27 20:56:31.710: E/AndroidRuntime(2132): at android.app.ActivityThread.main(ActivityThread.java:3683)
03-27 20:56:31.710: E/AndroidRuntime(2132): at java.lang.reflect.Method.invokeNative(Native Method)
03-27 20:56:31.710: E/AndroidRuntime(2132): at java.lang.reflect.Method.invoke(Method.java:507)
03-27 20:56:31.710: E/AndroidRuntime(2132): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
03-27 20:56:31.710: E/AndroidRuntime(2132): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
03-27 20:56:31.710: E/AndroidRuntime(2132): at dalvik.system.NativeStart.main(Native Method)
03-27 20:56:31.720: W/ActivityManager(61): Force finishing activity com.example.figurehowtodo/.MainActivity
03-27 20:56:32.230: W/ActivityManager(61): Activity pause timeout for HistoryRecord{40698748 com.example.figurehowtodo/.MainActivity}
03-27 20:56:38.440: D/dalvikvm(299): GC_EXPLICIT freed 6K, 54% free 2544K/5511K, external 1625K/2137K, paused 55ms
03-27 20:56:43.380: W/ActivityManager(61): Activity destroy timeout for HistoryRecord{40698748 com.example.figurehowtodo/.MainActivity}
03-27 20:56:43.480: D/dalvikvm(311): GC_EXPLICIT freed 2K, 54% free 2537K/5511K, external 1625K/2137K, paused 78ms
03-27 20:56:48.460: D/dalvikvm(220): GC_EXPLICIT freed 184K, 54% free 2764K/5959K, external 2202K/2671K, paused 56ms
You have not set you content view for your activity class MyOwnOnClickListener
. 您尚未为活动类
MyOwnOnClickListener
设置内容视图。 So method findViewById()
cannot find the view you are passing as argument. 因此,方法
findViewById()
无法找到您作为参数传递的视图。
I think the MyOwnOnClickListener
class shouldn't be an Activity
class, but just a listener. 我认为
MyOwnOnClickListener
类不应该是Activity
类,而应该是一个侦听器。 You can pass a reference to the TextView
to the listener to use it. 您可以将对
TextView
的引用传递给侦听器以使用它。
Or you can implement the listener in your MainActivity
class and suppress the MyOwnOnClickListener
class. 或者,您可以在
MainActivity
类中实现侦听器,并取消MyOwnOnClickListener
类。
public class MainActivity extends Activity implements OnClickListener {
Button mybutton;
TextView tvView;
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.fragment_main);
mybutton = (Button) findViewById(R.id.myactualbutton);
tvView = (TextView) findViewById(R.id.produceText1);
mybutton.setOnClickListener(this);
}
public void onClick(View v) {
addiTion(v);
}
public void addiTion(View v){
tvView.setText("fgdsgdfhgdfh");
}
}
EDIT: If you want to use a listener class, just keep your MainActivity
as it is, change only the call to the MyOwnOnClickListener
to pass the tvView
reference, and change the MyOwnOnClickListener
class like this: 编辑:如果要使用侦听器类,只需保持
MainActivity
不变,仅更改对MyOwnOnClickListener
的调用以传递tvView
引用,并按如下方式更改MyOwnOnClickListener
类:
public class MyOwnOnClickListener implements OnClickListener{
TextView id2;
// MainActivity caller;
public MyOwnOnClickListener(TextView id2) {
this.id2 = id2;
}
public void onClick(View v) {
switch(v.getId()) {
case R.id.produceText1:
id2.setText("fgdsgdfhgdfh");
break;
// Other cases here...
default:
// Whatever you want to manage the situation...
}
}
}
It should work... 应该可以...
replace your 更换你的
mybutton.setOnClickListener(new MyOwnOnClickListener());
by 通过
mybutton.setOnClickListener(new OnClickListener(){
public void onClick(View v) {
tvView.setText("fgdsgdfhgdfh");
}
});
which is called anonymous class in Java. 在Java中称为匿名类 。
Setting listener this way, you declare anonymous class that implements interface OnClickListener
, implement its abstract method onClick
, create an object of this anonymous class and pass this object onto button's setOnClickListener
method to make your button proceed clicks on it in a way you want. 以这种方式设置侦听器,可以声明实现接口
OnClickListener
匿名类 ,实现其抽象方法 onClick
, 创建该匿名类的对象并将该对象传递到按钮的setOnClickListener
方法上,以使按钮以所需的方式对其进行单击。
Alternative Solution with onClick attribute: 具有onClick属性的替代解决方案:
Add this attribute to your Button in the xml: 将此属性添加到xml中的Button中:
android:onClick="buttonClicked"
and add this method to the MainActivity: 并将此方法添加到MainActivity中:
public void buttonClicked(View view) {
tvView.setText("fgdsgdfhgdfh");
}
then also delete this line: 然后还删除此行:
mybutton.setOnClickListener(new MyOwnOnClickListener());
then get rid of the whole MyOwnOnClickListener
Activity at all 然后完全摆脱整个
MyOwnOnClickListener
Activity
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.