好吧,假设有一个名为MainActivity的 Activity,并且有两个名为layout1和layout2 的布局,它们都有几个按钮。默认情况下MainActivity布局是layout1,如下所示:
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.layout1);
现在我实际上是通过单击layout1 中的一个按钮,第二个布局设置如下:
someBtn1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
setContentView(R.layout.layout2);
}
});
layout2 中有另一个按钮可以返回到layout1,如下所示:
someBtn2.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
setContentView(R.layout.layout1);
}
});
问题是当我回到layout1然后 someBtn1 的OnClickListener不起作用。看来我需要再次设置OnClickListener someBtn1的布局1。我如何编写代码以使它们与最佳实践完美配合?
最佳实践是使用片段而不是更改内容视图。
在您的代码中,带有布局的 setContentView 每次都会重新创建(膨胀)所有视图,因此在 someBtn2 单击侦听器中调用 setContentView(R.layout.layout1) 将创建一个没有关联侦听器的新按钮。
如果你不想使用片段,你可以这样做:
private View view1, view2; public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); view1 = getLayoutInflater().inflate(R.layout.layout1, null); view2 = getLayoutInflater().inflate(R.layout.layout2, null); setContentView(view1);
听众将是:
someBtn1.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { setContentView(view2); } }); someBtn2.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { setContentView(view1); } });