android - 添加 OnClickListener 时出现异常

标签 android onclicklistener

嘿伙计们,我不知道我在这里做错了什么,但是当我向按钮添加 onClickListener 时,我的 Activity 崩溃了。如果我移除监听器或在另一项 Activity 中尝试他,一切正常......

01-28 18:29:56.906: E/AndroidRuntime(1693): FATAL EXCEPTION: main
01-28 18:29:56.906: E/AndroidRuntime(1693): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.doublexxsoftware.dreamtimer/com.doublexxsoftware.dreamtimer.Addnewdream}: java.lang.NullPointerException
01-28 18:29:56.906: E/AndroidRuntime(1693):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2059)
01-28 18:29:56.906: E/AndroidRuntime(1693):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2084)
01-28 18:29:56.906: E/AndroidRuntime(1693):     at android.app.ActivityThread.access$600(ActivityThread.java:130)
01-28 18:29:56.906: E/AndroidRuntime(1693):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1195)
01-28 18:29:56.906: E/AndroidRuntime(1693):     at android.os.Handler.dispatchMessage(Handler.java:99)
01-28 18:29:56.906: E/AndroidRuntime(1693):     at android.os.Looper.loop(Looper.java:137)
01-28 18:29:56.906: E/AndroidRuntime(1693):     at android.app.ActivityThread.main(ActivityThread.java:4745)
01-28 18:29:56.906: E/AndroidRuntime(1693):     at java.lang.reflect.Method.invokeNative(Native Method)
01-28 18:29:56.906: E/AndroidRuntime(1693):     at java.lang.reflect.Method.invoke(Method.java:511)
01-28 18:29:56.906: E/AndroidRuntime(1693):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786)
01-28 18:29:56.906: E/AndroidRuntime(1693):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
01-28 18:29:56.906: E/AndroidRuntime(1693):     at dalvik.system.NativeStart.main(Native Method)
01-28 18:29:56.906: E/AndroidRuntime(1693): Caused by: java.lang.NullPointerException
01-28 18:29:56.906: E/AndroidRuntime(1693):     at com.doublexxsoftware.dreamtimer.Addnewdream.onCreate(Addnewdream.java:44)
01-28 18:29:56.906: E/AndroidRuntime(1693):     at android.app.Activity.performCreate(Activity.java:5008)
01-28 18:29:56.906: E/AndroidRuntime(1693):     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1079)
01-28 18:29:56.906: E/AndroidRuntime(1693):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2023)

和 Activity 类:

import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import android.os.Bundle;
import android.os.Environment;
import android.widget.Button;
import android.widget.EditText;
import android.app.Activity;

public class Addnewdream extends Activity {
    private Button btnSpeichern;
    private EditText startDatum;
    private EditText endDatum;
    private EditText beschreibung;
    private EditText dreamName;
    private File dir;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        startDatum = (EditText) findViewById(R.id.startDatum);
        endDatum = (EditText) findViewById(R.id.endDatum);
        beschreibung = (EditText) findViewById(R.id.beschreibung);
        dreamName = (EditText) findViewById(R.id.dreamname);
        btnSpeichern = (Button) findViewById(R.id.btnSpeichern);

        setContentView(R.layout.activity_addnewdream);

        String state = Environment.getExternalStorageState();
        if (!state.equals(Environment.MEDIA_MOUNTED)) { //Falls keine externe SD Karte vorhanden ist
            dir = new File(getFilesDir().getAbsolutePath() + File.separator + "DreamTimer");  //Neuen Ordner für Daten auf internen Speicher erstellen
            dir.mkdir();
        } else {
            dir = new File(Environment.getExternalStorageDirectory().getAbsolutePath() + File.separator + "DreamTimer");  //Sonst auf der externen SD Karte
            dir.mkdir();
        }

btnSpeichern.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub

            }
        });




    }

    private void dreamspeichern(String startDat, String endDat, String besch, String name) {
        File file = new File(dir.getAbsolutePath(), name + ".txt");
        BufferedWriter writer = null;
        try {
            writer = new BufferedWriter(new FileWriter(file));
            writer.write(name);
            writer.newLine();
            writer.write(startDat);
            writer.newLine();
            writer.write(endDat);
            writer.newLine();
            writer.write(besch);
            writer.close();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } finally {
            try {
                if(writer != null)
                    writer.close();
                    writer = null;
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }

    }
}

最佳答案

在检索您的 UI 元素之前移动 setContentView,因为您需要先展开您的布局,否则 findViewById 返回 null,因此 NPE 在行 btnSpeichern.setOnClickListener

    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_addnewdream);

    startDatum = (EditText) findViewById(R.id.startDatum);
    endDatum = (EditText) findViewById(R.id.endDatum);
    beschreibung = (EditText) findViewById(R.id.beschreibung);
    dreamName = (EditText) findViewById(R.id.dreamname);
    btnSpeichern = (Button) findViewById(R.id.btnSpeichern);

关于android - 添加 OnClickListener 时出现异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21414170/

相关文章:

android - 将字符串数据转换为双列表

Android:DialogFragment 和通用 xml

android - 如果有意向后导航,则始终调用 onCreate

javascript - 切换多个 Div 并在点击时停用

java - RecyclerView (ImageView) 中的 OnClickListener

android - 使用 switch case 通过 ListView 从 fragment 打开 Activity 时出错

android - 自定义listitem点击不触发listview.onclicklistener

Android 如何对同一个按钮同时使用 OnClick 和长按(3 秒)

android - Unity原生OpenGL贴图显示四次

android - 强制USB音频输出