0

このコードはシークバーを作成し、シークバーにスライダーと同じ数の 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 フィールドに数値を入力してもらい、フィールドの ID を使用して計算を行いたいと考えていEntry / (Math.pow(1+r, i)ますi。したがって、最初のエントリは次のように計算する必要があります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 アクティビティのリスト項目をクリックしたときに DetailsActivity に読み込まれるフラグメントです。私が言ったように、エラーはボタンリスナーにある必要があります。これは、追加する前に機能していたためです。

4

1 に答える 1

1

これは、クラスのフィールドとして宣言するメソッドを使用してNullPointerException初期化するという事実に由来します。メソッドメソッドは、コールバックが呼び出された後に有効な参照を返すため、ビューを初期化する方法は機能しません。その時点(クラスのフィールドが初期化されるとき)では、メソッドは有効な参照を返しません。その初期化を行う正しい方法は、コールバックでそれを行うことです。ViewsgetActivity()F_NPVgetActivity()ActivityonAttach()FragmentgetActivitynullonActivityCreated

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);
//...

また、可能であれば、コードに関するいくつかの提案:

文字列からdoubleの解析を行っているので、。をスローしないように入力を確認することをお勧めします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、上記のコードはをスローします。この理由は、フィールドの作成に使用したループにあります。たとえば、ユーザーがを3に移動すると、ループは3回実行され、そのたびに値が増加します。、、、、これまでのところ正しいですが、毎回インクリメントするため、ファイナルはになります。このメソッドでは、idを持つを探しますが、idを持つレイアウトにはないため、ビューはになります。NullPointerExceptioneditTextnullwhileSeekBarwhileii012ii4onClickEditTextiEditText4null

また、クラスにもっと良い名前を付けてみてください。クラスの意味をよく知っているかもしれませんが、コードを読む人(F_PNV、F_PVなど)にとっては事態を悪化させる可能性があります。

メソッドのコードonActivityCreated。これはあなたがやろうとしていることを解決するはずです(私があなたが何を望んでいるのか理解しているなら):

@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);
    final LinearLayout linearLayout = (LinearLayout) getActivity()
            .findViewById(R.id.npv_calcfields);
    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);
                linearLayout.removeAllViews(); // the progress is 0 so
                                                // remove all the views that
                                                // are currently present
            } else {                
                int currentChilds = linearLayout.getChildCount();
                if (currentChilds < progress) {
                    while (currentChilds != progress) {
                        EditText editText = new EditText(getActivity());                        
                        editText.setLayoutParams(new LayoutParams(
                                LayoutParams.FILL_PARENT,
                                LayoutParams.WRAP_CONTENT));
                        linearLayout.addView(editText);
                        currentChilds++;                            
                    }
                } else if (currentChilds > progress) {
                    while (currentChilds != progress) {
                        linearLayout.removeViewAt(linearLayout
                                .getChildCount() - 1);
                        currentChilds--;
                    }
                }
            }
        }

        public void onStopTrackingTouch(SeekBar arg0) {
        }

        public void onStartTrackingTouch(SeekBar arg0) {
        }
    });

    calc.setOnClickListener(new OnClickListener() {

        public void onClick(View view) {
            Double r1 = Double.parseDouble((r.getText().toString())
                    .equals("") ? "0" : r.getText().toString());
            TextView answer = (TextView) getActivity().findViewById(
                    R.id.npv_answer);
            final LinearLayout linearLayout = (LinearLayout) getActivity()
                    .findViewById(R.id.npv_calcfields);
            int size = linearLayout.getChildCount();
            double[] CashFlows = new double[size];
            double result = 0;
            for (int i = 0; i < size; i++) {
                EditText editText = (EditText) linearLayout.getChildAt(i);
                String tmp = editText.getText().toString();
                CashFlows[i] = (Double.parseDouble(tmp.equals("") ? "0"
                        : tmp)) / (Math.pow(1 + r1, i));
            }
            for (double d : CashFlows) {
                result += d;
            }
            answer.setText("answer is " + result);
        }
    });

}
于 2012-07-15T10:26:16.080 に答える