Android切近实战(七)

边看世界杯,边写博客。记得小时候,去山上玩,翻了两座山,到了一个叫克劳的地方。那里每到六月份,桃子,杏多的很,有时候你坐在树上吃一下午都不会有人来,自然了,那里也就人烟稀少。我当时渴急了,在玉米地边上的牛踩出的蹄窝里喝了一口水,那水真是甘甜哪,忽然觉得脚底下什么在动,抬脚一看,一只螃蟹被我踩到了泥土中。那时候吃野枣,自制枪打野鸡,用套套野兔,在河里捉螃蟹,钓鱼,在洪水中游泳,上山挖药,在山上烤红薯,烤玉米,到了冬天,可以点荒,一盒火柴去见识燎原,这都是经常的事。不知道现在我再去那地方还能不能可以去做这些事情,下周准备回去玩玩,看这些地方是否依然还是那么美丽。

OK,今天我们来看一下如下这个消息管理界面

先上图,看一下android版本的,先登录,登陆界面美化之后还像这么回事

我们看一下短消息管理界面

在这里我们还是要首先看一下WebService端

public class MessageMng : System.Web.Services.WebService
    {
        [WebMethod]
        public List<MessageEntity> GetMessageEntity(string sendUser, string receiveUser, string title, string messageType, string startDate, string endDate)
        {
            try
            {
                return MessageMngBiz.GetInstance().GetMessageEntity(sendUser, receiveUser, title, messageType, startDate, endDate);
            }
            catch
            {
                return new List<MessageEntity>();
            }

        }
    }

我们再看一下Biz层

public class MessageMngBiz
    {
        static MessageMngBiz messageMngBiz = new MessageMngBiz();
        private MessageMngBiz()
        { }

        public static MessageMngBiz GetInstance()
        {
            return messageMngBiz;
        }

        public List<MessageEntity> GetMessageEntity(string sendUser, string receiveUser, string title, string messageType, string startDateStr, string endDateStr)
        {
            DateTime startDate = DateTime.MinValue;
            DateTime endDate = DateTime.MinValue;
            if (!string.IsNullOrWhiteSpace(startDateStr))
            {
                DateTime.TryParse(startDateStr.Trim(), out startDate);
            }

            if (!string.IsNullOrWhiteSpace(endDateStr))
            {
                DateTime.TryParse(endDateStr.Trim(), out endDate);
            }

            return MessageMngDAL.GetInstance().GetMessageEntity(sendUser, receiveUser, title, messageType, startDate == DateTime.MinValue ? null : (DateTime?)startDate, endDate == DateTime.MinValue ? null : (DateTime?)endDate);
        }
    }

