此代码创建一个搜索栏,并使搜索栏创建尽可能多的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中加载的片段。就像我说的那样,错误必须在按钮监听器中,因为它在我添加它之前就已经工作了。
答案 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
将是1
,2
,i
,目前为止是正确的,但因为每次最终的i
{{}} {{}}} {1}}。现在,在4
方法中,您将查找标识为onClick
的{{1}},但由于标识中没有EditText
且标识为i
,视图将为EditText
。
另外,尝试给你的班级更好的名字,你可能非常清楚他们的意思,但你可能会让那些读取你的代码的人更糟糕(如F_PNV,F_PV等)。
4
方法的代码。这应该可以解决你想要做的事情(如果我明白你想要的话):
null