마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

값을 입력받으면 바로 계산해 결과값을 출력하는 프로그램을 만드려는데 모르는 것이 있습니다..

0 추천

첫번째 값을 입력받고, 두번째 값을 입력받아서 곱한 후 결과(TextView)에 그 값을 출력하는 어플을 만들고 있습니다.

그리고 입력값 추가 버튼을 누르게되면 누를 때마다 첫번째, 두번째 값을 입력하는 창이 추가로 나오게 했습니다. 결과를 구할때는 각각의 첫번째, 두번째 값을 곱한 다음 그 값들을 모두 더하는 식으로 만드려고 생각하고 있었습니다.

ex) (첫번째 값 * 두번째 값) + (첫번째 값 * 두번째 값) + (첫번째 값 * 두번째 값) ..... // 여기서 각각의 첫번째 값, 두번째 값들은 모두 다른 값을 입력할 것입니다.

입력값추가는 제한없이 누를때마다 텍스트를 추가하는 기능으로 만들었습니다..

 

public class MainActivity extends AppCompatActivity {
    private LinearLayout parentLayout;
    private Button addButton;
    private EditText input1, input2;
    private TextView result;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        addButton = findViewById(R.id.addButton);
        input1 = findViewById(R.id.input1); // input1은 기존에 있는 첫번째 값을 입력하는 EditText
        input2 = findViewById(R.id.input2); // input2는 기존에 있는 두번째 값을 입력하는 EditText
        result = findViewById(R.id.result); // result는 결과값을 나타내는 TextView


        addButton.setOnClickListener(new Button.OnClickListener() {
            @Override
            public void onClick(View v) {
                parentLayout = findViewById(R.id.valueLayout);

                // 구분선을 만드는 뷰 생성
                View line = new View(getApplicationContext());
                LinearLayout.LayoutParams p = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);
                p.height = 4;
                line.setBackgroundColor(0xFF000000);
                line.setLayoutParams(p);
                parentLayout.addView(line);


                // 첫번째 TextView 생성
                TextView newValue1 = new TextView(getApplicationContext());
                LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);
                newValue1.setLayoutParams(params);
                newValue1.setText("첫번째 값");
                newValue1.setTextSize(20);
                parentLayout.addView(newValue1);

                // 첫번쨰 EditText 생성
                EditText newInput1 = new EditText(getApplicationContext());
                newInput1.setLayoutParams(params);
                parentLayout.addView(newInput1);

                // 두번째 TextView 생성
                TextView newValue2 = new TextView(getApplicationContext());
                newValue2.setLayoutParams(params);
                newValue2.setText("두번째 값");
                newValue2.setTextSize(20);
                parentLayout.addView(newValue2);

                // 두번째 EditText 생성
                EditText newInput2 = new EditText(getApplicationContext());
                newInput2.setLayoutParams(params);
                parentLayout.addView(newInput2);
            }
        });



    }
}

mainActivity.java

addTextChangedListener를 사용하면 텍스트를 입력할때 바로 계산을 해준다고 해서 사용해봤는데, 정해져있는 텍스트가 있을때는 할 수 있겠는데, 버튼을 눌러 동적으로 텍스트를 여러개를 추가를 하니까 텍스트에 각각의 이벤트가 지정되지 않고 마지막으로 생성된 텍스트만 이벤트 처리가 됬습니다..  텍스트가 버튼을 눌러 새롭게 생성될 때마다 그 텍스트에게 각각의 이벤트를 지정해주고 싶은데 방법을 알고싶습니다! 

안드로이드독학 (290 포인트) 님이 7월 15일 질문

2개의 답변

0 추천
어렵게 생각하신듯 한데 버튼이 눌려  onClick 이벤트가 발생할 때  텍스트 변화값을 읽어와서 계산 하시면 됩니다.
익명사용자 님이 7월 15일 답변
0 추천

TextWatch 인스턴스를 하나 만드시고 생성된 TextView에 할당하세요. 제가 샘플 코드도 드렸었는데, 거기에는 EditText를 하나만 저장하고 있었던 것 같은데요. 그렇게 하면 당연히 새로운 EditText를 생성하게 되면 앞에서 해당 변수도 마지막에 생성된 EditText를 가리키기 때문에 당연히 그렇게 될 수 밖에 없습니다.  생성되는 EditText를 List같은 구조로 관리를 하세요.

private TextWatcher textChangedListener = object: TextWatcher () {
  ...
};

// Button click 
EditText editText = createEditText();
editText.addTextWatcher(textChangedListener);


public static List<View> getEditTextViews(ViewGroup parent) {
    final List<View> result = new ArrayList<>();
    int count = viewGroup.getChildCount();

   for (int i = 0; i < count; i++) {
      View childView = viewGroup.getChildAt(i); 
       if (childView instanceof EditText) {
          result.add(childView);
       }
   }

    return result;
}

 

첫번째 EditText + Button + 두번째 EditText를 별도의 커스텀 컴포넌트로 만드는 방법도 있습니다. 님의 경우는 이 방법도 맞을 듯 싶네요. 화면이 최종적으로 어떤 모습인지를 보여주시면 좀 더 힌트를 드릴 수 있을지도 모르겠네요.

spark (72,310 포인트) 님이 7월 15일 답변
...