我目前正在努力使用这个温度转换器应用程序。这个应用程序的工作原理是,如果我在空白文本中输入一个数字,它将计算到其他温度单位,而无需点击按钮(由文本观察者)
在这里,我需要使用Double value从EditText中提取数字,并使用该值生成一个等式,然后将其插入结果视图。所以在本例中,我使用:
double tempWantCtoF = 1.8 * tempWhat + 32;
double tempWantFtoC = tempWhat - 32 * 0.55;
在EditText中插入的值是多少。
应用程序一直在运行,直到我在文本字段中输入任何数字,应用程序崩溃到主屏幕并出现错误消息,“不幸的是,应用程序名称已停止”。
我假设在文本观察程序方法实现的PostTextChanged下使用双值是一个问题。
如果有人知道什么会导致这个问题,我会非常感激。
这是我的主要活动XML文件:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout 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: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="josephshin.tempconv.MainActivity"
android:textAlignment="center">
<Switch
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/tempSwitch"
android:layout_alignParentTop="true"
android:layout_centerHorizontal="true"
android:checked="false" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textAppearance="?android:attr/textAppearanceLarge"
android:id="@+id/tempIndicator"
android:layout_below="@+id/tempSwitch"
android:layout_centerHorizontal="true"
android:text="@string/c_to_f"
android:layout_marginTop="20dp" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textAppearance="?android:attr/textAppearanceLarge"
android:text="@string/is"
android:id="@+id/isLabel"
android:layout_centerVertical="true"
android:layout_centerHorizontal="true" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textAppearance="?android:attr/textAppearanceLarge"
android:text="@string/enter_your_temperature"
android:id="@+id/tempResult"
android:layout_below="@+id/isLabel"
android:layout_centerHorizontal="true"
android:singleLine="true"
android:layout_marginTop="85dp" />
<EditText
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:inputType="numberDecimal"
android:ems="10"
android:id="@+id/tempEdit"
android:layout_below="@+id/tempIndicator"
android:layout_centerHorizontal="true"
android:layout_marginTop="49dp"
android:hint="@string/enter_your_temperature"
android:textAlignment="center" />
</RelativeLayout>
这是我的主要活动JAVA文件:
package josephshin.tempconv;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.text.Editable;
import android.text.TextWatcher;
import android.widget.CompoundButton;
import android.widget.EditText;
import android.widget.Switch;
import android.widget.TextView;
public class MainActivity extends AppCompatActivity {
boolean CtoF;
double tempWhat;
double tempWantCtoF = 1.8 * tempWhat + 32;
double tempWantFtoC = tempWhat - 32 * 0.55;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
final Switch tempSwitch = (Switch) findViewById(R.id.tempSwitch);
final TextView tempIndicator = (TextView) findViewById(R.id.tempIndicator);
final EditText tempLabel = (EditText) findViewById(R.id.tempEdit);
final TextView result = (TextView) findViewById(R.id.tempResult);
tempSwitch.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton compoundButton, boolean isChecked) {
if (isChecked) {
tempIndicator.setText("°F to °C");
CtoF = false;
}
else {
tempIndicator.setText("°C to °F");
CtoF = true;
}
}
});
tempLabel.addTextChangedListener(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 edi) {
tempWhat = Double.parseDouble(tempLabel.toString());
if (CtoF){
result.setText("" + tempWantCtoF);
}
if (!CtoF){
result.setText("" + tempWantFtoC);
}
}
});
}
}
非常感谢。另外,我是初学者!刚开始研究这个问题,但似乎找不到足够相似的问题。
编辑
FATAL EXCEPTION: main
Process: josephshin.tempconv, PID: 31895
java.lang.NumberFormatException: Invalid double: ""
at java.lang.StringToReal.invalidReal(StringToReal.java:63)
at java.lang.StringToReal.parseDouble(StringToReal.java:267)
at java.lang.Double.parseDouble(Double.java:301)
at josephshin.tempconv.MainActivity$2.afterTextChanged(MainActivity.java:56)
at android.widget.TextView.sendAfterTextChanged(TextView.java:9271)
at android.widget.TextView$ChangeWatcher.afterTextChanged(TextView.java:12015)
at android.text.SpannableStringBuilder.sendAfterTextChanged(SpannableStringBuilder.java:1047)
at android.text.SpannableStringBuilder.replace(SpannableStringBuilder.java:564)
at android.text.SpannableStringBuilder.delete(SpannableStringBuilder.java:225)
at android.text.SpannableStringBuilder.delete(SpannableStringBuilder.java:34)
at android.text.method.BaseKeyListener.backspaceOrForwardDelete(BaseKeyListener.java:106)
at android.text.method.BaseKeyListener.backspace(BaseKeyListener.java:51)
at android.text.method.BaseKeyListener.onKeyDown(BaseKeyListener.java:215)
at android.text.method.NumberKeyListener.onKeyDown(NumberKeyListener.java:138)
at android.widget.TextView.doKeyDown(TextView.java:7187)
at android.widget.TextView.onKeyDown(TextView.java:6994)
at android.view.KeyEvent.dispatch(KeyEvent.java:3249)
at android.view.View.dispatchKeyEvent(View.java:9838)
at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1739)
at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1739)
at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1739)
at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1739)
at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1739)
at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1739)
at com.android.internal.policy.PhoneWindow$DecorView.superDispatchKeyEvent(PhoneWindow.java:2808)
at com.android.internal.policy.PhoneWindow.superDispatchKeyEvent(PhoneWindow.java:1838)
at android.app.Activity.dispatchKeyEvent(Activity.java:2977)
at android.support.v7.app.AppCompatActivity.dispatchKeyEvent(AppCompatActivity.java:543)
at android.support.v7.view.WindowCallbackWrapper.dispatchKeyEvent(WindowCallbackWrapper.java:53)
at android.support.v7.app.AppCompatDelegateImplBase$AppCompatWindowCallbackBase.dispatchKeyEvent(AppCompatDelegateImplBase.java:312)
at com.android.internal.policy.PhoneWindow$DecorView.dispatchKeyEvent(PhoneWindow.java:2682)
at android.view.ViewRootImpl$ViewPostImeInputStage.processKeyEvent(ViewRootImpl.java:5273)
at android.view.ViewRootImpl$ViewPostImeInputStage.onProcess(ViewRootImpl.java:5226)
at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:4673)
at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:4726)
at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:4692)
at android.view.ViewRootImpl$AsyncInputStage.forward(ViewRootImpl.java:4834)
at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:4700)
at android.view.ViewRootImpl$AsyncInputStage.apply(ViewRootImpl.java:4891)
at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:4673)
at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:4726)
at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:4692)
at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:4700)
at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:4673)
at android.view.ViewRootImpl.deliverInputEvent(ViewRootImpl.java:7359)
at android.view.ViewRootImpl.doProcessInputEvents(ViewRootImpl.java:7237)
at android.view.ViewRootImpl.enqueueInputEvent(ViewRootImpl.java:7198)
at android.view.ViewRootImpl$ViewRootHandler.handleMessage(ViewRootImpl.java:4310)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:158)
at android.app.ActivityThread.main(ActivityThread.java:7225)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1230)
a
在将其转换为Double之前检查空字符串。像这样,
if(tempLabel.getText().toString().equals("")){
tempWhat=0;
}else{
tempWhat = Double.parseDouble(tempLabel.getText().toString());
}
你犯了一些错误。
首先,您应该将tempWantTof
和tempWantToc
声明为方法,而不是变量:
private double tempWantCtoF() {
return 1.8 * tempWhat + 32;
}
private double tempWantFtoC() {
return tempWhat - 32 * 0.55;
}
其次,要获取TextView
的文本,不要使用toString
,而是使用getText(). toString()
:
tempWhat = Double.parseDouble(tempLabel.getText().toString());
这也是发生错误的原因。
您可能还想添加一些错误处理代码:
try {
tempWhat = Double.parseDouble(tempLabel.getText().toString());
} catch (NumberFormatException ex) {
return;
}
给出一个汽车列表(
我来自同步编程背景,我很难理解可观察性。 这是我的服务/提供商的摘录(离子2项目) 我将从订阅它。关于这一点,我有几个问题。 > 即使我没有声明,上面的代码是否返回一个可观察/观察者? 响应是JSON。如何检查/处理JSON并执行一些操作,如 那就做吧 我认为应该在提供者类中完成。只是一个典型的提示/例子将是真棒。 当请求到达subscribe方法时,它是否真的发生了? 创建和返回Angular
我有一个字段,上面有一个客户文本观察者。在一段代码中,我需要更改EditText中的值,我使用<code>.setText(“whather”)来执行此操作。 问题是,只要我做了更改,就会调用<code>afterextchanged 我需要 afterTextChanged 方法中的文本,因此不建议删除 。
长话短说,我正面临这个问题:我将一个textwatcher附加到一个edittext上。一旦“1”是上面写的最后一个字符,就应该用字母“a”替换它。但这里有一个问题:我想只要“a”也是edittext上写的最后一个字符(用户按下“a”),除了通过前面的方法,还有一些事情要做。但是当我测试它并输入“1”时,它通常会被转换为“a ”,我提到的事情也完成了。我似乎无法找到一种方法来超越这一点,可以给一些
我有一个程序,其中有一个editText。我想实现TextWatcher以反映总editText中的更改。当编辑框达到最大字符数限制10时,我想显示警告对话框。当我实现文本观察程序时,它可以工作,但当它达到10个字符时,它显示两个警告框。这是我的密码
问题内容: 我有以下UseCase: A创建一个聊天并邀请B和C-在服务器A上创建一个文件。A,B和C将消息写入此文件。A,B和C读取了此文件。 我想在服务器上创建一个文件并观察该文件,如果其他人向该文件中写入内容,则将新内容与websockets发送回去。 因此,我的node.js应用程序应观察到此文件的任何更改。 如何观察文件更改? 在不锁定文件的情况下使用节点js可以实现吗? 如果无法使用文