Código de muestra que extiende la clase View y usa el archivo xml de diseño

Soy nuevo en el mundo de Android ... será de gran ayuda si alguien me corrige ... ¿qué estoy haciendo mal en el siguiente código ...

  • Requisito: Necesito crear una Vista personalizada (usando el archivo de diseño xml) para que la misma vista se use dentro de las actividades de mi aplicación. Aquí voy con el código de muestra en el que estoy trabajando,

cutomviewxml.xml

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

    <TextView
        android:id="@+id/textView1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Large Text"
        android:textAppearance="?android:attr/textAppearanceLarge" />
</LinearLayout>

Clase de vista extendida ... código ...

mycustomTextview.java

public class mycustomTextview extends View {

    private View mView;
    Context mycontext;

    public mycustomTextview(Context context, AttributeSet attrs) {
        super(context, attrs);
        // TODO Auto-generated constructor stub

    this.mycontext = context;

    LayoutInflater inflater;
    inflater = (LayoutInflater) context
            .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    mView = inflater.inflate(R.layout.cutomviewxml, null);
    }

Actividades main.xml filete

<?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"
    android:orientation="vertical" >


     <com.motorola.mycustomTextview
         android:id="@+id/customtextview"
         android:layout_width="fill_parent"
         android:layout_height="wrap_content"
         android:layout_below="@+id/textView2"
         android:layout_marginLeft="143dp"
         android:layout_marginTop="69dp"
         android:layout_toRightOf="@+id/textView1" />

</RelativeLayout>

Clase de actividad sample.java ..

public class sample extends Activity{

    private static final String LOG_TAG = "sampleActivity";

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        Log.i(LOG_TAG,"OnCreate of sampleActivity");
        setContentView(R.layout.main);
}
}

preguntado el 08 de noviembre de 11 a las 15:11

4 Respuestas

Creo que has cometido un pequeño error en mycustomTextview, cuando infle su diseño, también debe pasar ViewGroup, puede usar esta línea

mView = inflater.inflate(R.layout.cutomviewxml, this);

Respondido el 07 de enero de 14 a las 15:01

Para obtener acceso a las vistas dentro de la vista personalizada, anule el método onFinishInflate () y use findViewById (). Para el problema que nos ocupa, la solución será la siguiente.

public class mycustomTextview extends LinearLayout {

    Context mycontext;
    private TextView textView1;

    public mycustomTextview(Context context, AttributeSet attrs) {
        super(context, attrs);
        this.mycontext = context;
    }

    @Override
    protected void onFinishInflate() {
         super.onFinishInflate();
         textView1=(TextView) findViewById(R.id.textView1);
    }
}

Respondido el 14 de Septiembre de 18 a las 18:09

¿Cómo se pueden pasar parámetros a esta clase mycustomTextview si es necesario? - Rohan

Use esto en su 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">
        <yourpackagename.viewclassname android:id="@+id/myView1" 
         android:layout_width="wrap_content" 
         android:layout_height="wrap_content"></yourpackagename.viewclassname>
</LinearLayout>

Respondido el 11 de junio de 12 a las 11:06

public class ExampleView extends FrameLayout {

        ImageView mImage;

        public ExampleView(Context context) {
            super(context);
            init(context);
        }

        public void init(Context context) {
            View view = inflate(context, R.layout.my_view_layout,this);
            view.findViewById(R.id.image)
        }
}

Respondido 08 ago 17, 14:08

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.