que - manual de programacion android pdf
Android findViewById() en vista personalizada (6)
He escrito mi Vista personalizada y quiero actualizar algunas otras vistas después de interactuar con mi vista personalizada.
Disposición principal:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:custom="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent">
<EditText
android:id="@+id/display_name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:inputType="text"
android:layout_centerHorizontal="true"
android:tag="name"
android:ems="10" />
<EditText
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:inputType="number"
android:ems="10"
android:id="@+id/id_number"
android:layout_centerHorizontal="true"
android:layout_below="@id/display_name"/>
<ge.altasoft.custom_views.IdNumber
android:id="@+id/custom_id_number"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:layout_below="@id/id_number"
android:paddingLeft="35dip"
custom:firstName="@id/display_name"/>
</RelativeLayout>
Diseño de vista personalizado:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="wrap_content">
<EditText
android:id="@+id/id_number_custom"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:inputType="number"
android:ems="10"
android:paddingRight="35dip" />
<ImageButton
android:id="@+id/load_data_button"
android:layout_width="30dip"
android:layout_height="30dip"
android:layout_centerVertical="true"
android:src="@drawable/load_data"
android:layout_toRightOf="@id/id_number_custom" />
</RelativeLayout>
Vista personalizada de clase, constructor y oyente:
private int firstNameViewID;
public IdNumber (Context context, AttributeSet attrs) {
super(context, attrs);
initViews();
TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.IdNumber);
final int N = a.getIndexCount();
for(int i = 0; i < N; i++){
int attr = a.getIndex(i);
switch(attr){
case R.styleable.IdNumber_firstName:
firstNameViewID = a.getResourceId(attr, -1);
break;
}
}
a.recycle();
}
private void initViews() {
inflater = (LayoutInflater) getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
inflater.inflate(R.layout.id_number_edit_text_custom, this, true);
editText = (EditText) findViewById(R.id.id_number_custom);
loadButton = (ImageButton) findViewById(R.id.load_data_button);
loadButton.setVisibility(RelativeLayout.INVISIBLE);
loadData();
}
private void loadData(){
loadButton.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
EditText firstName = (EditText) findViewById(R.id.display_name);
firstName.setText("Some Text");
}
});
}
El problema es que EditText firstName = (EditText) findViewById(R.id.display_name);
devuelve nulo. Sé que solo llamando a findViewById()
la vista en el diseño que la he inflado.
Si es posible, ¿cómo puedo obtener la vista de EditText con id: display_name desde el diseño principal?
Gracias por adelantado.
Cambie su método de la siguiente manera y verifique que funcione
private void initViews() {
inflater = (LayoutInflater) getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
inflater.inflate(R.layout.id_number_edit_text_custom, this, true);
View view = (View) inflater.inflate(R.layout.main, null);
editText = (EditText) view.findViewById(R.id.id_number_custom);
loadButton = (ImageButton) view.findViewById(R.id.load_data_button);
loadButton.setVisibility(RelativeLayout.INVISIBLE);
loadData();
}
Prueba esto en tu constructor.
MainActivity maniActivity = (MainActivity)context;
EditText firstName = (EditText) maniActivity.findViewById(R.id.display_name);
Puedes probar algo como esto:
Dentro del constructor customview:
mContext = context;
Siguiente dentro de customview puedes llamar:
((MainActivity) mContext).updateText( text );
Dentro de MainAcivity
define:
public void updateText(final String text) {
TextView txtView = (TextView) findViewById(R.id.text);
txtView.setText(text);
}
Esto funciona para mi.
Si se trata de un diseño fijo, puedes hacerlo así:
public void onClick(View v) {
ViewGroup parent = (ViewGroup) IdNumber.this.getParent();
EditText firstName = (EditText) parent.findViewById(R.id.display_name);
firstName.setText("Some Text");
}
Si quieres encontrar el EditText en un diseño flexible, te ayudaré más tarde. Espero que esto ayude.
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View row = convertView;
ImageHolder holder = null;
if (row == null) {
LayoutInflater inflater = ((Activity) context).getLayoutInflater();
row = inflater.inflate(layoutResourceId, parent, false);
holder = new ImageHolder();
editText = (EditText) row.findViewById(R.id.id_number_custom);
loadButton = (ImageButton) row.findViewById(R.id.load_data_button);
row.setTag(holder);
} else {
holder = (ImageHolder) row.getTag();
}
holder.editText.setText("Your Value");
holder.loadButton.setImageBitmap("Your Bitmap Value");
return row;
}
View Custmv;
private void initViews() {
inflater = (LayoutInflater) getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
Custmv = inflater.inflate(R.layout.id_number_edit_text_custom, this, true);
editText = (EditText) findViewById(R.id.id_number_custom);
loadButton = (ImageButton) findViewById(R.id.load_data_button);
loadButton.setVisibility(RelativeLayout.INVISIBLE);
loadData();
}
private void loadData(){
loadButton.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
EditText firstName = (EditText) Custmv.getParent().findViewById(R.id.display_name);
firstName.setText("Some Text");
}
});
}
prueba de esta manera