如何在android中动态设置布局

问题描述:

好吧,假设有一个名为 MainActivity 的 Activity,并且有两个名为 layout1layout2 的布局,它们都有几个按钮.默认情况下,MainActivity 布局是 layout1,如下所示:

Well, Suppose there is an Activity called MainActivity and there are two layouts called layout1 and layout2 both have few buttons. By default MainActivity layout is layout1 like following:

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.layout1);

现在我实际上是通过单击 layout1 中的按钮来设置第二个布局,如下所示:

Now what I did actually is by clicking a button in layout1 the second layout is set like following:

    someBtn1.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            setContentView(R.layout.layout2);
        }
    });

layout2 中还有一个按钮可以返回layout1,如下所示:

There are another button in layout2 to return back to layout1 like following:

    someBtn2.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            setContentView(R.layout.layout1);
        }
    });

问题是当我回到 layout1 然后 someBtn1 的 OnClickListener 不起作用.看来我需要为 layout1someBtn1 再次设置 OnClickListener.我如何编写代码以使它们与最佳实践完美配合?

Problem is when I returned back to layout1 then OnClickListener of someBtn1 is not working. It seems I need to set OnClickListener again for someBtn1 of layout1. How I can write code to make them work perfectly with best practices ?

最佳实践是使用片段而不是更改内容视图.

在您的代码中,带有布局的 setContentView 每次都会重新创建(膨胀)您的所有视图,因此在 someBtn2 单击侦听器中调用 setContentView(R.layout.layout1) 将创建一个没有关联侦听器的新按钮.

In your code, setContentView with layouts recreate (inflate) all your views every time, so the call setContentView(R.layout.layout1) in someBtn2 click listener will create a new button without the associated listener.

如果你不想使用片段,你可以这样做:

If you don't want to use fragments you can do this:

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);
    }
});