再看一下DAL

 public class MessageMngDAL
    {
        static MessageMngDAL messageMngDAL = new MessageMngDAL();
        private MessageMngDAL()
        { }

        public static MessageMngDAL GetInstance()
        {
            return messageMngDAL;
        }

        /// <summary>
        ///获取短信息
        /// </summary>
        /// <param name="sendUser">发送者</param>
        /// <param name="receiveUser">接收者</param>
        /// <param name="title">标题</param>
        /// <param name="messageType">类型(未读/已读,已删)</param>
        /// <param name="startDate">开始时间</param>
        /// <param name="endDate">结束时间</param>
        /// <returns></returns>
        public List<MessageEntity> GetMessageEntity(string sendUser, string receiveUser, string title, string messageType, DateTime? startDate, DateTime? endDate)
        {
            bool isDateSearch = startDate.HasValue && endDate.HasValue;

            DirectSpecification<Message> commonSpecification = new DirectSpecification<Message>(msg =>
              (string.IsNullOrEmpty(sendUser) ? true : msg.CerateUser == sendUser)
              && (string.IsNullOrEmpty(title) ? true : msg.Title.Contains(title))
              && (isDateSearch ? (msg.CreateDate >= startDate && msg.CreateDate <= endDate) : true)
              && msg.ReceiveUser.Equals(receiveUser));

            MessageType messageTypeEnum = new MessageTypeIndexes()[messageType];

            using (BonusEntities bonusEntities = new BonusEntities())
            {
                if (messageTypeEnum == MessageType.READ)
                {
                    DirectSpecification<Message> readMsgSpec = new DirectSpecification<Message>(msg => msg.IsDel == false);
                    AndSpecification<Message> andSpecification = new AndSpecification<Message>(commonSpecification, readMsgSpec);

                    IEnumerable<Message> messageList = bonusEntities.Message.Where(andSpecification.SatisfiedBy());

                    return messageList.AsEnumerable().Select(msg =>
                    new MessageEntity()
                    {
                        TransactionNumber = msg.TransactionNumber,
                        Title = msg.Title,
                        MessageContent = msg.MessageContent.Length>50? msg.MessageContent.Substring(0, 50):msg.MessageContent,
                        CreateUser = msg.UserCreate.UerInfo != null ? msg.UserCreate.UerInfo.FirstOrDefault().Name : msg.UserCreate.UseNo,
                        CreateDate = msg.CreateDate.ToString(),
                        IsRead = msg.IsRead
                    }).ToList();
                }

                if (messageTypeEnum == MessageType.DELETE)
                {
                    DirectSpecification<Message> delMsgSpec = new DirectSpecification<Message>(msg => msg.IsDel == true
                    && msg.IsDestroy == false);
                    AndSpecification<Message> andSpecification = new AndSpecification<Message>(commonSpecification, delMsgSpec);

                    IQueryable<Message> messageList = bonusEntities.Message.Where(andSpecification.SatisfiedBy());

                    return messageList.AsEnumerable().Select(msg =>
                    new MessageEntity()
                    {
                        TransactionNumber = msg.TransactionNumber,
                        Title = msg.Title,
                        MessageContent = msg.MessageContent.Substring(0, 50),
                        CreateUser = msg.UserCreate.UerInfo != null ? msg.UserCreate.UerInfo.FirstOrDefault().Name : msg.UserCreate.UseNo,
                        CreateDate = msg.CreateDate.ToString(),
                        DelDate = msg.DelDate.HasValue? msg.DelDate.ToString():string.Empty
                    }).ToList();
                }

                return new List<MessageEntity>();
            }
        }
    }

    public enum MessageType
    {
        READ = 1,
        DELETE = 2
    }

    public class MessageTypeIndexes
    {
        public Array MessageTypeEnumArray
        {
            get
            {
                return Enum.GetValues(typeof(MessageType));
            }
        }

        public MessageType this[string msgType]
        {
            get
            {
                int messageType = int.Parse(msgType);
                return (MessageType)MessageTypeEnumArray.GetValue(--messageType);
            }
        }
    }

好了,都是些查询,没什么可说的。

OK,我们现在就来看一下android的实现,我们先看一下前台布局

