[英]Android app force closes - setOnClickListener [simple app] [beginner]
程序在啟動時正常運行。 單擊按鈕后,應用程序強制關閉,並顯示日志貓(在底部)。
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
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
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:
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
您尚未為活動類MyOwnOnClickListener
設置內容視圖。 因此,方法findViewById()
無法找到您作為參數傳遞的視圖。
我認為MyOwnOnClickListener
類不應該是Activity
類,而應該是一個偵聽器。 您可以將對TextView
的引用傳遞給偵聽器以使用它。
或者,您可以在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");
}
}
編輯:如果要使用偵聽器類,只需保持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...
}
}
}
應該可以...
更換你的
mybutton.setOnClickListener(new MyOwnOnClickListener());
通過
mybutton.setOnClickListener(new OnClickListener(){
public void onClick(View v) {
tvView.setText("fgdsgdfhgdfh");
}
});
在Java中稱為匿名類 。
以這種方式設置偵聽器,可以聲明實現接口 OnClickListener
匿名類 ,實現其抽象方法 onClick
, 創建該匿名類的對象並將該對象傳遞到按鈕的setOnClickListener
方法上,以使按鈕以所需的方式對其進行單擊。
具有onClick屬性的替代解決方案:
將此屬性添加到xml中的Button中:
android:onClick="buttonClicked"
並將此方法添加到MainActivity中:
public void buttonClicked(View view) {
tvView.setText("fgdsgdfhgdfh");
}
然后還刪除此行:
mybutton.setOnClickListener(new MyOwnOnClickListener());
然后完全擺脫整個MyOwnOnClickListener
Activity
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.