studio programacion herramientas fundamentos con avanzado aplicaciones android

programacion - manual de android en pdf



Cómo pasar AttributeSet a la vista personalizada (3)

¿Cómo paso el AttributeSet actual a una clase de vista personalizada? Si uso un constructor que solo tiene Contexto en los argumentos, pierdo todos los temas y la capacidad de usar etiquetas de "estilo" en el xml para esa Vista personalizada.

Lo que he hecho es crear una actividad que ya contiene mi vista personalizada en el archivo xml, y luego crear una nueva mediante programación y agregarla al diseño. Lo que encuentro es que el que está hecho en el xml tiene el estilo adecuado, y el que creo mediante programación no.

La diferencia entre los dos por lo que puedo decir es que el sistema usa el CustomLayout1(Context context, AttributeSet attrs) . El problema es que no puedo descubrir cómo obtener el AttributeSet para que la aplicación pase a esta vista personalizada cuando la creo mediante programación.

Aquí está la actividad:

import android.app.Activity; import android.os.Bundle; import android.widget.LinearLayout; public class ThemeOne extends Activity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); LinearLayout layout = (LinearLayout) findViewById(R.id.mainlayout); layout.addView(new CustomLayout1(getApplicationContext())); } }

Aquí está el xml principal:

<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:id="@+id/mainlayout" android:layout_width="fill_parent" android:layout_height="fill_parent"> <com.clearsync.test.theme1.CustomLayout1 android:id="@+id/maincustom" android:layout_width="fill_parent" android:layout_height="wrap_content" /> </LinearLayout>

La clase de vista personalizada:

import com.clearsync.test.theme1.R; import android.content.Context; import android.util.AttributeSet; import android.view.LayoutInflater; import android.widget.LinearLayout; public class CustomLayout1 extends LinearLayout { private Context context = null; public CustomLayout1(Context context) { super(context); this.context = context; create(); } public CustomLayout1(Context context, AttributeSet attrs) { super(context, attrs); this.context = context; create(); } private void create(){ LayoutInflater layoutInflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); layoutInflater.inflate(R.layout.inflateme, this, true); } }

y finalmente, la vista personalizada xml:

<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Oh, Hewroh..." style="?textview_style1" /> </LinearLayout>


¿Qué estás tratando de lograr aquí? Parece que tienes un bucle recursivo sin fin aquí con tu método de creación, ya que inflate () llamará al constructor que toma atributos. De todos modos, para responder a tu pregunta, ¡obtienes los atributos en el constructor con los atributos!

Ese es el constructor al que se llama cuando se carga desde XML, de lo contrario, llama a uno de los otros constructores que proporciona.

Otra cosa útil, puede obtener una referencia al inflador mucho más fácil con el método de Vista estática. View.inflate: D


En lugar de compilarlo con layout.addView (nuevo CustomLayout1 (getApplicationContext ())); infla con el LayoutInflater en tu actividad.

LayoutInflater inflater = LayoutInflater.from(this); inflater.inflate(R.layout.yourcustomviewxml, layout);


Su código crea LinearLayout dentro del diseño lineal para su vista personalizada. La forma correcta de hacer esto es cambiar su xml de vista personalizada desde:

<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Oh, Hewroh..." style="?textview_style1" /> </LinearLayout>

a

<merge xmlns:android="http://schemas.android.com/apk/res/android"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Oh, Hewroh..." style="?textview_style1" /> </merge>