studio que programacion edittext android android-layout view custom-attributes findviewbyid

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