2012-06-14 28 views
27

Tengo una clase View1 que se extiende View. Quiero inflar R.layout.test2.xml en esta clase View1. He puesto un código siguiente en esta claseInflar un diseño xml en una clase de vista personalizada

public class View1 extends View { 

    View view; 
    String[] countries = new String[] {"India", "USA", "Canada"}; 

    public View1(Context context) { 
     super(context); 
     LayoutInflater mInflater=(LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     view=mInflater.inflate(R.layout.test2, null, false); 
    } 
} 

de otra clase Home Quiero que esta visión exagerada a estar allí para algunas circunstancias, En la clase Home escribí el siguiente código:

public class Home extends Activity{ 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.home); 
     CreateView(); 
    } 

    public void CreateView() { 
     LinearLayout lv=(LinearLayout)findViewById(R.id.linearlayout); 
     View1 view = new View1(Home.this); 
     lv.addView(view); 
    } 
} 

Pero mientras ejecuto mi proyecto, la actividad no me muestra nada.

Respuesta

45

No se puede agregar vistas a la clase View su lugar debe usar ViewGroup o una de sus subclases (como Linearlayout, RelativeLayout etc). A continuación, el código será la siguiente:

public class View1 extends LinearLayout { 

    View view; 
    String[] countries = new String[] {"India", "USA", "Canada"}; 

    public View1(Context context) { 
     super(context); 
     LayoutInflater mInflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     mInflater.inflate(R.layout.test2, this, true);}} 

también la línea:

mInflater.inflate(R.layout.test2, null, false) 

no añade nada a la vista actual (debido al parámetro false), sólo se infla un View de una diseño xml

+1

Thnks funciona !! :) – LuminiousAndroid

+0

¿Puedes decir por qué no estábamos dando nada al extender View? – LuminiousAndroid

+1

@ Kabir121 La clase 'View' no admite la adición de otras vistas, la clase' View' representa una sola 'Vista' individual (como, si desea construir un 'Botón' redondeado) y no un grupo (como en tu caso cuando inflas ese archivo de diseño). – Luksprog

9

Utilice esta

LayoutInflater li = (LayoutInflater)getContext().getSystemService(infService); 
    li.inflate(R.layout.test2, **this**, true); 

Debe utilizar this, no es nulo, y cambiar el false parámetro (AttachToRoot booleano) a true

+7

Para hacer esto, necesita una subclase de ViewGroup, no View – spookypeanut

3

usar el siguiente código para inflar su diseño, entonces usted puede utilizar esa vista para cualquier propósito. Esto le dará el diseño más parental de su archivo XML. Escriba cast y úselo en consecuencia.

View headerView = View.inflate(this, R.layout.layout_name, null); 
+0

si tengo una vista de lista en mi clase View1 y luego onlistitem haga clic en Estoy tratando de inflar nueva vista pero no es una nueva vista inflado .. Por favor, ayuda a alguien – LuminiousAndroid

+0

Donde es el ítem de la lista haciendo clic en adaptador personalizado o en actividad. –

1

Usted está agregando la actividad en el hogar vista en blanco. Porque en la clase View1 solo tiene una vista inflada pero no agrega nada.

0

usted tiene que utilizar un ViewGroup como FrameLayout y hacer:

public class View1 extends FrameLayout { 

    public View1(Context context) { 
     super(context); 
     inflate(context, R.layout.view1, this); 
    } 
} 

En el XML diseño, utilice la etiqueta <merge que no sólo tiene que añadir su diseño view1 a la disposición de la raíz que significa que tenemos un vacío FrameLayout y su vista definida una al lado de la otra.

<?xml version="1.0" encoding="utf-8"?> 
<merge xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent"> 

    <TextView 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_gravity="center" 
     android:text="content" /> 

</merge> 

Ver http://trickyandroid.com/protip-inflating-layout-for-your-custom-view/

Cuestiones relacionadas