Button to add a new field

2

I'm creating an application that calculates the average of 3 numbers, so long, but now I wanted to create a '+' button that at the time I clicked on it it would add a new field and make that calculation with the fourth and so on but I did not find anything that was similar or did it, I would like your help for it.

    
asked by anonymous 11.09.2014 / 20:48

1 answer

2

To add elements programmatically to your layout, you need to instantiate the Widget ( TextView , EditText , Button , and etc) and add to the container using the addView(View view) or addView(View view, LayoutParams params) .

This behavior of composing hierarchy and adding View's is characteristic of ViewGroup class. , we can associate ViewGroup with a View's tree. Examples of this would be: LinearLayout , RelativeLayout , FrameLayout and the others.

An example of programmatic addition of new Widgets would be:

// Aqui entra o seu container, pai dos elementos
// Basta escolher algum que pertenca ao seu layout.
// Recomendo um LinearLayout com orientation="vertical"
ViewGroup container = findViewById(R.id.container);
// Ou
ViewGroup container = getView().findViewById(R.id.container);

// Iremos instanciar o novo Widget a ser adicionado
// Em sua Activity
EdiText novoEdit = new EdiText(this);
// Ou em um Fragment
EditText novoEdit = new EditText(getActivity());

// Dependendo de como for seu layout, podem haver outros edits que nao
// estao relacionados com a soma diretamente, para sabermos que ele
// foi adicionado programaticamente, colocamos uma marcacao
novoEdit.setTag(R.id.container, true);

// Se quiser setar um texto inicial
novoEdit.setText("42");

// Se quiser adicionar um Hint que aparecerá quando nenhum texto for digitado
novoEdit.setHint("Entre com o numero");

// Aqui adicionamos o Widget ao container
container.addView(novoEdit);
// Ou
// Aqui pode variar um pouco dependendo da subclasse do container
container.addView(novoEdit, new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);

To sum the values:

// Aqui novamente entra o seu container, pai dos elementos
ViewGroup container = findViewById(R.id.container);

// Quantos filhos ele tem
int childCount = container.getChildCount();

// Itero sobre os filhos do container
for(int i = 0; i < childCount; ++i) {
    // Pegamos o filho no indice i
    View filho = container.getChildAt(i);

    // Se ele for um EditText
    if(filho instanceof EditText) {
        EditText editFilho = (EditText) filho;

        // Eh um EditText criado programaticamente?
        // Para isso verificamos a marcacao que fizemos
        if(editFilho.getTag(R.id.container) != null) {

            String texto = editFilho.getText().toString();

            // TODO Fazer tratamento de vazio e de exception...
            // TODO Usar o texto para fazer a media... 
        }
    }
}
    
11.09.2014 / 23:13