我的申请是输入金额,计算金额并显示金额。
我正在使用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" />
我在log 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.
答案 0 :(得分: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
}
答案 1 :(得分:1)
除了您发布的代码之外还有更多代码吗?
以下是我注意到的几件事:
当您按下按钮时,您的代码将不会执行任何操作,因为您没有按照上面的指示在onClick(View v)方法中执行任何操作。你有一个onClickView(View v)函数,没有人调用。你应该将你的代码从onClickView()移动到onClick(),然后摆脱onClickView()方法(或者你可以从onClick函数调用onClickView)。
如果您按照上面的说明移动代码,您的代码将会正常工作,我甚至会自己进行测试,以便仔细检查。 (您在上面的复制粘贴代码中缺少&lt; / LinearLayout&gt;标记,但我认为您已经拥有它。)
您发布的错误日志显示SpannableStringBuilder发生错误。但是你在代码中的任何地方都没有使用SpannableStringBuilder,所以a)你有其他代码或者b)这个错误与你的代码无关。
按下按钮会发生什么?应用程序崩溃了吗?当您看到问题时,您使用什么值进行测试?日志中是否有其他日志包含您的标记或应用程序名称?您发布的日志未显示任何强制关闭日志或与您的应用程序相关的任何错误。
第二个想法,你是说你的问题是当你按下计算按钮时,没有任何反应?所以你假设你有一个错误,只是认为你在日志中看到的错误是你的代码不起作用的原因?如果是这种情况,您只需将onClickView()中的代码块移动到onClick()并删除onClickView()即可。错误日志来自与您的代码无关的其他程序。
答案 2 :(得分:0)
乍一看,这可能是你的问题。
Log.i(标签,“总格饭价格未格式化为[”+ fmp +“]”);
fmp是一个浮点数......你将它添加到字符串中。
注释掉这一行,看看它是否有效。