Динамічне створення об'єктів

Submitted by gary on Sun, 02/03/2013 - 01:00

Створює кнопки на екрані. В якості обробника натиснень кнопок використовується Activity (тобто допишемо в оголошення класу implements OnClickListener, і створимо метод обробки onClick).

package ua.pp.garik.android.dynamiclayout2;

import java.util.Random;

import android.app.Activity;
import android.os.Bundle;
import android.view.Gravity;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.LinearLayout;
import android.widget.RadioGroup;
import android.widget.Toast;

public class MainActivity extends Activity implements OnClickListener {

LinearLayout llMain;
RadioGroup rgGravity;
EditText etName;
Button btnCreate, btnClear;
int wrapContent = LinearLayout.LayoutParams.WRAP_CONTENT;


@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

llMain = (LinearLayout) findViewById(R.id.llMain);
rgGravity = (RadioGroup) findViewById(R.id.rgGravity);
etName = (EditText) findViewById(R.id.etName);
btnCreate = (Button) findViewById(R.id.btnCreate);
btnCreate.setOnClickListener(this);

btnClear = (Button) findViewById(R.id.btnClear);
btnClear.setOnClickListener(this);
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.activity_main, menu);
return true;
}

@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.btnCreate:
LinearLayout.LayoutParams lParams = new LinearLayout.LayoutParams(wrapContent, wrapContent);
int btnGravity = Gravity.LEFT;
switch (rgGravity.getCheckedRadioButtonId()) {
case R.id.rbLeft:
btnGravity = Gravity.LEFT;
break;
case R.id.rbCenter:
btnGravity = Gravity.CENTER_HORIZONTAL;
break;
case R.id.rbRight:
btnGravity = Gravity.RIGHT;
break;
}
lParams.gravity = btnGravity;


Button btnNew = new Button(this);
btnNew.setText(etName.getText().toString());
btnNew.setOnClickListener(this);

llMain.addView(btnNew, lParams);
break;
case R.id.btnClear:
llMain.removeAllViews();
Toast.makeText(this, "Удалено", Toast.LENGTH_LONG).show();
break;
case -1:
//створеним об'єктам ми не задавали id, тому -1 
Button btnTmp = (Button)v;
Toast.makeText(this, "Натиснута кнопка з текстом: " + btnTmp.getText(), Toast.LENGTH_LONG).show();
break;
}

}

}

В обробнику onClick перевіряємо чи натиснена свіжостворена кнопка, за її ID, у них він не заданий, і рівний -1.
Щоб отримати текст кнопки необхідно було перетворити батьківський клас View у Button, і лише тоді використати метод .getText()
Button btnTmp = (Button)v;
btnTmp.getText();