我首先要说的是我几乎没有机器人经验,这是我在android中的第一个项目,而我的老师并不是很教,所以我为任何过度的无知而道歉。
在我进一步说明之前解释一下:我的应用程序的目标本质上是能够将您花费多少小时花在某些活动上,记录时间,然后在图表中显示它们。我目前正在开发的是创建文本字段,允许用户输入他们在每个活动中花费了多少小时,然后将它们添加到总花费的小时数中,我希望这可以在不使用一个按钮,让我查找textWatcher教程。
TOP 1 WITH TIES
这是我目前为此特定活动所拥有的代码。在我实现任何这个之前,我可以进入屏幕并在布局上输入数据,但是,一旦我开始尝试输入代码,我就只有问题。这段代码最终允许我构建gradle,但现在每当我尝试进入活动时它都会崩溃整个应用程序。
任何帮助都表示赞赏,并且主题提示也会有所帮助!
编辑:进行了更改(原始帖子中的更新代码匹配,因此也应该更改)并且仍然发生崩溃,所以我找到了logcat并将在此段后立即发布:
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())));
}
}
};
答案 0 :(得分:0)
首先,当发生崩溃时,logcat中存在异常堆栈跟踪,它在调试问题时非常有用。你应该学会使用它。请参阅:Unfortunately MyApp has stopped. How can I solve this?
其次,你的活动还没有做任何事情。一个崩溃的原因是,您在活动生命周期中过早地调用findViewById()
,在活动有窗口之前,以及在设置要查找的视图的布局之前。在findViewById()
之后将onCreate()
来电移至setContentView()
。
答案 1 :(得分:0)
首先,请确保您始终添加打印在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() ....
}
我希望你喜欢你正在做的事情;)