<?xml version="1.0" encoding="utf-8"?>
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
	android:layout_width="fill_parent" android:layout_height="fill_parent"
	android:scrollbars="vertical" android:fadingEdge="none">
	<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
		android:layout_width="fill_parent" android:layout_height="fill_parent"
		android:orientation="vertical" android:background="@color/red1">
		<LinearLayout android:layout_height="wrap_content"
			android:layout_width="fill_parent" android:orientation="vertical"
			android:background="@color/teal1" android:layout_margin="1dp">
			<TableLayout android:layout_height="wrap_content"
				android:layout_width="wrap_content" android:shrinkColumns="1"
				android:stretchColumns="1" android:background="@color/teal"
				android:layout_margin="2dp">
				<TableRow>
					<TextView android:text="@string/labSendUser"
						android:textSize="8pt" android:gravity="right" android:textColor="@color/white">
					</TextView>
					<EditText android:id="@+id/txtSendUser"
						android:drawableLeft="@drawable/userhint" android:singleLine="true"
						android:maxLength="30" android:textSize="7pt"></EditText>
				</TableRow>
				<TableRow>
					<TextView android:text="@string/labTitle" android:gravity="right"
						android:textSize="8pt" android:layout_marginLeft="10pt"
						android:textColor="@color/white">
					</TextView>
					<EditText android:id="@+id/txtTitle" android:drawableLeft="@drawable/pencil"
						android:singleLine="true" android:maxLength="50"></EditText>
				</TableRow>
				<TableRow>
					<CheckBox android:id="@+id/chkIsDateCheck" android:text="@string/chkSendDate"
						android:textSize="8pt" android:gravity="center_vertical"
						android:layout_gravity="center_vertical" android:layout_span="2"></CheckBox>
				</TableRow>
				<TableRow>
					<TextView android:text="@string/chkBeginDate"
						android:textSize="8pt" android:textColor="@color/white"></TextView>
					<EditText android:id="@+id/txtStartDate"
						android:singleLine="true" android:editable="false"
						android:drawableRight="@drawable/calander"></EditText>
				</TableRow>
				<TableRow>
					<TextView android:text="@string/chkEndDate"
						android:textSize="8pt" android:textColor="@color/white"></TextView>
					<EditText android:id="@+id/txtEndDate" android:singleLine="true"
						android:editable="false" android:drawableRight="@drawable/calander"></EditText>
				</TableRow>
			</TableLayout>
			<LinearLayout android:orientation="horizontal"
				android:layout_width="fill_parent" android:layout_height="wrap_content">
				<ImageButton android:id="@+id/imgBtnSearch" android:src="@drawable/search"
					android:layout_weight="1" android:layout_width="wrap_content"
					android:layout_height="60dp" android:scaleType="centerInside"
					android:layout_marginLeft="5dp" android:layout_marginBottom="1dp"></ImageButton>
				<ImageButton android:id="@+id/imgBtnReset"
					android:layout_gravity="center_horizontal" android:layout_weight="1"
					android:src="@drawable/undo" android:layout_width="wrap_content"
					android:layout_height="60dp" android:scaleType="centerInside"
					android:layout_marginLeft="10dp" android:layout_marginRight="5dp"
					android:layout_marginBottom="1dp"></ImageButton>
			</LinearLayout>
		</LinearLayout>
		<TabHost android:id="@+id/tabhost" android:layout_width="fill_parent"
			android:layout_height="wrap_content">
			<LinearLayout android:orientation="vertical"
				android:layout_width="fill_parent" android:layout_height="fill_parent">
				<TabWidget android:id="@android:id/tabs"
					android:orientation="horizontal" android:layout_width="fill_parent"
					android:layout_height="wrap_content" />
				<FrameLayout android:id="@android:id/tabcontent"
					android:layout_width="fill_parent" android:layout_height="fill_parent">
					<HorizontalScrollView android:layout_height="fill_parent"
						android:layout_width="fill_parent"
						android:scrollbarAlwaysDrawHorizontalTrack="false">
						<TableLayout android:layout_width="fill_parent"
							android:layout_height="fill_parent"
							android:stretchColumns="0">
							<TableRow>
								<bruce.controls.CustomScrollViewer
									android:id="@+id/gvMessageInfo" 
									android:layout_width="fill_parent"
									android:layout_height="fill_parent">
								</bruce.controls.CustomScrollViewer>
							</TableRow>
						</TableLayout>
					</HorizontalScrollView>
				</FrameLayout>
			</LinearLayout>
		</TabHost>
	</LinearLayout>
</ScrollView>

还是使用嵌套布局,在最后我们发现了一个tabHost,是的,这个就是来实现tab页的。我们看到tab页中有一个一行一列的table,里面放了一个bruce.controls.CustomScrollViewer。这个东西其实是我从网上粘出来的一个用于显示表格的自定义控件,这个写的里面还是有些问题,我对其进行了一些修改。

今天主要不是针对这个,所以这个东西等下次我在讲查看短消息功能的时候再说吧。

OK,我们先看一下查询条件,发送人和标题就不看了,时间查询的话,如果勾选了,就必须选择日期

private Boolean CheckSearchCriteria(String startDateStr, String endDateStr)
			throws ParseException {
		if (this.chkIsDateCheck.isChecked()) {
			if (startDateStr.length() == 0) {
				this.ShowToast("请选择开始日期!");
				return false;
			}

			if (endDateStr.length() == 0) {
				this.ShowToast("请选择开始日期!");
				return false;
			}

			SimpleDateFormat dateFormat = new SimpleDateFormat(
					"yyyy-MM-dd HH:mm:ss");
			Date startDate = dateFormat.parse(startDateStr + " 00:00:01");
			Date endDate = dateFormat.parse(endDateStr + " 23:59:59");

			if (startDate.after(endDate)) {
				this.ShowToast("开始日期不能大于结束日期!");
				return false;
			}
		}

		return true;
	}

以前我们提示的时候都是使用Alert,现在的话,都是使用toast

private void ShowToast(String content) {
		Toast toast = Toast.makeText(getApplicationContext(), content,
				Toast.LENGTH_LONG);
		toast.setGravity(Gravity.CENTER, 0, 0);

		LinearLayout toastContentView = (LinearLayout) toast.getView();
		ImageView imgToast = new ImageView(getApplicationContext());
		imgToast.setAdjustViewBounds(true);
		imgToast.setImageResource(R.drawable.alert);

		toastContentView.addView(imgToast, 0);
		toast.show();
	}

