Когда я выполняю метод onClick, приложение вылетает. Проблема, кажется, в функции setText
Я сузил проблему до данного кода:
В коде нет синтаксических ошибок, которые были обнаружены Джава:
public void calculate(View view){
double subTotal;
double Total;
double tipAmount;
TextView showTotal = findViewById(R.id.textView2);
TextView tip = findViewById(R.id.Tip);
SeekBar percent = findViewById(R.id.seekBar);
int percent1 = percent.getProgress() + 100;
EditText input = findViewById(R.id.editText);
String placeHolder = input.getText().toString();
subTotal = Double.parseDouble(placeHolder);
if ((subTotal >= 0) && (subTotal <= 999999) && (subTotal == (double)subTotal)){
Total = Double.parseDouble(roundTwo.format(subTotal * percent1 * .01));
tipAmount = Double.parseDouble(roundTwo.format(subTotal * (percent1-100) *.01));
String totalString = Double.toString(Total);
tip.setText(getResources().getString(R.string.Tip_Amount, tipAmount));
showTotal.setText(getResources().getString(R.string.Total_Amount,Total));
}
else {
showTotal.setText(getResources().getString(R.string.error));
}
}
Строки XML:
<string name = "Tip_Amount">Tip: %1$d</string>
<string name = "Total_Amount">Total: %1$d</string>
Приложение вылетает из-за данной строки в файле java. Вот данные Logcat: Логкат:
Process: com.example.tipcalculator, PID: 19871
java.lang.IllegalStateException: Could not execute method for android:onClick
at android.support.v7.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:390)
at android.view.View.performClick(View.java:7251)
at android.view.View.performClickInternal(View.java:7228)
at android.view.View.access$3500(View.java:802)
at android.view.View$PerformClick.run(View.java:27843)
at android.os.Handler.handleCallback(Handler.java:883)
at android.os.Handler.dispatchMessage(Handler.java:100)
at android.os.Looper.loop(Looper.java:214)
at android.app.ActivityThread.main(ActivityThread.java:7116)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:492)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:925)
Caused by: java.lang.reflect.InvocationTargetException
at java.lang.reflect.Method.invoke(Native Method)
at android.support.v7.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:385)
at android.view.View.performClick(View.java:7251)
at android.view.View.performClickInternal(View.java:7228)
at android.view.View.access$3500(View.java:802)
at android.view.View$PerformClick.run(View.java:27843)
at android.os.Handler.handleCallback(Handler.java:883)
at android.os.Handler.dispatchMessage(Handler.java:100)
at android.os.Looper.loop(Looper.java:214)
at android.app.ActivityThread.main(ActivityThread.java:7116)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:492)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:925)
Caused by: java.util.IllegalFormatConversionException: d != java.lang.Double
at java.util.Formatter$FormatSpecifier.failConversion(Formatter.java:4403)
at java.util.Formatter$FormatSpecifier.printInteger(Formatter.java:2885)
at java.util.Formatter$FormatSpecifier.print(Formatter.java:2839)
at java.util.Formatter.format(Formatter.java:2530)
at java.util.Formatter.format(Formatter.java:2459)
at java.lang.String.format(String.java:2911)
at android.content.res.Resources.getString(Resources.java:485)
at com.example.tipcalculator.MainActivity.calculate(MainActivity.java:88)
at java.lang.reflect.Method.invoke(Native Method)
at android.support.v7.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:385)
at android.view.View.performClick(View.java:7251)
at android.view.View.performClickInternal(View.java:7228)
at android.view.View.access$3500(View.java:802)
at android.view.View$PerformClick.run(View.java:27843)
at android.os.Handler.handleCallback(Handler.java:883)
at android.os.Handler.dispatchMessage(Handler.java:100)
at android.os.Looper.loop(Looper.java:214)
at android.app.ActivityThread.main(ActivityThread.java:7116)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:492)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:925)
Отредактировал, заранее спасибо
не могли бы вы опубликовать свой код активности, пожалуйста? я думаю, вы не инициализировали view
может быть один из тех tip
, showTotal
также у вас есть Caused by: java.util.IllegalFormatConversionException: d != java.lang.Double
, что означает какой-то неправильный разговор. опубликуйте свой полный код активности и покажите, какая именно строка кода имеет исключение.
Нет, у меня точно есть, но я выложил метод
Вы пробовали использовать <string name = "Tip_Amount">Tip: %d</string> <string name = "Total_Amount">Total: %d</string>
?
Посмотри снова. setText()
не отображается в трассировке стека. Следовательно проблема не в этом. Проблема раньше, в оценке его аргументов.
Я думаю, что то, что вы передаете как tipAmount
и Total
, имеет проблему с типом, поскольку ваш форматировщик строк %1$d
ожидает в не является двойным или другим типом. Сначала попробуйте распечатать их с помощью Log
.
Это будет работать
tip.setText(getResources().getString(R.string.Tip_Amount, 100));
showTotal.setText(getResources().getString(R.string.Total_Amount, 1000));
это не сработает
tip.setText(getResources().getString(R.string.Tip_Amount, 100.00))
showTotal.setText(getResources().getString(R.string.Total_Amount, 1000.00));
Пожалуйста, перейдите по ссылке, чтобы узнать больше о форматировании строк Форматтер
Вы использовали d
в %1$d
в файле strings.xml, поэтому ожидается целое число. Однако вы отправляете двойное значение, поэтому возникает ошибка. Поскольку вам нужна десятичная часть, можно использовать f
вместо d
и обновить strings.xml следующим образом:
<string name = "Tip_Amount">Tip: %1$.2f</string>
<string name = "Total_Amount">Total: %1$.2f</string>
Таким образом, вы также получите хорошее представление, 2 цифры после точки. Кстати, я рекомендую использовать BigDecimal для валют.
напишите свой
logcat/stacktrace
пожалуйста