【Android】4.4 示例--列出手机上的所有联系人
分类:C#、Android、VS2015;创建日期:2016-02-06
项目名:DesignerWalkthrough
模板:Blank App(Android)
功能:列出手机上的所有联系人。
说明:该例子提前使用了第9章介绍的列表视图。
运行效果:
下图是在模拟器(Galaxy_Api19)下看到的运行效果:
注意:需要先在模拟器的通讯录中添加联系人,然后才能看到运行效果。
主要设计步骤:
(1)在ListItem.axml中设计列表项模板
新建VS2015项目,模板:“Blank App (Android)”,项目名:DesignerWalkthrough
鼠标右击Resources/layout文件夹,【添加】à【新建项】,在弹出的窗口中,选择【Android Layout】模板,文件名:ListItem.axml,单击【添加】按钮。
拖放Placeholder.png到drawable文件夹下。
从【工具箱】中拖放【ImageView】控件到设计界面中。
从【工具箱】中拖放【LinearLayout (Vertical)】控件到设计界面中,放到【ImageView】的下方。
从【工具箱】中拖放【Text (Large)】控件到设计界面中,放到【LinearLayout (Vertical)】内。
从【工具箱】中拖放【Text (Small)】控件到【Text (Large)】的下方。
下面修改布局,目标是:将ImageView放到两个Text的左边:
缩小ImageView的宽度,然后修改根目录下的LinearLayout控件,在【属性】窗口中,将其【orientation】属性改为“horizontal”,即得到下面的效果:
技巧:利用【文档大纲(Document Outline)】选择要操作的控件,然后再利用【属性】窗口设置对应的属性。
设置ImageView的属性:
src:选择icon.png图片,得到该属性的值为“@drawable/icon”。
paddingLeft:0dp
paddingTop:5dp
paddingRight:5dp
paddingBottom:0dp
layoutWidth:50dp
layoutHeight:50dp
adjustViewBounds:true
minWidth:25dp
minHeight:25dp
设置LinearLayout1的属性:
paddingLeft:0dp
paddingTop:5dp
paddingRight:5dp
paddingBottom:0dp
最终得到的结果如下:
最终得到的【Source】选项卡中对应的XML如下:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="horizontal"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<ImageView
android:src="@drawable/icon"
android:layout_width="50dp"
android:layout_height="50dp"
android:id="@+id/imageView1"
android:adjustViewBounds="true"
android:paddingLeft="0dp"
android:paddingRight="5dp"
android:paddingBottom="0dp"
android:paddingTop="5dp"
android:minHeight="25dp"
android:minWidth="25dp" />
<LinearLayout
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/linearLayout1"
android:paddingTop="5dp"
android:paddingBottom="5dp"
android:paddingLeft="0dp"
android:paddingRight="0dp">
<TextView
android:text="Large Text"
android:textAppearance="?android:attr/textAppearanceLarge"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/textView1" />
<TextView
android:text="Small Text"
android:textAppearance="?android:attr/textAppearanceSmall"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/textView2" />
</LinearLayout>
</LinearLayout>
(2)在Main.axml中添加列表
打开Main.axml。
删除默认添加的按钮。
从【工具箱】中拖放一个ListView到设计界面中,然后修改属性:
id:@+id/listViewContacts
最后得到的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"
android:minWidth="25px"
android:minHeight="25px">
<ListView
android:minWidth="25px"
android:minHeight="25px"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/listViewContacts" />
</LinearLayout>
(3)修改权限配置
修改项目属性,添加【READ_CONTACTS】权限:
修改后,得到的AndroidMinifest.xml内容如下:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="DesignerWalkthrough.DesignerWalkthrough" android:versionCode="1" android:versionName="1.0" android:installLocation="auto">
<uses-sdk />
<application android:label="DesignerWalkthrough" android:icon="@drawable/Icon"></application>
<uses-permission android:name="android.permission.READ_CONTACTS" />
</manifest>
(4)添加ContactsAdapter.cs
选择【Class】模板,输入文件名,然后将ContactsAdapter.cs的代码改为下面的内容:
using Android.Views;
using Android.Widget;
using Android.Content;
using Android.App;
using Android.Provider;
using System.Collections.Generic;
namespace DesignerWalkthrough
{
public class ContactsAdapter : BaseAdapter
{
List<Contact> _contactList;
Activity _activity; public ContactsAdapter(Activity activity)
{
_activity = activity; FillContacts();
} public override int Count
{
get { return _contactList.Count; }
} public override Java.Lang.Object GetItem(int position)
{
return null;
} public override long GetItemId(int position)
{
return _contactList[position].Id;
} public override View GetView(int position, View convertView, ViewGroup parent)
{
var view = convertView ?? _activity.LayoutInflater.Inflate(Resource.Layout.ListItem, parent, false);
var contactName = view.FindViewById<TextView>(Resource.Id.textView1);
var textView2 = view.FindViewById<TextView>(Resource.Id.textView2);
var contactImage = view.FindViewById<ImageView>(Resource.Id.imageView1); textView2.Text = _contactList[position].Number; contactName.Text = _contactList[position].DisplayName; if (_contactList[position].PhotoId == null)
{ contactImage = view.FindViewById<ImageView>(Resource.Id.imageView1);
contactImage.SetImageResource(Resource.Drawable.Placeholder); }
else
{ var contactUri = ContentUris.WithAppendedId(ContactsContract.Contacts.ContentUri, _contactList[position].Id);
var contactPhotoUri = Android.Net.Uri.WithAppendedPath(contactUri, ContactsContract.Contacts.Photo.ContentDirectory); contactImage.SetImageURI(contactPhotoUri);
}
return view;
} void FillContacts()
{
var uri = ContactsContract.Contacts.ContentUri; string[] projection = {
ContactsContract.Contacts.InterfaceConsts.Id,
ContactsContract.Contacts.InterfaceConsts.DisplayName,
ContactsContract.Contacts.InterfaceConsts.PhotoId
}; var cursor = _activity.ContentResolver.Query(uri, projection, null, null, null); _contactList = new List<Contact>(); if (cursor.MoveToFirst())
{
do
{
_contactList.Add(new Contact
{
Id = cursor.GetLong(cursor.GetColumnIndex(projection[])),
DisplayName = cursor.GetString(cursor.GetColumnIndex(projection[])),
PhotoId = cursor.GetString(cursor.GetColumnIndex(projection[])),
Number = "(123) 456 - 7890"
});
} while (cursor.MoveToNext());
}
} class Contact
{
public long Id { get; set; } public string DisplayName { get; set; } public string PhotoId { get; set; } public string Number { get; set; }
}
}
}
(5)修改MainActivity.cs
将MainActivity.cs的代码改为下面的内容:
using Android.App;
using Android.Widget;
using Android.OS;
namespace DesignerWalkthrough
{
[Activity(Label = "DesignerWalkthrough",
Theme = "@android:style/Theme.DeviceDefault.Light",
MainLauncher = true, Icon = "@drawable/icon")]
public class MainActivity : Activity
{
protected override void OnCreate(Bundle bundle)
{
base.OnCreate(bundle);
SetContentView(Resource.Layout.Main); var contactsAdapter = new ContactsAdapter(this);
var contactsListView = FindViewById<ListView>(Resource.Id.listViewContacts);
contactsListView.Adapter = contactsAdapter;
}
}
}
(6)运行
选择一种模拟器,然后按<F5>键调试运行。
【Android】4.4 示例--列出手机上的所有联系人的更多相关文章
- Android popupwindow在低版本手机上无法显示
popupwindow偶尔的显示失效(在低版本Android系统的手机上,测试机6.0)实在是坑害了不少人,害,而且坑了for a long time.本小白就是其中一个受害者. 百度了N久N多还是没 ...
- android的开发 华为手机上不显示menu键
android的开发,华为手机上不显示menu键解决办法: 在AndroidManifest.xml中讲targetSdkVersion改为9. <uses-sdk android:minSdk ...
- HTML5定稿了,终于有一种编程语言开发的程序可以在Android和IOS两种设备上运行了
2007 年 W3C (万维网联盟)立项 HTML5,直至 2014 年 10 月底,这个长达八年的规范终于正式封稿. 过去这些年,HTML5 颠覆了 PC 互联网的格局,优化了移动互联网的体验,接下 ...
- 如何在 Android 手机上实现抓包?
如何在 Android 手机上实现抓包? http://www.zhihu.com/question/20467503 我想知道某个应用究竟在数据提交到哪里,提交了什么.网上的教程太复杂,不想麻烦.有 ...
- 利用exif.js解决ios或Android手机上传竖拍照片旋转90度问题
html5+canvas进行移动端手机照片上传时,发现ios手机上传竖拍照片会逆时针旋转90度,横拍照片无此问题:Android手机没这个问题. 因此解决这个问题的思路是:获取到照片拍摄的方向角,对非 ...
- 如何在Android手机上进行自动化测试(下)
版权声明:允许转载,但转载必须保留原链接:请勿用作商业或者非法用途 前言 通过阅读本篇教程,你将会了解到: 如何使用Poco对Android原生应用进行测试 Poco支持直接对任何Android原生应 ...
- Mac电脑如何读取Android手机上的文件
问题 一般Android手机用usb数据线连接到windows操作系统的电脑上后,会自动将手机存储卡以移动存储的方式显示在电脑里. 但是如果操作系统是Mac的,就没有这个存储设备.问题来了,Mac电脑 ...
- 如何通过wifi在android手机上安装调试应用
如何通过wifi在android手机上安装调试应用 1. 首先还是要打开手机的usb调试选项,并通过usb线连接手机.2. 然后执行“adb tcpip 5555”,把adb从usb模式切换到tcpi ...
- delphi xe5 android 手机上使用sqlite
本篇我们介绍一下在android手机上怎样使用sqlite数据库,这里用Navigator实现 增删改查. 1.新建firemonkey mobile application 2.选择blank ap ...
随机推荐
- InitialContext和lookup(转)
原文地址:http://wxg6203.iteye.com/blog/680830 最近因为工作需要开始学习Ejb3,遇到了一个让我很郁闷的事情,做一下小小的总结——小心new InitialCont ...
- 短信api接口
1.需要用到的结构 typedef struct _SM_PARAM { char SCA[16];//+8613552678753// 短消息服务中心号码(SMSC地址) char TPA[16]; ...
- OpenERP的短信(SMS)接口
今天测试了一下OpenERP的短信(SMS)接口. 在OpenERP的Partner界面上,WebClient的右边的工具条有个“send sms”的按钮.OpenERP中发短信用的是短信的Web接口 ...
- python线程详解
#线程状态 #线程同步(锁)#多线程的优势在于可以同时运行多个任务,至少感觉起来是这样,但是当线程需要共享数据时,可能存在数据不同步的问题. #threading模块#常用方法:'''threadin ...
- tarfile模块可以方操作tar归档文件
# -*- coding: utf-8 -*- #python 27 #xiaodeng #Python自带的tarfile模块可以方便读取tar归档文件 #http://www.open-open. ...
- history设置时间戳
Linux查看历史命令,很关键!history,默认没有时间戳... 01.设置系统环境变量 echo 'export HISTTIMEFORMAT="%F %T `whoami` &qu ...
- office-word去掉效验红色的波浪线
工作中,总是能发现不足.能再次学习到知识和经验!
- VMware Player 12.5.0 中文免费版
VMWare Player优点:– 免费的 VMWare Player 体积仅90多MB,相比7百多MB且还要付费的 VMware Workstation 无疑更适合个人用户使用– 主界面清爽简洁,几 ...
- servlet下根据相对路径找资源
1.在web项目中如果直接添加一个资源,那么相对路径相对的是tomcat的bin目录. 2.在包中直接指定资源,那么可以使用以下的相对路径直接获取资源: InputStream in = this.g ...
- WordPress网站搬家全过程 亲身体验WordPress搬家,总结几点
需要移动的文件主要是网站文件和数据库文件,如果是简单的wordpress 操作就是:备份网站文件,导出数据库文件,上传网站文件,导入数据库文件,移动网站文件,修改wordpress的wp-conf ...