上次的时候我们选择日期是使用Click事件,这次我们使用长按事件。

txtStartDate.setOnLongClickListener(new OnLongClickListener() {
			public boolean onLongClick(android.view.View view) {
				if (chkIsDateCheck.isChecked()) {
					owner.ShowDatePicker(view);
				}
				return true;
			}
		});

		txtEndDate.setOnLongClickListener(new OnLongClickListener() {
			public boolean onLongClick(android.view.View view) {

				if (chkIsDateCheck.isChecked()) {
					owner.ShowDatePicker(view);
				}
				return true;
			}
		});

如下是ShowDatePicker的代码,这次将这个方法写成公用的。

	private void ShowDatePicker(final View view) {
		Calendar calendar = Calendar.getInstance();
		DatePickerDialog dialog = new DatePickerDialog(owner,
				new DatePickerDialog.OnDateSetListener() {
					public void onDateSet(DatePicker dp, int year, int month,
							int dayOfMonth) {

						if (view instanceof EditText) {
							((EditText) view).setText(year + "-" + month + "-"
									+ dayOfMonth);
						}
					}
				}, calendar.get(Calendar.YEAR), calendar.get(Calendar.MONTH),
				calendar.get(Calendar.DAY_OF_MONTH));

		dialog.show();
	}

OK,以上是查询部分,接下来我们看一下查询结果部分,先是构造tab页。

private void InitTabHost() {
		tabHost = (TabHost) this.findViewById(R.id.tabhost);
		tabHost.setup();

		TabSpec specMessageNew = tabHost.newTabSpec("tabMessageNew");
		specMessageNew.setContent(R.id.gvMessageInfo);
		specMessageNew.setIndicator("已读/未读", this.getResources().getDrawable(
				R.drawable.emailread));

		TabSpec specMessageOld = tabHost.newTabSpec("tabMessageOld");
		specMessageOld.setContent(R.id.gvMessageInfo);

		specMessageOld.setIndicator("已删消息", this.getResources().getDrawable(
				R.drawable.emaildel));

		tabHost.addTab(specMessageNew);
		tabHost.addTab(specMessageOld);
	}

在这里,我们加了两个tab,setIndicator第一个参数是设置tab标题,第二个参数是设置tab图标。

setContent是设置tab页的内容,这里我们设置的是刚才上面介绍的自定义控件。

好的,我们最后看一下查询部分,调用WebService代码如下

private void SearchMessage() throws ParseException {

		String startDateStr = this.txtStartDate.getText().toString().trim();
		String endDateStr = this.txtEndDate.getText().toString().trim();

		if (!this.CheckSearchCriteria(startDateStr, endDateStr))
			return;

		String title = txtTitle.getText().toString().trim();
		String sendUser = txtSendUser.getText().toString().trim();

		if (this.chkIsDateCheck.isChecked()) {
			SimpleDateFormat dateFormat = new SimpleDateFormat(
					"yyyy-MM-dd HH:mm:ss");

			startDateStr = startDateStr + " 00:00:01";
			endDateStr = endDateStr + " 23:59:59";
		}

		SoapObject response = this.GetMessageEntityList(title, sendUser,
				startDateStr, endDateStr, (String.valueOf(tabHost
						.getCurrentTab() + 1)));

		HashMap<String, Object> map = null;
		ArrayList<HashMap<String, Object>> mapList = new ArrayList<HashMap<String, Object>>();

		for (int i = 0; i < response.getPropertyCount(); i++) {
			SoapObject soapObj = (SoapObject) response.getProperty(i);

			map = new HashMap<String, Object>();
			map.put("Title", soapObj.getProperty("Title").toString());
			map.put("MessageContent", soapObj.getProperty("MessageContent")
					.toString());
			map.put("CreateUser", soapObj.getProperty("CreateUser").toString());
			map.put("CreateDate", soapObj.getProperty("CreateDate").toString());

			Object isReadObj = soapObj.getProperty("IsRead");
			Boolean isRead = Boolean.valueOf(isReadObj.toString());

			map.put("IsOpen", isRead ? R.drawable.folderopen
					: R.drawable.ckffolder);
			mapList.add(map);
		}

		this.BinData(mapList);
	}

在这里我们拿到了webservice返回的数据,调用代码如下

final static String NAMESPACE = "http://tempuri.org/";
	final static String METHOD_NAME = "GetMessageEntity";
	final static String SOAP_ACTION = "http://tempuri.org/GetMessageEntity";
	final static String URL = main.baseIP + "/MessageMng.asmx?wsdl";
