【问题标题】:Runtime Crash Upon Activity Selection活动选择时运行时崩溃
【发布时间】:2018-02-10 07:14:16
【问题描述】:

首先我想说我几乎没有 Android 经验,这是我在 android 领域的第一个项目,而且我的老师不是很教书,所以对于任何过度的无知,我深表歉意。

在我进一步解释之前:我的应用程序的目标本质上是能够记录您在某些活动上花费了多少小时,记录时间,然后以图表的形式显示它们。我目前正在做的是创建文本字段,允许用户输入他们在每个活动中花费了多少小时,然后将它们添加到花费的总小时数中,我希望在不使用按钮的情况下完成,这导致我查找 textWatcher 教程。

package com.example.gideon.timemanagement;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.text.Editable;
import android.widget.EditText;
import android.text.TextWatcher;
import android.widget.TextView;



public abstract class Customize extends AppCompatActivity implements TextWatcher {


EditText a;
EditText b;
TextView ht;


@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_customize);

    EditText a = (EditText) findViewById(R.id.exerciseHours);
    EditText b = (EditText) findViewById(R.id.sleepHours);
    TextView ht = (TextView) findViewById(R.id.healthTotal);
}

private TextWatcher Ht = new TextWatcher() {

    @Override
    public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {

    }

    @Override
    public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {

    }

    @Override
    public void afterTextChanged(Editable editable) {


        if (!a.getText().toString().equals("") && !b.getText().toString().equals("")) {
            ht.setText(String.valueOf(Integer.valueOf(a.getText().toString()) + Integer.valueOf(b.getText().toString())));

        }
    }
};

这是我目前用于此特定活动的代码。在我实现任何这些之前,我可以进入屏幕并在布局上输入数据,但是,一旦我开始尝试输入代码,我就遇到了问题。这段代码终于允许我构建 gradle,但现在每当我尝试进入活动时,它都会使整个应用程序崩溃。

感谢您提供任何帮助,并且离题的提示也会有所帮助!

编辑:进行了更改(更新了原始帖子中的代码以匹配,因此也应该更改)并且仍然有崩溃,所以我找到了 logcat 并将在本段之后立即发布:

02-10 18:53:40.167 23713-23713/com.example.gideon.timemanagement I/zygote: 
Not late-enabling -Xcheck:jni (already on)
02-10 18:53:40.174 23713-23713/com.example.gideon.timemanagement W/zygote: 
Unexpected CPU variant for X86 using defaults: x86
02-10 18:53:40.393 23713-23713/com.example.gideon.timemanagement 
I/InstantRun: starting instant run server: is main process
02-10 18:53:40.532 23713-23731/com.example.gideon.timemanagement 
D/OpenGLRenderer: HWUI GL Pipeline
02-10 18:53:40.662 23713-23731/com.example.gideon.timemanagement I/zygote: 
android::hardware::configstore::V1_0::ISurfaceFlingerConfigs::hasWideColor 
ay retrieved: 0
02-10 18:53:40.662 23713-23731/com.example.gideon.timemanagement 
I/OpenGLRenderer: Initialized EGL, version 1.4
02-10 18:53:40.662 23713-23731/com.example.gideon.timemanagement 
D/OpenGLRenderer: Swap behavior 1
02-10 18:53:40.662 23713-23731/com.example.gideon.timemanagement 
W/OpenGLRenderer: Failed to choose config with EGL_SWAP_BEHAVIOR_PRESERVED, 
retrying without...
02-10 18:53:40.662 23713-23731/com.example.gideon.timemanagement 
D/OpenGLRenderer: Swap behavior 0
02-10 18:53:40.682 23713-23731/com.example.gideon.timemanagement 
D/EGL_emulation: eglCreateContext: 0xb1eabb60: maj 3 min 0 rcv 3
02-10 18:53:40.726 23713-23731/com.example.gideon.timemanagement 
D/EGL_emulation: eglMakeCurrent: 0xb1eabb60: ver 3 0 (tinfo 0xb1eef120)
02-10 18:53:40.728 23713-23731/com.example.gideon.timemanagement 
E/eglCodecCommon: glUtilsParamSize: unknow param 0x00008cdf
02-10 18:53:40.728 23713-23731/com.example.gideon.timemanagement 
E/eglCodecCommon: glUtilsParamSize: unknow param 0x00008cdf
02-10 18:53:40.728 23713-23731/com.example.gideon.timemanagement 
E/eglCodecCommon: glUtilsParamSize: unknow param 0x00008824
02-10 18:53:40.728 23713-23731/com.example.gideon.timemanagement 
E/eglCodecCommon: glUtilsParamSize: unknow param 0x00008824
02-10 18:53:40.759 23713-23731/com.example.gideon.timemanagement 
D/EGL_emulation: eglMakeCurrent: 0xb1eabb60: ver 3 0 (tinfo 0xb1eef120)

