Android:动态加载布局 - 文件

时间:2012-09-07 01:00:23

标签: android xml layout dynamic

我对Android有疑问。 假设我们有我们的主xml布局文件,并通过使用(例如)FrameLayout来定义占位符。还假设我们有2个其他xml布局文件显示任何内容。 所以我想做的是动态地和编程地将两个布局中的一个注入到占位符中。我知道存在Activitis,Fragments,ViewFlipper等概念。但是我觉得做这样的事情很舒服:

public class MainActivity extends Activity {

private FrameLayout placeHolder;
private View view1;
private View view2;


private RelativeLayout canvasPlaceHolder;
private PuzzleCanvas canvas;
private TextView infoLabel;


@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    // init gui
    setContentView(R.layout.activity_main);

    // Load layouts from xml
    LayoutInflater factory = getLayoutInflater();
    view1 = factory.inflate(R.layout.view1, null);
    view2 = factory.inflate(R.layout.view2, null);

}
}

例如,屏幕上的按钮可以执行以下操作:

@Override
public void onClick(View v) {
    placeHolder.removeView(view1);
    placeHolder.addView(view2);
}

例如,显示loadingAnimation(view2)而不是普通内容(view1),因此我可以在xml中定义两个视图舒适且独立。

LayoutInflater的使用是否值得称道?性能和内存管理怎么样?你怎么看待这件事?这是Android中常见的方式吗?

2 个答案:

答案 0 :(得分:1)

在xml的框架布局上使用'include'标签,将xml包含在主xml中。你所要做的就是根据你的应用程序逻辑通过java切换'VISIBILITY'。  例如:在听众身上,设置:

public void onClick(View v) {          
    innerView1.setVisibilty(View.INVISIBLE); 
    innerView2. setVisibilty(View.VISIBLE);  
}

答案 1 :(得分:1)

  

//从xml加载布局       LayoutInflater factory = getLayoutInflater();

view1 = factory.inflate(R.layout.view1, null);
view2 = factory.inflate(R.layout.view2, null);

使用LayoutInflater是可以的,但我建议不要在onCreate中直接执行此操作,如果布局非常复杂,可能会导致ANR(绘制布局超过5秒)。由于这两个视图仅在用户反应后出现,我更喜欢使用带处理程序的sendEmptyMessage。

onCreate(...){
    handler.sendEmptyMessage(1);
}

private Handler handler = new Handler(){
    @Override
    public void handleMessage(final Message msgs) {
        if(msgs.what == 1){
            view1 = factory.inflate(R.layout.view1, null);
            view2 = factory.inflate(R.layout.view2, null);
        }
    }
}