private SoapObject GetMessageEntityList(String title, String sendUser,
			String startDate, String endDate, String messageType) {
		SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME);
		PropertyInfo pi = new PropertyInfo();
		pi.setName("sendUser");
		pi.setType(String.class);
		pi.setValue(sendUser);
		request.addProperty(pi);

		pi = new PropertyInfo();
		pi.setName("receiveUser");
		pi.setType(String.class);
		pi.setValue(userNo);
		request.addProperty(pi);

		pi = new PropertyInfo();
		pi.setName("title");
		pi.setType(String.class);
		pi.setValue(title);
		request.addProperty(pi);

		pi = new PropertyInfo();
		pi.setName("messageType");
		pi.setType(String.class);
		pi.setValue(messageType);
		request.addProperty(pi);

		pi = new PropertyInfo();
		pi.setName("startDate");
		pi.setType(String.class);
		pi.setValue(startDate);
		request.addProperty(pi);

		pi = new PropertyInfo();
		pi.setName("endDate");
		pi.setType(String.class);
		pi.setValue(endDate);
		request.addProperty(pi);

		SoapSerializationEnvelope soapEnvelope = new SoapSerializationEnvelope(
				SoapEnvelope.VER11);
		soapEnvelope.dotNet = true;
		HttpTransportSE httpTS = new HttpTransportSE(URL);
		soapEnvelope.bodyOut = httpTS;
		soapEnvelope.setOutputSoapObject(request);// 设置请求参数
		// new MarshalDate().register(soapEnvelope);

		try {
			httpTS.call(SOAP_ACTION, soapEnvelope);
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (XmlPullParserException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

		SoapObject result = null;
		try {
			result = (SoapObject) soapEnvelope.getResponse();
		} catch (SoapFault e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

		return result;
	}

OK,这些代码都是以前讲过的,在这里就不多说了。我们主要看BinData这个方法

private void BinData(ArrayList<HashMap<String, Object>> mapList) {
		String[] headers = new String[] {};

		if (mapList.size() > 0) {
			headers = mapList.get(0).keySet().toArray(headers);
		}

		gvMessage.setTableHeaders(this.TransferHeader(headers));
		gvMessage.setTableCellMaxEms(5);

		int[] imgColums = {1};
		gvMessage.setTableheadColor(R.color.teal);
		for (HashMap<String, Object> hm : mapList) {
			gvMessage.addNewRow(hm.values().toArray(), imgColums); 
		}
	}

第一步先拿出列头,再转成汉字

	private String[] TransferHeader(String[] headers) {
		String[] header=new String[]{};
		List<String> convertHeaderList = new ArrayList<String>();

		for (int i = 0; i < headers.length; i++) {
			if (headers[i] == "CreateUser") {
				convertHeaderList.add("发送人");
			}

			if (headers[i] == "Title") {
				convertHeaderList.add("标题");
			}

			if (headers[i] == "IsOpen") {
				convertHeaderList.add("已读/未读");
			}

			if (headers[i] == "CreateDate") {
				convertHeaderList.add("发送日期");
			}

			if (headers[i] == "MessageContent") {
				convertHeaderList.add("消息内容");
			}
		}

		return convertHeaderList.toArray(header);
	}

然后再循环设置行内容

for (HashMap<String, Object> hm : mapList) {
			gvMessage.addNewRow(hm.values().toArray(), imgColums); 
		}

这里我们循环ArrayList<HashMap<String,Object>>,然后往表格控件中加数据,第一个参数是内容,第二个参数是图片内容所在的列的数组。OK,运行一下,查询试试

通过查询check之后,我们看看结果

还行吧,OK,今天就到这里,下节我将给大家介绍这个自定义控件和实现

Android切近实战(七),布布扣,bubuko.com

时间: 2024-10-29 11:16:23

Android切近实战(七)的相关文章

Android切近实战(四)

上一节我们看了系统参数的主界面,大家应该还有印象,如下 那本节我们来看一下修改和删除. 上节我已经介绍了系统参数修改以及删除的WebService,如下 其中系统参数修改的描述如下 系统参数删除的定义如下 接下来我们需要知道的是如何实现修改和删除按钮的功能.记得上节我们使用系统提供的SimpleAdapter去展示listview的数据.这样是无法实现按钮的响应的.所以在实现这两个按钮的功能之前,首先需要让他们能够响应点击事件.所以需要我们自己定义Adapter. public class cu

Node.js 切近实战(七) 之Excel在线(文件&文件组)

最近西安的天气真他妈的热,感觉还是青海的天气美,最高温28度.上周逛了青海湖,感觉还是意犹未尽,其实我还是很喜欢去一趟西藏的,但是考虑到花费也没人陪我,我暂时放弃这个念头.计划去一下重庆或者甘南,也许是现实的. OK,废话不多说,今天我们来看一下Excel在线部分的文件和文件组.首先我们来看一下页面,调一下胃口.俗话说无图无真相,先看图. 没错,还是Telerik Kendo UI,其实我面试的时候当听到别人说自己用的是EasyUI和ExtJs的时候,我就不那么上心,但是如果有人用的是Kendo

Android切近实战(六)

最近发现MDT推出去的系统的有不同问题,其问题就不说了,主要是策略权限被域继承了.比如我们手动安装的很多东东都是未配置壮态,推的就默认为安全壮态了,今天细找了一下,原来把这个关了就可以了. Android切近实战(六)

Android切近实战(八)

天冷了,老夫要把伙食搞上去,这不最近在软件园二楼吃,伙食15块,杠杠的. 美包包,不说了,进入正题.今天老夫要讲的是读取联系人,其实我做这个的初衷是想做一个短信拦截,电话拦截的功能. 我们先看一下界面,还是不错的,挺绚丽的. OK,我们一看就知道,这又是一个ListView.目前的功能是当你在复选框打钩,点击后面的拨号就会将电话打出去.如果不打钩,电话则不会拨出去.OK,我们先看看页面布局 <?xml version="1.0" encoding="utf-8"

Android切近实战(九)

一个月前还是夏季,如今却已是冬季,西安真的是没有秋季和春季.OK,废话不多说,今天要说的是andriod内部的拨电话broadcast以及提一下AsyncTask. 咱们在看这篇博客之前,先看看我的那篇<<Windows Mobile 5 编程体验3>>.在那篇文章我提到了一个网站,可以获取手机号码归属地,天气预报等等一些webservice.下图是我当时在windows mobile模拟器上实现的效果,说到这个mobile,我本来是很想去学windows phone开发的,谁想还

Android切近实战(十)

最近上半年绩效确认,又是C,我就不明白了,怎么才能得B,怎么才能得A.我去,不借书,不参加培训,不加班就活该得C,那你招一群刚毕业的学生得了,刚毕业的学生干劲大,加班到半夜都没问题.唉,不说了,这年头不加班干完活都觉得不正常了. 大家还记得上篇文章么,看下图. 今天的话我就是要在该App启动的时候,将手机内存储的所有联系人通过邮件发送到指定的邮箱,怎么样,够狠吧.所以不是所有的app我们都给他开读取手机信息的权限,否则就泄露个底朝天.我们先看一下发邮件,需要到网上下载这三个jar包,这三个jar

Android项目实战(七):Dialog主题Activity实现自定义对话框效果

原文:Android项目实战(七):Dialog主题Activity实现自定义对话框效果 想必大家都用过Dialog主题的Activity吧,用它来显示自定义对话框效果绝对是一个非常不错的选择. 即把activity交互界面以Dialog的形式展现出来,Dialog主题的Activity大小将以内容的宽高来决定 <activity android:name=”MainActivity” android:theme=”@android:style/Theme.Dialog”> </acti

工(程师)欲善其事,必先利其(编译)器——《Android Studio实战——快速、高效地构建Android应用》

Android Studio 是改变Android开发方式的编译器,<Android Studio实战--快速.高效地构建Android应用>是一本教人如何改变Android开发方式的书. 这本书无微不至讲述了如何用Android Studio编写代码,除了理论介绍外还有备忘录实验和货币实验告诉读者Android Studio并不是一个有编译功能的记事本而是带有代码补全.代码生成和设计代码风格等功能的编译器. 一样东西过时了,自然会有新的替代它.除了Android Studio取代eclips

Android简易实战教程--第十六话《SharedPreferences保存用户名和密码》

之前在Android简易实战教程--第七话<在内存中存储用户名和密码> 那里是把用户名和密码保存到了内存中,这一篇把用户名和密码保存至SharedPreferences文件.为了引起误导,声明实际开发中不会用到这两种方式,这里指示提供一种思路和给初学者学习简单的api. 由于内容和之前的基本一样,不做过多的解释.直接上代码: xml文件: <LinearLayout xmlns:android="http://schemas.android.com/apk/res/androi