studio medium custom create compound attrs android custom-view

medium - custom components android



Vista personalizada que extiende el diseƱo relativo (2)

Intenta conseguir actividad y usa esto

{ LayoutInflater inflter = activity.getLayoutInflater(); View v = inflter.inflate(R.layout.custom_view,null); this.addView(v); or addView(v); }

package com.binod.customviewtest; import android.content.Context; import android.view.LayoutInflater; import android.widget.RelativeLayout; public class CustomView extends RelativeLayout{ public CustomView(Context context) { super(context); // TODO Auto-generated constructor stub // LayoutInflater mInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); LayoutInflater mInflater = LayoutInflater.from(context); mInflater.inflate(R.layout.custom_view , this, true); } }

Incluyendo como

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".MainActivity" > <com.binod.customviewtest.CustomView android:layout_width="match_parent" android:layout_height="wrap_content" ></com.binod.customviewtest.CustomView> </RelativeLayout>

Vista personalizada como

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" > <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/hello_world" /> </RelativeLayout>

Simplemente comencé a agregar una nueva vista personalizada y obtuve el error una vez. Si borro esto, entonces puedo avanzar.

Me estoy quedando "Causado por: android.view.InflateException: Línea de archivo XML binario # 1: Error al inflar la clase"


Necesitas tener 2 constructores más. Saber por que

¿Necesito los tres constructores para una vista personalizada de Android?

public class CustomView extends RelativeLayout{ LayoutInflater mInflater; public CustomView(Context context) { super(context); mInflater = LayoutInflater.from(context); init(); } public CustomView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); mInflater = LayoutInflater.from(context); init(); } public CustomView(Context context, AttributeSet attrs) { super(context, attrs); mInflater = LayoutInflater.from(context); init(); } public void init() { View v = mInflater.inflate(R.layout.custom_view, this, true); TextView tv = (TextView) v.findViewById(R.id.textView1); tv.setText(" Custom RelativeLayout"); } }

Estoy publicando un ejemplo. Mi nombre de paquete es diferente

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" > <com.example.testall.CustomView android:id="@+id/timer1" android:layout_width="wrap_content" android:layout_height="wrap_content" /> </RelativeLayout>

custom_view.xml

<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" > <TextView android:id="@+id/textView1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentTop="true" android:layout_centerHorizontal="true" android:layout_marginTop="60dp" android:text="My Custom View" /> </RelativeLayout>

MainActivity.java

public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } }

Chasquido

Como pskink sugirió allí en un RelativeLayout en activity_main.xml con un CustomView secundario. Luego, CustomView extiende RealtiveLayout y luego nuevamente infla una vista personalizada con RelativeLayout y un TextView secundario. No hay necesidad de todo esto. Sólo un CustomView. Cree un TextView creado mediante programación y luego agregue la vista de texto a RelativeLayout

Editar:

activity_main.xml

<com.example.testall.CustomView xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/timer1" android:layout_width="match_parent" android:layout_height="match_parent" />

Vista personalizada

public class CustomView extends RelativeLayout{ TextView tv; public CustomView(Context context) { super(context); tv = new TextView(context); init(); } public CustomView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); tv = new TextView(context); init(); } public CustomView(Context context, AttributeSet attrs) { super(context, attrs); tv = new TextView(context); init(); } public void init() { this.addView(tv); tv.setText(" Custom RelativeLayout"); } }