如何在Android中的视图(View)中加载XML文件?

6
我有一个扩展View的类。我还有一个扩展Activity的类,我希望将第一个类添加到加载在Activity类中。 我尝试了以下代码。
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);     
    }   
}

我只想将自定义视图加载到扩展Activity的类中扩展View的类中。 - James
2个回答

19

我试过这个方法,但意识到它不起作用。问题在于View类没有添加子视图的方法。子视图只能添加到ViewGroups中。像LinearLayout这样的布局会继承ViewGroup而不是View。所以,你需要扩展LinearLayout而不是View。

然后,在您的XML中,使用以下代码引用布局:

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

然后在您的自定义类中,进行布局填充并添加:

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);

    }
}

1
嗯...有些东西可以简化一下。initComponent(Context context) 只需要包含:inflate(context, R.layout.foobar, this); 效果是一样的。 - TuomasR
4
你可以编辑自己的回答以改进它们。将其添加为评论意味着每个阅读此答案的人都可能会错过它。 - ataulm

-1
建议:避免将类名命名得与已有的类名非常相似(例如View、Activity);
由于您正在扩展View(默认情况下不会绘制任何特定内容),因此您无法在活动中看到任何内容。
首先扩展TextView对象以获得感觉。
public class MyTextView extends TextView {
    public MyTextView(Context c){
    super(c);
}

// ----

public class MyActivity extends Activity {

    MyTextView myTextView;

     @Override 
     protected void onCreate(Bundle savedInstance){
     super.onCreate(savedInstance);
     setContentView(myTextView = new MyTextView(this);

     myTextView.setText("It works!");
}

希望这能帮到你!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接