У меня есть этот код. Я включил его большую часть, если я что-то упустил из других методов, которые могли бы привести к моему сбою. Я рассматриваю как переменную экземпляра некоторые строки и некоторые ArrayLists. Пользователь вводит значения в некоторые EditTexts, они входят в ArrayList(allpret,allcant,allprod)
. Отсюда я беру каждое значение и помещаю его в Strings(pret,prod,cant)
, поэтому я могу ссылаться на него с cant[1],pret[1][prod1],etc.
Я должен иметь что это неправильно, не знаю, как исправить это, потому что он падает, когда я пытаюсь запустить calculeaza()
.Объявление проблем с String и ArrayList
public class MainActivity extends Activity implements OnClickListener,
TextWatcher {
public Button paginanoua;
public Button produsnou;
public Button Salveaza;
float totaltest = 0;
public int k;
public int j;
public int l;
public TextView totalc;
private static final String TAG = "MEDIA";
public List<EditText> allprod = new ArrayList<EditText>();
public List<EditText> allpret = new ArrayList<EditText>();
public List<EditText> allcant = new ArrayList<EditText>();
String[] cant=new String[allcant.size()];
String[] pret=new String[allpret.size()];
String[] prod=new String[allprod.size()];
public void produsnou() {
final LinearLayout l1 = (LinearLayout) findViewById(R.id.layout1);
EditText et = new EditText(this);
et.setHint("Produs");
l1.addView(et);
allprod.add(et);
et.addTextChangedListener(this);
et.setOnFocusChangeListener(new OnFocusChangeListener() {
@Override
public void onFocusChange(View v, boolean hasFocus) {
// TODO Auto-generated method stub
if (hasFocus &&
l1.getChildAt(l1.getChildCount() - 1) == v) {
produsnou();}}
});
LinearLayout l2 = (LinearLayout) findViewById(R.id.layout2);
EditText et2 = new EditText(this);
et2.setHint("Cantitate");
et2.setInputType(InputType.TYPE_CLASS_NUMBER
| InputType.TYPE_NUMBER_FLAG_DECIMAL);
allcant.add(et2);
l2.addView(et2);
et2.addTextChangedListener(this);
LinearLayout l3 = (LinearLayout) findViewById(R.id.layout3);
EditText et3 = new EditText(this);
et3.setHint("Pret");
et3.setInputType(InputType.TYPE_CLASS_NUMBER
| InputType.TYPE_NUMBER_FLAG_DECIMAL);
l3.addView(et3);
allpret.add(et3);
et3.addTextChangedListener(this);}
public void calculeaza() {
totaltest = 0;
for (int m = 0; m < allprod.size(); m++) {
prod[m] = allprod.get(m).getText().toString();
if (prod[m].matches("")) {
prod[m] = Float.toString(0);}}
for (int j = 0; j < allcant.size(); j++) {
cant[j] = allcant.get(j).getText().toString();
if (cant[j].matches("")) {
cant[j] = Float.toString(0);}}
for (int k = 0; k < allpret.size(); k++) {
pret[k] = allpret.get(k).getText().toString();
if (pret[k].matches("")) {
pret[k] = Float.toString(0);}}
for (int l = 0; l < allpret.size(); l++) {
Float temp = Float.parseFloat(cant[l]) * Float.parseFloat(pret[l]);
alltotal.add(temp);
totaltest = totaltest + temp;
TextView totalf = (TextView) findViewById(R.id.total);
totalf.setText(String.format("Total: %.2f", totaltest));}}
Я получаю следующее LogCat:
06-13 23: 03: 03.670: E/AndroidRuntime (15089): НЕУСТРАНИМОГО ИСКЛЮЧЕНИЕ: главный 06-13 23: 03: 03,670: E/AndroidRuntime (15089): java.lang.ArrayIndexOutOfBoundsException: length = 0; index = 0 06-13 23: 03: 03.670: E/AndroidRuntime (15089): at com.example.testlayout.MainActivity.calculeaza (MainActivity.java:209) 06-13 23: 03: 03.670: E/AndroidRuntime (15089): at com.example.testlayout.MainActivity.onTextChanged (MainActivity.java:283) 06-13 23: 03: 03.670: E/AndroidRuntime (15089): at android.widget.TextView.sendOnTextChanged (TextView.java : 7395) 06-13 23: 03: 03.670: E/AndroidRuntime (15089): на android.widget.TextView.handleTextChanged (TextView.java:7454) 06-13 23: 03: 03.670: E/AndroidRuntime (15089)): at android.widget.TextView $ ChangeWatcher.onTextChanged (TextView.java:9213) 06-13 23: 03: 03.670: E/AndroidRuntime (15089): at android.text.SpannableStringBuilder.sendTextChanged (SpannableStringBuilder.java:962) 06-13 23: 03: 03.670: E/AndroidRuntime (15089): у android. text.SpannableStringBuilder.replace (SpannableStringBuilder.java:496) 06-13 23: 03: 03.670: E/AndroidRuntime (15089): at android.text.SpannableStringBuilder.replace (SpannableStringBuilder.java:435) 06-13 23: 03: 03.670: E/AndroidRuntime (15089): at android.text.SpannableStringBuilder.replace (SpannableStringBuilder.java:30) 06-13 23: 03: 03.670: E/AndroidRuntime (15089): на android.view.inputmethod. BaseInputConnection.replaceText (BaseInputConnection.java:676) 06-13 23: 03: 03.670: E/AndroidRuntime (15089): at android.view.inputmethod.BaseInputConnection.setComposingText (BaseInputConnection.java:435) 06-13 23: 03: 03.670: E/AndroidRuntime (15089): at com.android.internal.view.IInputConnectionWrapper.executeMessage (IInputConnectionWrapper.java:333) 06-13 23: 03: 03.670: E/AndroidRuntime (15089): at com. android.internal .view.IInputConnectionWrapper $ MyHandler.handleMessage (IInputConnectionWrapper.java:77) 06-13 23: 03: 03.670: E/AndroidRuntime (15089): at android.os.Handler.dispatchMessage (Handler.java:99) 06- 13 23: 03: 03.670: E/AndroidRuntime (15089): at android.os.Looper.loop (Looper.java:137) 06-13 23: 03: 03.670: E/AndroidRuntime (15089): at android.app .ActivityThread.main (ActivityThread.java:4921) 06-13 23: 03: 03.670: E/AndroidRuntime (15089): at java.lang.reflect.Method.invokeNative (собственный метод) 06-13 23:03: 03.670: E/AndroidRuntime (15089): at java.lang.reflect.Method.invoke (Method.java:511) 06-13 23: 03: 03.670: E/AndroidRuntime (15089): на com.android.internal. os.ZygoteInit $ MethodAndArgsCaller.run (ZygoteInit.java:1038) 06-13 23: 03: 03.670: E/AndroidRuntime (15089): at com.android.internal .os.ZygoteInit.main (ZygoteInit.java:805) 06-13 23: 03: 03,670: Е/AndroidRuntime (15089): в dalvik.system.NativeStart.main (нативный метод)
линии 209 это: prod[m] = allprod.get(m).getText().toString();
. Я могу сделать работу calculeaza, я сделал это, объявив 'String [] prod = new String [allprod.size()]; 'внутри calculeaza(). Но тогда, когда я хочу использовать, например, prod [1] вне calculeaza (в моем случае положить его в txt-файл), он не найдет его, потому что он объявлен внутри метода calculeaza. Итак, мой вопрос заключается в том, как я могу объявить его внутри calculeaza (как это то, что мне нужно сделать для его работы), но, возможно, сможет использовать его за пределами calculeaza? –
@SorinGrecu Вы можете объявить его в том же месте, что и в вашем исходном коде: 'String [] prod;', но инициализировать его в 'calculeaza()': 'prod = new String [allprod.size()];'. Или просто используйте 'ArrayList', и если вам нужно' String [] 'на каком-то этапе, вы можете вызвать' String [] prodArray = prod.toArray (новый String [prod.size()]); '. – assylias
Спасибо, я узнал что-то новое через эту ошибку, хе-хе. Начните новичку без фона программирования, но stackoverflow мне очень помогает! –