我创建了一个外部类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。我不希望以编程方式添加所有组件,有没有办法解决这个问题?
答案 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);
}