当前位置: 首页 > 知识库问答 >
问题:

被困在Android Studio:为文本观察程序使用“双”

向修谨
2023-03-14

我目前正在努力使用这个温度转换器应用程序。这个应用程序的工作原理是,如果我在空白文本中输入一个数字,它将计算到其他温度单位,而无需点击按钮(由文本观察者)

在这里,我需要使用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

共有2个答案

骆照
2023-03-14

在将其转换为Double之前检查空字符串。像这样,

     if(tempLabel.getText().toString().equals("")){
      tempWhat=0; 
     }else{
      tempWhat = Double.parseDouble(tempLabel.getText().toString());
     }
贺华容
2023-03-14

你犯了一些错误。

首先,您应该将tempWantToftempWantToc声明为方法,而不是变量:

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可以实现吗? 如果无法使用文