好吧,假设有一个名为的 Activity MainActivity ,并且有两种布局称为 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 时,然后的OnClickListener someBtn1 无法正常工作。看来我需要再次为 layout1 的 someBtn1 设置OnClickListener。
我如何编写代码以使其与最佳实践完美配合?
最佳答案
最佳做法是使用片段而不是更改内容 View 。
在您的代码中,具有布局的setContentView每次都会重新创建(填充)所有 View ,因此someBtn2 click监听器中的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);
}
});