Seekbar创建EditTexts,然后获取条目以供进一步使用

时间:2012-07-14 15:35:03

标签: android arrays seekbar

此代码创建一个搜索栏,并使搜索栏创建尽可能多的EditText字段,因为滑块位于/删除太多。此代码位于OnActivityCreated

final LinearLayout linearLayout = (LinearLayout) getActivity()
  .findViewById(R.id.npv_calcfields);
EditText editText = new EditText(getActivity());
editText.setId(i);
editText.setLayoutParams(new LayoutParams(
  LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT));
  SeekBar bar = (SeekBar) getActivity().findViewById(R.id.npv_seekbar);
  final TextView selection = (TextView) getActivity()
    .findViewById(R.id.npv_selected);
  bar.setOnSeekBarChangeListener(new OnSeekBarChangeListener() {
    public void onProgressChanged(SeekBar seekbar, int progress,
      boolean fromUser) {
      selection.setText("You have selected " + progress + " periods.");
      if (progress == 0) {
        String normalstring = getActivity().getResources()
          .getString(R.string.npv1);
        selection.setText(normalstring);
      }
      if (i > progress) {
        while (i > progress) {
          i--;
          EditText editText = (EditText) getActivity()
            .findViewById(i);
          linearLayout.removeView(editText);
        }
      } else {
        while (i < progress) {
          EditText editText = new EditText(getActivity());
          editText.setId(i);
          editText.setLayoutParams(new LayoutParams(
            LayoutParams.FILL_PARENT,
            LayoutParams.WRAP_CONTENT));
          linearLayout.addView(editText);
          editText.setHint("Cash Flow " + i);
          i++;
        }
      }
    }
    public void onStopTrackingTouch(SeekBar arg0) {
    }
    public void onStartTrackingTouch(SeekBar arg0) {
    }
  });

此代码位于常规类区域中:

int i = 0;
EditText r = (EditText) getActivity().findViewById(R.id.npv_rate);
Button calc = (Button) getActivity().findViewById(R.id.npv_calc);
EditText[] DynamicField = new EditText[16];

现在我希望用户在这些edittext字段中输入数字,然后我想对它们进行一些数学计算:Entry / (Math.pow(1+r, i) i使用该字段的id。因此,第一个条目应按以下方式计算:entry/(1+r)^0。这是我尝试过但它不起作用。它只是在启动时崩溃。

calc.setOnClickListener(new OnClickListener() {
  public void onClick(View arg0) {
    Double r1 = Double.parseDouble(r.getText().toString());
    EditText editText = (EditText) getActivity().findViewById(i);
    TextView answer = (TextView) getActivity().findViewById(R.id.npv_answer);
    double[] CashFlows;
    CashFlows = new double[i];
    double result = 0;
    CashFlows[i] = (Double.parseDouble(editText.getText()
      .toString())) / (Math.pow(1 + r1, i));
    for (double d : CashFlows) {
      result += d;
    }
    answer.setText("answer is " + result);
  }
});

我做错了什么?顺便说一句,只有最后一个代码段不起作用。如果我评论它一切正常我测试它:)只是剂量做任何事情:)

确定错误日志的一些背景信息,您可以在此处看到:http://pastebin.com/G8iX6Pkm 编辑:可以在这里看到整个班级文件:http://pastebin.com/dxA91dst,整个项目可以在这里找到:https://github.com/killerpixler/Android-Financial-Calculator.git

当有人点击Main活动的listitem时,类文件是一个在DetailsActivity中加载的片段。就像我说的那样,错误必须在按钮监听器中,因为它在我添加它之前就已经工作了。

1 个答案:

答案 0 :(得分:1)

NullPointerException来自Views使用getActivity()方法初始化F_NPV,您将其声明为getActivity()类中的字段。方法Activity方法将在调用回调onAttach()后返回有效的Fragment引用,因此初始化视图的方式将不起作用,此时(当getActivity类被初始化)方法null将返回onActivityCreated,没有有效的引用。进行初始化的正确方法是在EditText r; Button calc; //... @Override public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); r = (EditText) getActivity().findViewById(R.id.npv_rate); calc = (Button) getActivity().findViewById(R.id.npv_calc); //... 回调中执行此操作:

NumberFormatException

另外,如果可以,请提供有关您的代码的一些建议:

你正在从字符串中进行一些双重解析,检查输入可能是一个好主意,所以你不要抛出EditTexts。例如,如果用户创建了一些Button,然后单击计算NumberFormatException(我知道,这听起来很愚蠢,但用户可能会这样做(例如,我做了)),你当您尝试解析空String时,将抛出public void onClick(View arg0) { Double r1 = Double.parseDouble((r.getText().toString()) .equals("") ? "0" : r.getText().toString()); EditText editText = (EditText) getActivity().findViewById(i); TextView answer = (TextView) getActivity().findViewById(R.id.npv_answer); double[] CashFlows; CashFlows = new double[i]; double result = 0; String tmp = editText.getText().toString(); CashFlows[i] = (Double.parseDouble(tmp.equals("") ? "0" : tmp)) / (Math.pow(1 + r1, i)); //... 。而是做一点检查:

EditText

此外,即使NullPointerException中的值正确,上述代码也会抛出editText,因为null变量将为while。原因在于您用于创建字段的SeekBar循环。例如,如果用户将while移动到3而不是i循环将运行3次,则每次递增i值。所以0将是12i,目前为止是正确的,但因为每次最终的i {{}} {{}}} {1}}。现在,在4方法中,您将查找标识为onClick的{​​{1}},但由于标识中没有EditText且标识为i ,视图将为EditText

另外,尝试给你的班级更好的名字,你可能非常清楚他们的意思,但你可能会让那些读取你的代码的人更糟糕(如F_PNV,F_PV等)。

4方法的代码。这应该可以解决你想要做的事情(如果我明白你想要的话):

null