繁体   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