James
James

Reputation: 14091

How to load an XML inside a View in android?

I am having a class that extends View. I have another class that extends activity and I want to add the first class to be loaded inside the activity class. I tried the following code

package Test2.pack;

import android.app.Activity;
import android.content.Context;
import android.os.Bundle;
import android.view.View;

public class Test2 extends Activity {
    /** Called when the activity is first created. */

    static view v;
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);        

        try{
            v = (view) View.inflate(Test2.this, R.layout.main2, null);
        }catch(Exception e){
            System.out.println(" ERR " + e.getMessage()+e.toString());
        }       
    }
}

class view extends View{
    public view(Context context) {
        super(context);     
    }   
}

Upvotes: 6

Views: 14542

Answers (1)

TuomasR
TuomasR

Reputation: 2316

Ok tried this, and realized that it doesn't work. The problem is, that the View class does not have methods for adding child views. Child views should only be added to ViewGroups. Layouts, such as LinearLayout, extend ViewGroup. So instead of extending View, you need to extend for example LinearLayout.

Then, in your XML, reference to the layout with:

<my.package.MyView
    android:id="@+id/CompId"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"/>

Then in your custom class, inflate and add:

public class MyView extends LinearLayout {

    public MyView(Context context) {
        super(context);
        this.initComponent(context);
    }

    public MyView(Context context, AttributeSet attrs) {
        super(context, attrs);
        this.initComponent(context);
    }


    private void initComponent(Context context) {

         LayoutInflater inflater = LayoutInflater.from(context);
         View v = inflater.inflate(R.layout.foobar, null, false);
         this.addView(v);

    }
}

Upvotes: 19

Related Questions