`
mintelong
  • 浏览: 392197 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

android框架设计

阅读更多
这是对框架设计应用的一个小的总结
package com.misoo.ex01;
import android.app.Activity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;


public class ex01 extends Activity {


public static final int ADD_ID = Menu.FIRST;


public static final int DELETE_ID = Menu.FIRST + 1;


public static final int EXIT_ID = Menu.FIRST + 2;




@Override public void onCreate(Bundle icicle) {


super.onCreate(icicle);


setContentView(R.layout.main); }




@Override public boolean onCreateOptionsMenu(Menu menu) {


super.onCreateOptionsMenu(menu);


menu.add(0, ADD_ID, 0, R.string.menu_add);


menu.add(0, DELETE_ID, 1, R.string.menu_delete);


menu.add(0, EXIT_ID, 2, R.string.menu_exit);


return true; }




@Override public boolean onOptionsItemSelected(MenuItem item) {


switch (item.getItemId()) {


case ADD_ID: setTitle("Insert..."); break;


case DELETE_ID: setTitle("Delete..."); break;


case EXIT_ID: finish(); break;


}


return super.onOptionsItemSelected(item);


}}




说明:


1、一开始,框架反向呼叫onCreate()函数,也呼叫onCreateOptionsMenu()函数


2、当你选取<Add Item>选项时,框架会反向呼叫onOptionsItemSelected()函数


在我们修改了/res/values/strings.xml内容之后,记住要存档,因为这样可以更新R.java的内容,让menu.add()指令能找到所要的字符串。
1、R.java是连接*.java的程序码档案和*.xml布局档案的中介桥梁。
2、在.xml档案中,Eclipse根据其内的内容而自动产生一个R类别,作为应用程序设计者,并不需要去修改它。
3、当这些.xml档案有更新时,Eclipse就会在你确认并将*.xml存档时,自动更新它。
4、更加方便地去管理资源。
下面来介绍如何呈现按钮
首先来看看构建按钮的一般的步骤:
package com.misoo.ex02;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
public class ex02 extends Activity implements OnClickListener {
@Override public void onCreate(Bundle icicle) {
super.onCreate(icicle);
setContentView(R.layout.main);
Button btn = (Button)findViewById(R.id.button);
Button btn2 = (Button)findViewById(R.id.button2);
btn.setOnClickListener(this);
btn2.setOnClickListener(this);
}
public void onClick(View arg0) {
switch (arg0.getId()) {
case R.id.button:
setTitle("this is OK button");
break;
case R.id.button2:
this.finish();
break;
}
}}

下面是对应的.xml文件:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<TextView android:id="@+id/tv"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text=""
/>
<Button android:id="@+id/button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="OK"
/>
<Button android:id="@+id/button2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Exit"
/>
</LinearLayout>

说明:Button btn=(Button)findViewById(R.id.button);找出目前的布局里的按钮参考,并存放人btn内。
指令btn.setOnClickListener(this)设定按钮事件的处理程式,应额外事件监听者。当使用者按下id值为id/button的按钮时,框架必须把事件准确地传送到恰当的类别,并呼叫所指定的函数。其中的参数:this就表示此按钮事件必须传送到本地类别的物件,也就是目前物件。
当然,还可以创建出带有背景的按钮,对应的类别为ImageButton.

下面介绍如何进行书面的布局
1、像按钮这种屏幕控制项,在Android中,则通讲为View,其中,像Button是最小单元的View,多个小的View可以构成一个集合类型的View。
2、多个View能组合在一起,就会各种排列方式,即讲布局Layout.
3、最基本的布局为:垂直和水平排列
import android.graphics.Color;


import android.graphics.drawable.Drawable;


import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.ImageButton;
import android.widget.LinearLayout;

public class ex04 extends Activity {
private final int WC = LinearLayout.LayoutParams.WRAP_CONTENT;


@Override public void onCreate(Bundle icicle) {


super.onCreate(icicle);




//下面这两条指令诞生一个LinearLayout的集合型的View物件,并且设定为垂直类型布局


LinearLayout layout = new LinearLayout(this);


layout.setOrientation(LinearLayout.VERTICAL);




ImageButton btn = new ImageButton(this);


Drawable dw = this.getResources().getDrawable(R.drawable.ok); //Drawable类型??
btn.setImageDrawable(dw); //设置btn的图像为dw.
btn.setOnClickListener(listener);
//下面的指令诞生一个LayoutParams物件,并且把WC参数存入该物件里,此参数说明了我们希
望这个按钮的长宽大小
LinearLayout.LayoutParams param =new LinearLayout.LayoutParams(WC, WC);
layout.addView(btn, param);
ImageButton btn2 = new ImageButton(this);
dw = this.getResources().getDrawable(R.drawable.exit);
btn2.setImageDrawable(dw);
btn2.setOnClickListener(listener2);
layout.addView(btn2, param); //将ImageButton或是Button物件加入到layout里成为一组
LinearLayout out_layout = new LinearLayout(this);
out_layout.setOrientation(LinearLayout.HORIZONTAL);
Button btn3 = new Button(this);
btn3.setText("Cancel");
btn3.setTextColor(Color.WHITE);
btn3.setBackgroundColor(Color.RED);
btn3.setOnClickListener(listener3);

out_layout.addView(layout, param);
LinearLayout.LayoutParams param2 =new LinearLayout.LayoutParams(WC, WC);
param2.topMargin = 30;
out_layout.addView(btn3, param2);
setContentView(out_layout);
}

OnClickListener listener = new OnClickListener(){
public void onClick(View v)
{ setTitle("this is OK button"); }
};
OnClickListener listener2 = new OnClickListener() {
public void onClick(View v)
{ finish(); }
};

OnClickListener listener3 = new OnClickListener() {
public void onClick(View v)
{ setTitle("this is Cancel button"); }
};
}

下面介绍如何呈现List选单
这个程式展现了MVC的基本架构
Activity 对应着的是Controller
ListView 对应着的是View
DataModel对应着的是Model
import android.app.Activity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
public class ex05 extends Activity implements OnItemClickListener {
public static final int RELOAD_ID = Menu.FIRST;
public static final int EXIT_ID = Menu.FIRST + 1;
ListView lv;
ArrayAdapter<String> adapter;   //声明一个泛型adapter
DataModel dm; //声明一个数据模型dm
@Override public void onCreate(Bundle icicle) {
super.onCreate(icicle);
dm = new DataModel(); //创建一个模型
lv = new ListView(this);   //创建一个列表视图
adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, dm.loadData());

//这诞生一个ArrayAdapter的物件,并呼叫dm.loadData()函数取得选单所需要的内容,存入此新的物件里。


lv.setAdapter(adapter); //向adapter物件取得选单内容


lv.setOnItemClickListener(this);   //设定ListView选单时间的处理程式,又称为事件监听者。
setContentView(lv);

}
public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3)  //这是列表视图操作所响应的事
{
setTitle("choice: " + String.valueOf(dm.getPrice(arg2)));
}
@Override public boolean onCreateOptionsMenu(Menu menu)  //这个操作是用来进行菜单的选项的设计的


{


super.onCreateOptionsMenu(menu);  //对于菜单的设计,在使用onCreateOptionMenu时,都需要这个操作,即让父类来实现绘画功能
menu.add(0, RELOAD_ID, 0, "Reload");  //添加菜单选项
MenuItem im = menu.findItem(RELOAD_ID);   //
im.setIcon(R.drawable.reload_im);
menu.add(0, EXIT_ID, 1, "Exit");
im = menu.findItem(EXIT_ID);
im.setIcon(R.drawable.exit_im);
return true;


}


@Override public boolean onOptionsItemSelected(MenuItem item) //这个选项是在选择菜单时所产生的动作
{
switch (item.getItemId()) {
case RELOAD_ID:  //如果选择的是第一个菜单,那么就执行下面的这个功能
adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, dm.loadData());
lv.setAdapter(adapter);

break;
case EXIT_ID:   //如果选择的是第二个菜单,那么就执行退出操作
finish();
break;


}


return super.onOptionsItemSelected(item);


}


}

public class DataModel {


private String[]data, xdata;


private double[] price;


private boolean k = true;


public DataModel()


{


data = new String[3];


data[0] = "Item-1";


data[1] = "Item-2";


data[2] = "Item-3";


xdata = new String[3];


xdata[0] = "Prod-x";


xdata[1] = "Prod-y";


xdata[2] = "Prod-z";


price = new double[3];


price[0] = 305.5;


price[1] = 56.75;


price[2] = 100.25;


}


public String[] loadData() {


k = !k;


if(k)


return xdata;


else


return data;


}


public double getPrice(int i)


{


return price[i];


}


}






下面同样是ListView多对应的功能


package com.misoo.ex06;


import java.util.ArrayList;


import java.util.Map;


import android.app.Activity;


import android.graphics.Color;


import android.os.Bundle;


import android.view.View;


import android.widget.AdapterView;


import android.widget.ListView;


import android.widget.SimpleAdapter;


import android.widget.TextView;


import android.widget.AdapterView.OnItemClickListener;




public class ex06 extends Activity {


private ListView lv;


private TextView tv;


private DataModel dm;


private ArrayList<Map<String, Object>> coll;


@Override


public void onCreate(Bundle icicle) {


super.onCreate(icicle);


dm = new DataModel();


setContentView(R.layout.list);


lv = (ListView)findViewById(R.id.list);


lv.setOnItemClickListener(listener);


tv = (TextView)findViewById(R.id.text);



//下面的dm.loadData()呼叫DataModel的loadData()函数将xml字符串或者是表格资料加入到ArrayList<Map<String,Object>>的集合物件中。


coll = dm.loadData();


//下面的指令将coll集合物件的资料传给SimpleAdapter物件,SimpleAdapter物件依据参数的


指定来从coll取出资料,并设定显示的树形等等。


SimpleAdapter adapter = new SimpleAdapter(this, coll,android.R.layout.simple_list_item_1, new String[] { "prod_na" },new int[] {android.R.id.text1});


lv.setAdapter(adapter); //将SimpleAdapter物件传送给ListView物件,立即更新了书面上List选单的内容.


}


OnItemClickListener listener = new OnItemClickListener() {


public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3)


{


tv.setTextColor(Color.YELLOW);


tv.setText(coll.get(arg2).get("prod_type").toString());


}


};


}








import java.util.ArrayList;


import java.util.HashMap;


import java.util.Map;


public class DataModel {


public DataModel() {}


public ArrayList<Map<String, Object>> loadData() {


ArrayList<Map<String, Object>> coll= new ArrayList<Map<String, Object>>();


Map<String, Object> item;


item = new HashMap<String, Object>();


item.put("prod_na", "Linux");


item.put("prod_type", "ST");


coll.add(item);


item = new HashMap<String, Object>();


item.put("prod_na", "Windows");


item.put("prod_type", "Mobile");


coll.add(item);


return coll;


}


}




<?xml version="1.0" encoding="utf-8"?>


<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"


android:orientation="vertical"


android:layout_width="fill_parent"


android:layout_height="fill_parent"


>


<TextView android:id="@+id/text"


android:layout_width="wrap_content"


android:layout_height="wrap_content"


android:text="Hello World, ex06"


/>


<ListView android:id="@+id/list"


android:layout_width="wrap_content"


android:layout_height="wrap_content"


/>


</LinearLayout>




下面介绍如何使用相对布局Relative Layout


分析下面的这段代码:


import android.app.Activity;


import android.content.Context;


import android.os.Bundle;


import android.view.View;


import android.view.ViewGroup;


import android.view.LayoutInflater;


import android.view.View.OnClickListener;


import android.widget.AdapterView;


import android.widget.ArrayAdapter;


import android.widget.Button;


import android.widget.LinearLayout;


import android.widget.ListView;


import android.widget.RelativeLayout;


import android.widget.TextView;


import android.widget.AdapterView.OnItemClickListener;


public class ex07 extends Activity implements OnItemClickListener {


private final int WC = ViewGroup.LayoutParams.WRAP_CONTENT;


private String[] data = {" Item-1 ", " Item-2 ", " Item-3 "};


private TextView tv;


private String selection = "****";


private ArrayAdapter<String> adapter;


private boolean[] status = {false, false, false };


@Override


public void onCreate(Bundle icicle) {


super.onCreate(icicle);


//这诞生了一个相对布局物件,并设定为此Activity的起始书面布局


RelativeLayout r_layout = new RelativeLayout(this); 


setContentView(r_layout);


//取得一个系统的LAYOUT_INFLATE_SERVICE服务的物件,取名为inflate


LayoutInflater inflate = (LayoutInflater)


getSystemService(Context.LAYOUT_INFLATER_SERVICE);


LinearLayout layout = (LinearLayout)inflate.inflate(R.layout.list, null);


RelativeLayout.LayoutParams param


= new RelativeLayout.LayoutParams(175, WC);


layout.setId(1);


r_layout.addView(layout, param);


tv = (TextView)layout.findViewById(R.id.text);


ListView lv = (ListView)layout.findViewById(R.id.list);


lv.setBackgroundResource(R.drawable.bk_red);


adapter = new ArrayAdapter<String>


(this, android.R.layout.simple_list_item_multiple_choice, data);


lv.setAdapter(adapter); lv.setItemsCanFocus(false);


lv.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);


lv.setOnItemClickListener( this);


Button btn1 = new Button(this);


btn1.setBackgroundResource(R.drawable.bk_ok_exit);


btn1.setId(2); btn1.setText("OK"); btn1.setOnClickListener(listener);


param = new RelativeLayout.LayoutParams(60, WC);


param.addRule(RelativeLayout.RIGHT_OF, 1);


param.leftMargin = 15; param.topMargin = 20;


r_layout.addView(btn1, param);


Button btn2 = new Button(this);


btn2.setBackgroundResource(R.drawable.bk_ok_exit);


btn2.setId(3); btn2.setText("Exit"); btn2.setOnClickListener(listener);


param = new RelativeLayout.LayoutParams(60, WC);


param.addRule(RelativeLayout.BELOW, 2);


param.addRule(RelativeLayout.ALIGN_LEFT, 2);


param.topMargin = 25;


r_layout.addView(btn2, param);


}


OnClickListener listener = new OnClickListener() {


public void onClick(View v) {


if(v.getId() == 2){


String ss = "{";


for(int i=0; i< adapter.getCount(); i++){


if(status[i])


{


ss += data[i]; ss += " ";


}


}


ss += "}";


setTitle(ss);


}


else if(v.getId() == 3)


finish();


}};


public void onItemClick(AdapterView<?> arg0, View v, int idx, long arg3)


{


status[idx] = ! status[idx];


}


}


<?xml version="1.0" encoding="utf-8"?>


<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"


android:orientation="vertical"


android:layout_width="fill_parent"


android:layout_height="fill_parent" >


<TextView android:id="@+id/text"


android:layout_width="wrap_content"


android:layout_height="wrap_content"


android:text="Hello World, ex07" />


<ListView android:id="@+id/list"


android:layout_width="wrap_content"


android:layout_height="wrap_content" />


</LinearLayout>



package com.misoo.ex07;


import android.app.Activity;


import android.content.Context;


import android.os.Bundle;


import android.view.View;


import android.view.ViewGroup;


import android.view.LayoutInflater;


import android.view.View.OnClickListener;


import android.widget.AdapterView;


import android.widget.ArrayAdapter;


import android.widget.Button;


import android.widget.LinearLayout;


import android.widget.ListView;


import android.widget.RelativeLayout;


import android.widget.TextView;


import android.widget.AdapterView.OnItemClickListener;


//此程序是采用相对布局方式。所谓的相对是指定我们叙述一个组件的位置时,会以其中的另外一个组件为基准。


public class ex07 extends Activity implements OnItemClickListener {


/** Called when the activity is first created. */


private final int WC = ViewGroup.LayoutParams.WRAP_CONTENT;


private String[] data = {"Item-1", "Item-2", "Item-3"};


private TextView tv;


private String selection = "****";



@Override


public void onCreate(Bundle icicle) {


super.onCreate(icicle);


//下面代码诞生了一个相对布局物件,并设定为此Activity的起始书面布局


RelativeLayout r_layout = new RelativeLayout(this);


setContentView(r_layout);


//下面代码取得一个系统的LAYOUT_INFLATE_SERVICE服务的物件,取名为inflate,但是为什么要获得系统服务呢?


LayoutInflater inflate = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);


//下面指令呼叫inflate物件的inflate()函数依据/res/layout/list.xml之定义而诞生一个LinearLayout物件


LinearLayout layout = (LinearLayout)inflate.inflate(R.layout.list, null);


//这诞生一个RelativeLayout的参数物件,透过参数物件来设置此layout集合布局的宽度为120点,而高则视其内容而定。


RelativeLayout.LayoutParams param


= new RelativeLayout.LayoutParams(120, WC);


layout.setId(1); //


r_layout.addView(layout, param);


//下面两句代码分别找出layout里面的两个小View,并由tv和lv分别参考之


tv = (TextView)layout.findViewById(R.id.text);


ListView lv = (ListView)layout.findViewById(R.id.list);


//下面这句代码从data[]阵列取出资料,并交给lv物件,将显示于书面的List选单里


ArrayAdapter<String> adapter = new ArrayAdapter<String>


(this, android.R.layout.simple_list_item_1, data);


lv.setAdapter(adapter);


lv.setOnItemClickListener(this);


//------------------------------------------------------


Button btn1 = new Button(this);


btn1.setId(2);


btn1.setText("OK");


btn1.setOnClickListener(listener);


param = new RelativeLayout.LayoutParams(60, WC);


param.addRule(RelativeLayout.RIGHT_OF, 1);


param.leftMargin = 15;


param.topMargin = 20;


r_layout.addView(btn1, param);


//------------------------------------------------------


Button btn2 = new Button(this);


btn2.setId(3);


btn2.setText("Exit");


btn2.setOnClickListener(listener);


param = new RelativeLayout.LayoutParams(60, WC);


param.addRule(RelativeLayout.BELOW, 2);


param.addRule(RelativeLayout.ALIGN_LEFT, 2);


param.topMargin = 25;


r_layout.addView(btn2, param);


}



OnClickListener listener = new OnClickListener()


{


public void onClick(View v) {


if(v.getId() == 2)


tv.setText(selection);


else if(v.getId() == 3)


finish();


}


};


public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) {


// TODO Auto-generated method stub


setTitle(data[arg2]);


selection = data[arg2];


}



}


package com.misoo.ex08;


import android.app.Activity;


import android.os.Bundle;


import android.widget.Button;


import android.widget.ImageView;


import android.widget.RelativeLayout;


import android.widget.EditText;


import android.widget.TableLayout;


import android.widget.TableRow;


import android.view.View;


import android.view.ViewGroup;


import android.view.View.OnClickListener;




public class ex08 extends Activity implements OnClickListener {


private final int WC = ViewGroup.LayoutParams.WRAP_CONTENT;



@Override public void onCreate(Bundle icicle) {


super.onCreate(icicle);


//根据下面所说的嵌套层次,首先是定义最大的view,并设定为目前布局(this值)


RelativeLayout r_layout = new RelativeLayout(this);


setContentView(r_layout);


//当书面上的一群view排成一个矩阵或者是表格形式时,就采用TableLayout来叙述其布局方式。


//接着定义第二个的TableLayout,并加入到r_layout里


TableLayout tableLayout = new TableLayout(this);


r_layout.addView(tableLayout, new RelativeLayout.LayoutParams(WC, WC));


tableLayout.setId(1);


//此程序采用的嵌套层次为:RelativeLayout->TableLayout->TableRow->EditText->Button->ImageView


//再定义第三个的TableRow,并加入到tableLayout里


TableRow tableRow1 = new TableRow(this);


tableLayout.addView(tableRow1, new TableLayout.LayoutParams(WC, WC));


//最后定义最小的view,并加入到tableRow里


ImageView iv = new ImageView(this);


tableRow1.addView(iv);


iv.setImageDrawable(getResources().getDrawable(R.drawable.star_big_on));


EditText edit1 = new EditText(this);


tableRow1.addView(edit1);




//-------------------------------------------------


TableRow tableRow2 = new TableRow(this);


tableLayout.addView(tableRow2, new TableLayout.LayoutParams(WC, WC));


ImageView iv2 = new ImageView(this);


iv2.setImageDrawable(getResources().getDrawable(R.drawable.gallery_photo_4));


tableRow2.addView(iv2);


EditText edit2 = new EditText(this);


tableRow2.addView(edit2);


//-------------------------------------------------


Button btn = new Button(this);


RelativeLayout.LayoutParams param = new RelativeLayout.LayoutParams(WC, WC);


param.addRule(RelativeLayout.BELOW, 1);


param.topMargin = 20;


r_layout.addView(btn, param);


btn.setText("Exit");


btn.setOnClickListener(this);


}


public void onClick(View arg0) {


// TODO Auto-generated method stub


finish();


}



}



分享到:
评论
1 楼 lalaeye 2014-02-11  
学习一下,明天再看。

相关推荐

Global site tag (gtag.js) - Google Analytics