【问题讨论】:

    标签: java android textwatcher


    【解决方案1】:

    首先,当出现crash时,logcat中有一个异常stacktrace,对调试问题很有帮助。你应该学会使用它。见:Unfortunately MyApp has stopped. How can I solve this?

    其次,您的活动还没有真正做任何事情。一个崩溃原因是您在活动生命周期中调用findViewById() 太早,在活动有一个窗口之前并且在您设置要找到的视图的布局之前。在setContentView() 之后将findViewById() 调用移至onCreate()

    【讨论】:

    • 谢谢!了解 LogCat 会很有帮助,而了解 findViewById 也会很有帮助。
    【解决方案2】:

    首先,确保您始终添加打印在 logcat 中的崩溃详细信息,它位于屏幕下方,如下图所示 > 6:LOGCAT

    其次,当您想将视图分配给变量时,您应该确保已构建视图层次结构。分配findViewById(R.id.someID) 寻找一个视图,但是当你在父视图构建之前调用它时,你会得到一个空指针异常。确保始终在 setContentView(R.layout.activity_customize)onCreate() 方法之后调用此方法。

    我想到的第三点是尝试将变量命名为有意义的。 a、b 和 c 不会在十天左右的时间内提醒你他们在做什么。将您的变量命名为描述性的。问问自己他们做了什么,为什么需要他们,你对这些问题的回答将帮助你为他们找到一个合适的名字。我选择了一些例子,因为它不是 a、b、c! 所以,让你的代码如下;

    在课堂上,在onCreate()之前:​​

    EditText exerciseHoursEditText;
    EditText sleepHoursEditText;
    EditText mmHoursEditText;
    EditText oaHoursEditText;
    TextView healthTotalTextView;
    

    onCreate()

    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_customize);
    exerciseHoursEditText = (EditText) findViewById(R.id.exerciseHours);
    sleepHoursEditText = (EditText) findViewById(R.id.sleepHours);
    mmHoursEditText = (EditText) findViewById(R.id.mmHours);
    oaHoursEditText = (EditText) findViewById(R.id.oaHours);
    healthTotalTextView = (TextView) findViewById(R.id.healthTotal);
    

    Android 就是这样工作的,也许你应该阅读一些关于 android 活动生命周期的知识。这很简单。检查这个link

    第四点值得一提的是,在使用可能导致NULL 的方法时必须小心。您在a.getText().toString() 中所做的事情可能会导致在NPE 中,因此请务必检查如下:

       if(a.getText() != null) {
            a.getText().toString() .... 
        }
    

    我希望你喜欢你正在做的事情;)

    【讨论】:

    • 非常感谢~ LogCat 有助于了解,因为我的学校资料中没有任何关于它的内容,这是我第一次听说它。在让代码工作后,我打算重命名变量,在此之前我根本不想输入变量,但谢谢你的提示!我现在不能尝试这个,因为我在工作,但是当我回到家时,我会把它放进去看看它有什么作用!谢谢!
    • 在做出建议的更改后,我用新代码编辑了原始帖子,并包含了日志猫。打开活动时它仍然崩溃。我自己无法理解日志猫,希望您能再次提供帮助吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-28
    相关资源
    最近更新 更多