Button to add a new field

Asked

Viewed 792 times

2

I am creating an application that calculates the average of 3 numbers, so far so good, but now I wanted to create a '+' button that when I clicked on it he would add a new field and do this calculation with the fourth and so on... But I didn’t find anything that looked like it or that did it, I would like your help to do it.

1 answer

3

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

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

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 add up 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... 
        }
    }
}

Browser other questions tagged

You are not signed in. Login or sign up in order to post.