簡體   English   中英

Android應用程式強制關閉-setOnClickListener [簡單應用程式] [入門]

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM