Android - 使用setContentView时,向Activity添加单独的组件

时间:2015-12-07 16:17:58

标签: android view

我创建了一个外部类NotesView,它扩展了View以便在我的MainActivity中实现。

此视图需要从MainActivity传递的信息,因此其构造函数采用Note对象的ArrayList。

public class NotesView extends View {

private ArrayList<Note> notes = new ArrayList<>();

public NotesView(Context context, ArrayList<Note> notes) {
    super(context);
    this.notes = notes;
}

在我的MainActivity中,我使用以下代码显示此视图:(尝试在布局的“设计”选项卡中添加CustomView不起作用,因为我无法提供ArrayList参数)

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    notesView = new NotesView(this, noteList);
    setContentView(notesView);
}

不幸的是,我现在无法通过布局的设计视图添加任何对象,我认为这是因为我使用了setContentView。我不希望以编程方式添加所有组件,有没有办法解决这个问题?

2 个答案:

答案 0 :(得分:1)

您可以向NotesView类添加setter函数:

public class NotesView extends View {

    private ArrayList<Note> notes;

    public NotesView(Context context) {
        super(context);
    }

    public void setNotes(ArrayList<Note> notes) {
        this.notes = notes;
    }
}

然后在主要活动中设置它:

NotesView notesView = (NotesView) findViewById(R.id.yourNotesView);
notesView.setNotes(noteList);

顺便提一下,我建议Spring compose annotations在你的布局中投射视图,而不需要详细的findViewByIds,声明,onXListeners等。

答案 1 :(得分:1)

调用setContentView会替换您的布局的整个视图。这意味着如果您拨打setContentView两次,则第一次通话中添加到屏幕上的内容将被覆盖且无法再访问。

您的问题有多个答案,这是务实的答案:

R.layout.activity_main内有什么?我们假设有一个FrameLayout / LinearLayout / RelativeLayout,ID为root

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    ViewGroup rootView = (ViewGroup) findViewById(R.id.root);
    notesView = new NotesView(this, noteList);
    rootView.addView(notesView);
}

另一种选择,如果您愿意,也可以将自定义视图设置为setter:

public class NotesView extends View {

private final List<Note> notes = new ArrayList<>();

public NotesView(Context context, AttributeSet attrs) {
    super(context, attrs);
}

public void replaceNotes(List<Note> notes) {
   this.notes.clear();
   this.notes.addAll(notes); 
}

然后,您可以在XML文件(R.layout.activity_main)中添加此视图并调用setter方法:

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    NotesView notesView = (NotesView) findViewById(R.id.notes);
    notesView.replaceNotes(noteList);
}