如何在android中动态设置布局
好吧,假设有一个名为 MainActivity 的 Activity,并且有两个名为 layout1 和 layout2 的布局,它们都有几个按钮.默认情况下,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 不起作用.看来我需要为 layout1 的 someBtn1 再次设置 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);
}
});