android: 静态XML和动态加载XML混合使用,以及重写Layout控件

近期对android里面控件修改做了很多实验,由于公司需求很多,不得不重写很多控件。程序目标无非是:高效、轻巧、清晰、标准化

 

完成动态加载Layout有两种方法,依据个人喜好进行选择:

 

方法1:静态主Layout动态加载静态子Layout

 

首先构建子Layout:main2

[xhtml] view
plain
copy

  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <!--布局可以任意定义,此处拿线性布局举例,里面有2个按钮元素-->  
  3. <LinearLayout  xmlns:android="http://schemas.android.com/apk/res/android"  
  4.     android:id="@+id/menubar"   
  5.     android:background="@drawable/menubar"  
  6.     android:layout_width="wrap_content"   
  7.     android:layout_height="wrap_content">  
  8.         <!--按钮1-->  
  9.     <ImageButton android:id="@+id/button1"  
  10.         android:src="@drawable/btn1"  
  11.         android:layout_width="wrap_content"  
  12.         android:layout_height="wrap_content"  
  13.     ></ImageButton>  
  14.     <!--按钮2-->  
  15.     <ImageButton android:id="@+id/button2"  
  16.         android:src="@drawable/btn2"  
  17.         android:layout_width="wrap_content"  
  18.         android:layout_height="wrap_content"  
  19.     ></ImageButton>  
  20. </LinearLayout>  

 

然后构建主Layout:main

 

[xhtml] view
plain
copy

  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  3.     android:id="@+id/background"  
  4.     android:layout_width="fill_parent"  
  5.     android:layout_height="fill_parent"  
  6.     android:background="@drawable/background">  
  7.     <!--主Layout要给子Layout设置一个容器box,可以在此指定容器的位置,这段是关键部分-->  
  8.     <LinearLayout android:id="@+id/box"  
  9.         android:layout_alignParentBottom="true"  
  10.         android:layout_width="wrap_content"  
  11.         android:layout_height="wrap_content"  
  12.         android:layout_centerHorizontal="true">      
  13.     </LinearLayout>  
  14. </RelativeLayout>  

 

最后在程序中加载子layout:

