好吧,假设有一个名为的 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);
    }
});

07-28 12:41