2

我的应用程序是输入金额,计算金额并显示金额。

我正在使用 Android SDK 16。当我输入金额并单击计算按钮时,我得到了

SPAN_EXCLUSIVE_EXCLUSIVE 跨度不能有零长度。

我的活动课是

   public class ChapterTwo extends Activity {

public static final String tag = "Chapter 2";

static{
    StrictMode.ThreadPolicy policy = new     
        StrictMode.ThreadPolicy.Builder().permitAll().build();

    StrictMode.setThreadPolicy(policy);
}




@SuppressWarnings("unused")
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_chapter_two);

    final EditText mealpricefield = (EditText) findViewById(R.id.mealprice);
    final TextView answerfield = (TextView) findViewById(R.id.answer);
    final Button button = (Button) findViewById(R.id.calculate);

            button.setOnClickListener(new Button.OnClickListener() {

            public void onClickView(View v) {
            try {
                Log.i(tag, "onClick Invoked");
                // grab the meal price from UI
                String mealprice = mealpricefield.getText().toString();
                Log.i(tag, "meal price is [" + mealprice + "]");
                String answer = "";
                // check to see if meal price contains $
                if (mealprice.indexOf("$") == -1) {
                    mealprice = "$" + mealprice;
                }

                float fmp = 0.0F;
                // get currency formatter;
                NumberFormat nf = java.text.NumberFormat
                        .getCurrencyInstance();
                // grab the input meal price
                fmp = nf.parse(mealprice).floatValue();
                // let's give a nice tip
                fmp *= 1.2;
                Log.i(tag, " Total meal price Unformatted is [" + fmp + "]");
                // format our result
                answer = " Full Price, Including the 20% Tip is "
                        + nf.format(fmp);
                answerfield.setText(answer);
                Log.i(tag, " On Click Complete");

            } catch (java.text.ParseException e) {

                Log.i(tag, "Parse Exception caught");
                answerfield.setText("Failed to Parse the Exception");
            }

            catch (Exception e) {
                Log.e(tag, "Failed To calculate the tip" + e.getMessage());
                e.printStackTrace();
                answerfield.setText(e.getMessage());

            }

        }

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

        }
    });
}}

我的布局是

<LinearLayout 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:orientation="vertical" >

<TextView
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:text="Chapter 2 Android Tip Calculator"
    tools:ignore="HardcodedText" />

<EditText
    android:id="@+id/mealprice"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:ems="10" 
    android:inputType="text">

    <requestFocus />
</EditText>

<Button
    android:id="@+id/calculate"

    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="Calculate Tip" />

<EditText
    android:id="@+id/answer"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:ems="10" />

我在日志 cat 中收到以下错误

10-23 20:19:26.232: E/Trace(699): error opening trace file: No such file or directory (2)
10-23 20:19:27.092: D/gralloc_goldfish(699): Emulator without GPU emulation detected.
10-23 20:19:33.262: W/IInputConnectionWrapper(699): showStatusIcon on inactive InputConnection
10-23 20:24:22.106: I/Choreographer(699): Skipped 30 frames!  The application may be doing too much work on its main thread.
10-23 20:27:52.824: I/Choreographer(699): Skipped 37 frames!  The application may be doing too much work on its main thread.
10-23 20:31:13.323: E/SpannableStringBuilder(699): SPAN_EXCLUSIVE_EXCLUSIVE spans cannot have a zero length
10-23 20:31:13.323: E/SpannableStringBuilder(699): SPAN_EXCLUSIVE_EXCLUSIVE spans cannot have a zero length
10-23 20:31:32.552: I/Choreographer(699): Skipped 35 frames!  The application may be doing too much work on its main thread.
10-23 20:39:44.723: I/Choreographer(699): Skipped 63 frames!  The application may be doing too much work on its main thread.
4

3 回答 3

1

除了您发布的代码之外,还有更多代码吗?

以下是我注意到的几件事:

  1. 当您按下按钮时,您的代码不会做任何事情,因为您没有在上面指出的 onClick(View v) 方法中做任何事情。你有一个没有人调用的 onClickView(View v) 函数。您应该将代码从 onClickView() 移动到 onClick() 并摆脱 onClickView() 方法(或者您可以只从 onClick 函数调用 onClickView)。

  2. 如果您如上所述移动代码,您的代码将起作用,我什至刚才自己测试了它以再次检查。(您在上面的复制粘贴代码中缺少一个 </LinearLayout> 标记,但我假设您拥有它)。

  3. 您发布的错误日志显示 SpannableStringBuilder 的错误。但是您在代码中的任何地方都没有使用 SpannableStringBuilder,所以要么 a)您有其他代码,要么 b)此错误与您的代码无关。

当你按下按钮时会发生什么?应用程序会崩溃吗?当您看到问题时,您使用什么值进行测试?日志中是否有任何其他具有您的标签或应用程序名称的日志?您发布的日志不显示任何强制关闭日志或与您的应用程序相关的任何错误。

再想一想,你是说你的问题是当你按下计算按钮时,什么都没有发生?所以你假设你有一个错误,只是认为你在日志中看到的错误是你的代码不起作用的原因?如果是这种情况,您只需将 onClickView() 中的代码块移动到 onClick() 中并去掉 onClickView()。错误日志来自与您的代码无关的其他程序。

于 2012-10-24T05:21:14.387 回答
1

您应该在主类中声明所有视图并在 onCreate() 方法中对其进行初始化:

public class ChapterTwo extends Activity {

public static final String tag = "Chapter 2";
EditText mealpricefield;
TextView answerfield;
Button button;
.
.
.
}

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_chapter_two);

    mealpricefield = (EditText) findViewById(R.id.mealprice);
    answerfield = (TextView) findViewById(R.id.answer);
    button = (Button) findViewById(R.id.calculate);
.
.
.
}

此外,您放置在 onClickView(View v) 中的代码应该位于代码下方的 onClick(View v) 中:

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

    }
于 2012-10-24T04:25:00.937 回答
0

乍一看,这可能是您的问题。

Log.i(tag, "未格式化的总餐价为 [" + fmp + "]");

fmp 是一个浮点数......您正在将它添加到一个字符串中。

将此行注释掉,看看它是否有效。

于 2012-10-24T04:58:39.823 回答