[java] view
plain
copy

  1. public class BackgroundTest extends Activity {  
  2.     /** Called when the activity is first created. */  
  3. //      子Layout要以view的形式加入到主Layout中  
  4.     private View mBarView;  
  5. //      主Layout的容器加载子Layout的View  
  6.     private LinearLayout mLinearLayout;  
  7. //给出关键内容  
  8. public void onCreate(Bundle savedInstanceState) {  
  9.         super.onCreate(savedInstanceState);  
  10. //      显示主Layout  
  11.         setContentView(R.layout.main);   
  12. //      加载子Layout         
  13.         mBarView = View.inflate(this, R.layout.main2, null);  
  14. //      找到容器  
  15.         mLinearLayout = (LinearLayout)findViewById(R.id.box);  
  16. //      加上View 结束  
  17.         mLinearLayout.addView(mBarView);  
  18. }  

 

 

方法2:静态主Layout动态加载动态的Layout

首先构造你自己的子Layout和上面一样;

然后构建你自定义的Layout类:

[java] view
plain
copy

  1. public class MenuLandscapeLinearLayout extends LinearLayout{   
  2. //  构造函数  
  3.     public MenuLandscapeLinearLayout(Context context) {  
  4.     super(context);  
  5.     // TODO Auto-generated constructor stub  
  6.     //加载需要的属性,加载方法一的子Layout  
  7.     ((Activity) getContext()).getLayoutInflater().inflate(R.layout.main2, this);   
  8.         //在此你可以封装很多方法   
  9.     }     
  10. }  

最后在程序中动态实例化并加载即可:

[java] view
plain
copy

  1. public class BackgroundTest extends Activity {  
  2.     /** Called when the activity is first created. */  
  3.     private LinearLayout mLinearLayout;  
  4.     //声明一个子Layout View对象  
  5.     private MenuLandscapeLinearLayout mMenuLandscapeLinearLayout;  
  6.     @Override  
  7.     public void onCreate(Bundle savedInstanceState) {  
  8.         super.onCreate(savedInstanceState);  
  9. //      加载主Layout  
  10.         setContentView(R.layout.main);    
  11. //      找到容器        
  12.         mLinearLayout = (LinearLayout)findViewById(R.id.box);  
  13. //      实例化一个子View  
  14.         mMenuLandscapeLinearLayout=new MenuLandscapeLinearLayout(this);  
  15. //      添加到容器  
  16.         mLinearLayout.addView(mMenuLandscapeLinearLayout);  
  17.     }  
  18. }  

至此,完成了动态加载子Layout的两种形式,里面可思考的很多,比如封装常用事件、资源,从而节省代码、节省资源;

抛砖引玉,分享经验,希望能助大家优化自己的程序。

时间: 2024-09-20 17:25:19

android: 静态XML和动态加载XML混合使用,以及重写Layout控件的相关文章

从XML中动态加载菜单的示例

本文配套源码 这个案例是一个基于VS2005的WinForm菜单控件的例子,功能是从XML中动态加载菜单数据到MenuTrip控件上.这个案例中用到了XML,反射之类的技术.当然实用价值有限,仅供学习参考之用. 首先创建一个WinForm项目,在Form1上放置一个MenuTrip控件,将其命名为MainMenu. 在项目中添加一个XML文件,命名为Menu.xml,代码如下: MenuXml 1<?xml version="1.0" encoding="utf-8&q

Android开发中Listview动态加载数据的方法示例

本文实例讲述了Android开发中Listview动态加载数据的方法.分享给大家供大家参考,具体如下: 最近在研究网络数据加载的问题,比如我有几百,甚至上千条数据,这些数据如果一次性全部加载到arraylist,然后再加载到Listview中.我们必然会去单独开线程来做,这样造成的结果就是会出现等待时间很长,用户体验非常不好.我的想法是动态加载数据,第一次加载十条,然后往下面滑动的时候再追加十条,再往下面滑动的时候再去追加,这样大大减少了用户等待的时间,同时给处理数据留下了时间.网上看到了这样一

Android实现ListView数据动态加载的方法_Android

本文实例讲述了Android实现ListView数据动态加载的方法.分享给大家供大家参考,具体如下: list.setOnScrollListener(new OnScrollListener() { //添加滚动条滚到最底部,加载余下的元素 public void onScrollStateChanged(AbsListView view, int scrollState) { // if (scrollState == OnScrollListener.SCROLL_STATE_IDLE)

Android实现ListView数据动态加载的方法

本文实例讲述了Android实现ListView数据动态加载的方法.分享给大家供大家参考,具体如下: list.setOnScrollListener(new OnScrollListener() { //添加滚动条滚到最底部,加载余下的元素 public void onScrollStateChanged(AbsListView view, int scrollState) { // if (scrollState == OnScrollListener.SCROLL_STATE_IDLE)

c# winfrom项目,webbrower控件中加载页面过程中导致timer控件显示时间会停一小会

问题描述 c# winfrom项目,webbrower控件中加载页面过程中导致timer控件显示时间会停一小会 在C# Winfrom项目中,from窗体中,有一个webbrower控件用于加载网页,在webbrower控件内放了一个label控件(用于显示当前时间),还有一个timer控件(用于控制label显示时间,显示格式为:hh:mm:ss,). 目前遇到个问题,当webbrower控件用于加载数据量较大的网页时,在网页加载的过程中,会导致label控件显示时间中的秒时, 会停顿两至三秒

asp.net ext treepanel 动态加载XML的实现方法_实用技巧

解决办法:写一个aspx页面, 在aspx 页面只留下这一句  复制代码 代码如下: <%@ Page Language="C#" AutoEventWireup="true" CodeFile="Data.aspx.cs" Inherits="Data" %> cs文件如下: public partial class Data : System.Web.UI.Page { protected void Page_

掉掉注意了,如何动态加载用户控件(ascx)

动态|加载|控件 注: 本方法是我同事李强原创 步骤一: 把ascx控件拖入设计窗口,然后转入html模式,保留定义如果你需要多个ascx的话,请全部拖入.但是把相应的内容删除.(因为我们需要动态加载)在需要填入控件的地方,放个容器,比如td,并设定在服务器端运行如    <TD  id="tdpan" runat=server></TD> 2:动态调用UserControl myusercontrol = (UserControl) LoadControl (

Winform开发客户关系管理系统(CRM)总结 4 Tab控件页面的动态加载

在前面介绍的几篇关于CRM系统的开发随笔中,里面都整合了多个页面的功能,包括多文档界面,以 及客户相关信息的页面展示,这个模块就是利用DevExpress控件的XtraTabPage控件的动态加载实现的, 本篇文章主要介绍两种方式的动态加载,一个是对用户控件(UserControl)模块的动态加载,一个是对 普通窗体(Form)的动态加载,通过这两种方式,我们有时候可以动态实现很丰富的界面效果. 1.用户控件(UserControl)模块在Tab控件中的动态加载 参考了很多CRM的系统,一般都是

asp.net动态加载ascx用户控件

原文:asp.net动态加载ascx用户控件 在主aspx/ascx文件中,将目标ascx1,ascx2控件拖拉到其页面中,然后删除,目的是要生成:Register 代码,然后在主文件中定义DIV或Td之类的,设置ID ,runat="server",接下来LoadControl("ascx1")   <%@ Control Language="C#" AutoEventWireup="true" CodeFile=&q