- 浏览: 2196886 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (1240)
- mac/IOS (287)
- flutter (1)
- J2EE (115)
- android基础知识 (582)
- android中级知识 (55)
- android组件(Widget)开发 (18)
- android 错误 (21)
- javascript (18)
- linux (70)
- 树莓派 (18)
- gwt/gxt (1)
- 工具(IDE)/包(jar) (18)
- web前端 (17)
- java 算法 (8)
- 其它 (5)
- chrome (7)
- 数据库 (8)
- 经济/金融 (0)
- english (2)
- HTML5 (7)
- 网络安全 (14)
- 设计欣赏/设计窗 (8)
- 汇编/C (8)
- 工具类 (4)
- 游戏 (5)
- 开发频道 (5)
- Android OpenGL (1)
- 科学 (4)
- 运维 (0)
- 好东西 (6)
- 美食 (1)
最新评论
-
liangzai_cool:
请教一下,文中,shell、C、Python三种方式控制led ...
树莓派 - MAX7219 -
jiazimo:
...
Kafka源码分析-序列5 -Producer -RecordAccumulator队列分析 -
hp321:
Windows该命令是不是需要安装什么软件才可以?我试过不行( ...
ImageIO读jpg的时候出现javax.imageio.IIOException: Unsupported Image Type -
hp321:
Chenzh_758 写道其实直接用一下代码就可以解决了:JP ...
ImageIO读jpg的时候出现javax.imageio.IIOException: Unsupported Image Type -
huanghonhpeng:
大哥你真强什么都会,研究研究。。。。小弟在这里学到了很多知识。 ...
android 浏览器
先看一下目录结构:
AndroidManifest.xml配置文件:
values/strings.xml:
values-zh-rCN/strings.xml:
contact.xml布局文件:
contact_list.xml布局文件:
ContactSelectorWidget.java类:
ContactCheckBoxAdapter.java类:
运行结果:
AndroidManifest.xml配置文件:
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.iaiai.activity" android:versionCode="1" android:versionName="1.0"> <uses-sdk android:minSdkVersion="8" /> <application android:icon="@drawable/icon" android:label="@string/app_name"> <activity android:name="ContactSelectorWidget" android:label="@string/contact_title"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> <!-- 读取联系人 --> <uses-permission android:name="android.permission.READ_CONTACTS" /> <!-- 写入联系人 --> <uses-permission android:name="android.permission.WRITE_CONTACTS" /> <!-- 在SD卡中创建文件与删除文件权限 --> <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" /> <!-- 往SD卡中写入数据权限 --> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <!-- 电话拨号 --> <uses-permission android:name="android.permission.CALL_PHONE" /> <!-- 访问网络 --> <uses-permission android:name="android.permission.INTERNET" /> <!-- 访问Wi-Fi网络 --> <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> </manifest>
values/strings.xml:
<?xml version="1.0" encoding="utf-8"?> <resources> <string name="app_name">iaiai - Contact</string> <string name="contact_title">iaiai - Contact</string> </resources>
values-zh-rCN/strings.xml:
<?xml version="1.0" encoding="utf-8"?> <resources> <string name="app_name">丸子联系人</string> <string name="contact_title">丸子联系人</string> </resources>
contact.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"> <ListView android:layout_width="fill_parent" android:layout_height="wrap_content" android:id="@+id/contactListView"> </ListView> </LinearLayout>
contact_list.xml布局文件:
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="wrap_content" android:id="@+id/contactItems" android:paddingBottom="5dip" android:paddingLeft="12dip" android:paddingTop="5dip" android:paddingRight="12dip"> <ImageView android:id="@+id/contact_img" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentLeft="true"></ImageView> <TextView android:layout_height="wrap_content" android:layout_width="wrap_content" android:id="@+id/contact_name" android:textSize="20dip" android:paddingTop="12px" android:layout_marginLeft="70px"> </TextView> <CheckBox android:id="@+id/contact_checkbox" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentRight="true" android:focusable="false"></CheckBox> </RelativeLayout>
ContactSelectorWidget.java类:
package com.iaiai.activity; import java.io.InputStream; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import android.app.Activity; import android.content.ContentResolver; import android.content.ContentUris; import android.database.Cursor; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.drawable.BitmapDrawable; import android.net.Uri; import android.os.Bundle; import android.provider.ContactsContract; import android.view.Menu; import android.view.MenuItem; import android.widget.ListView; import android.widget.Toast; import com.iaiai.activity.adapter.ContactCheckBoxAdapter; public class ContactSelectorWidget extends Activity { public static final String CONTACT_NAME = "NAME"; // 保存的名字 public static final String CONTACT_ID = "ID"; // ID public static final String CONTACT_FACE = "FACE"; // 头像 private ContactCheckBoxAdapter contactCheckBoxAdapter; // 配置适配器 private ListView list; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.contact); list = (ListView) findViewById(R.id.contactListView); // 配置适配器 contactCheckBoxAdapter = new ContactCheckBoxAdapter(this, getData()); // 布局里的控件id // 添加并且显示 list.setAdapter(contactCheckBoxAdapter); } @Override public boolean onCreateOptionsMenu(Menu menu) { menu.add(Menu.NONE, 1, 0, android.R.string.ok); menu.add(Menu.NONE, 2, 0, android.R.string.cancel); return super.onCreateOptionsMenu(menu); } @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case 1: Toast.makeText( this, "selector:" + contactCheckBoxAdapter.onSelectorData().size(), Toast.LENGTH_LONG).show(); break; case 2: Toast.makeText(this, android.R.string.cancel, Toast.LENGTH_LONG) .show(); break; default: break; } return super.onOptionsItemSelected(item); } /** * 获取联系人 * * @return */ private List<Map<String, Object>> getData() { // 组织数据源 List<Map<String, Object>> list = new ArrayList<Map<String, Object>>(); ContentResolver contentResolver = getContentResolver(); Cursor cursor = contentResolver.query( ContactsContract.Contacts.CONTENT_URI, null, null, null, null); while (cursor.moveToNext()) { String id = cursor.getString(cursor .getColumnIndex(ContactsContract.Contacts._ID)); // id String name = cursor.getString(cursor .getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME)); // 姓名 Map<String, Object> map = new HashMap<String, Object>(); map.put(CONTACT_ID, id); map.put(CONTACT_NAME, name); map.put(CONTACT_FACE, getContactBitmap(id)); list.add(map); } cursor.close(); // 关闭 return list; } /** * 获得联系人头像 * * @param id * 联系人id * @return */ private Bitmap getContactBitmap(String id) { ContentResolver cr = getContentResolver(); Uri uri = ContentUris.withAppendedId( ContactsContract.Contacts.CONTENT_URI, Long.parseLong(id)); InputStream input = ContactsContract.Contacts .openContactPhotoInputStream(cr, uri); if (input == null) { // Log.e("star","input is null"); InputStream is = getResources().openRawResource(R.drawable.icon); BitmapDrawable bmpDraw = null; bmpDraw = new BitmapDrawable(is); Bitmap aa = null; aa = bmpDraw.getBitmap(); Bitmap newb = Bitmap.createScaledBitmap(aa, 50, 50, false); return newb; } else { Bitmap contactPhoto = BitmapFactory.decodeStream(input); Bitmap newb = Bitmap .createScaledBitmap(contactPhoto, 50, 50, false); return newb; } } }
ContactCheckBoxAdapter.java类:
package com.iaiai.activity.adapter; import java.util.HashMap; import java.util.List; import java.util.Map; import android.content.Context; import android.graphics.Bitmap; import android.view.LayoutInflater; import android.view.View; import android.view.View.OnClickListener; import android.view.ViewGroup; import android.widget.BaseAdapter; import android.widget.CheckBox; import android.widget.ImageView; import android.widget.TextView; import com.iaiai.activity.ContactSelectorWidget; import com.iaiai.activity.R; public class ContactCheckBoxAdapter extends BaseAdapter { private LayoutInflater mInflater; private List<Map<String, Object>> listData; // 数据 private Map<Integer, Map<String, Object>> selectMap = new HashMap<Integer, Map<String, Object>>(); // 选择的数据 private class ViewHolder { public ImageView img; public TextView title; public CheckBox checkBox; } public ContactCheckBoxAdapter(Context context, List<Map<String, Object>> listData) { this.mInflater = LayoutInflater.from(context); this.listData = listData; } @Override public int getCount() { return listData.size(); } @Override public Object getItem(int position) { return listData.get(position); } @Override public long getItemId(int position) { return position; } /** * 返回选择的数据,Integer为选择的第几个 * * @return */ public Map<Integer, Map<String, Object>> onSelectorData() { return selectMap; } @Override public View getView(final int position, View convertView, ViewGroup parent) { ViewHolder holder = null; if (convertView == null) { holder = new ViewHolder(); convertView = mInflater.inflate(R.layout.contact_list, null); holder.img = (ImageView) convertView.findViewById(R.id.contact_img); holder.title = (TextView) convertView .findViewById(R.id.contact_name); holder.checkBox = (CheckBox) convertView .findViewById(R.id.contact_checkbox); holder.checkBox.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { if (selectMap.get(position) != null) { selectMap.remove(position); } else { selectMap.put(position, listData.get(position)); } } }); convertView.setTag(holder); } else { holder = (ViewHolder) convertView.getTag(); } holder.img.setImageBitmap((Bitmap) listData.get(position).get( ContactSelectorWidget.CONTACT_FACE)); holder.title.setText(listData.get(position) .get(ContactSelectorWidget.CONTACT_NAME).toString()); if (selectMap.get(position) != null) { holder.checkBox.setChecked(true); } else { holder.checkBox.setChecked(false); } return convertView; } }
运行结果:
发表评论
-
按钮点击特效 ShineButton
2016-07-07 18:16 625https://github.com/ChadCSong/ ... -
一个广告轮播组件 BGABanner-Android
2016-07-07 18:15 820https://github.com/bingoogo ... -
RadioGroup实现类似ios的分段选择(UISegmentedControl)控件
2016-01-05 16:44 783在ios7中有一种扁平风格的控件叫做分段选择控件UISegme ... -
自己写的一个GPS卫星地图
2014-01-18 15:16 1027自己写的一个GPS卫星地图 代码直接下吧. 下载地址: ... -
android 九宫格密码解锁
2013-11-15 15:02 2027效果: -
android 类似Ios开关按钮,支持滑动切换和动画显示
2013-11-11 08:46 1527效果图: 不多说了,自己去下吧 -
Android之ViewGroup实现九宫格并可拖动位置
2013-11-07 15:44 2005用ViewGroup实现的... 效果图: 下面是代码 ... -
ExpandableListView仿QQ列表,上下可刷新
2013-10-22 09:07 1156效果: 不多说了,需要的直接下载吧 下载地址:htt ... -
android 自定义ImageView实现图片手势滑动,多点触摸放大缩小效果
2013-08-27 10:03 2848实现原理:自定义ImageView对此控件进行相应的layou ... -
listview上下拉组件[自己重写的]
2013-08-06 16:59 248在网上找了好多这类组件总是用得不太顺手,数据一加载多了就卡得不 ... -
android源码分享之小米录音机源码
2013-01-30 10:15 2071MIUI录音机是基于Android原生录音机来开发的,能够运行 ... -
Android 实现书籍翻页效果TXT阅读器源码
2013-01-30 10:08 3337本源码实现TXT阅读翻页效果,修复了翻页时出现的BUG。 ... -
android 做的一个二维码扫描
2013-01-30 10:09 1199效果图片: -
Android 心跳图 demo
2012-01-30 17:33 2435自己做的一个android上的心跳图程序 效果: -
android 浏览器
2011-12-24 09:59 1773效果图: 大家可以在安卓市场中找到此apk安装文件。 ... -
android 记事本
2011-12-24 09:56 1699效果图: 大家可以在安卓市场中找到此apk安装文件。 ... -
Android 自己做的Launcher
2011-10-24 09:40 1857可以实现手动添加桌面,没做删和其它菜单功能实现。 主要是卡在 ... -
Android QQ登录界面
2011-06-22 15:07 4009布局loginpage.xml: <?xml ver ...
相关推荐
本篇将详细讲解如何实现Android联系人的分页加载以及下拉刷新功能。 首先,我们需要理解分页的基本概念。分页是将大量数据分割成多个小部分,每次只加载一部分,而不是一次性加载所有数据。这样可以降低内存占用,...
在Android平台上,获取联系人列表是一项常见的功能,它允许应用访问用户的通讯录数据,以便进行如发送短信、拨打电话或实现社交功能等操作。在这个"Android获取联系人列表Demo"中,我们将深入探讨如何实现这一功能。...
4. **XML布局文件**: 包含Widget的界面设计,如一个ImageView用于显示联系人头像,一个TextView显示联系人名字,以及一个Button作为拨号按钮。 5. **AndroidManifest.xml**: 在这里注册AppWidgetProvider,指定其...
- **运行时权限**:如果AppWidget涉及到敏感操作,如读取联系人或发送消息,需要在运行时请求相应的权限。 - **BroadcastReceiver权限**:AppWidgetProvider作为BroadcastReceiver运行,需要在AndroidManifest中...
2. **Widget配置Activity**: 在用户添加Widget时,系统会启动一个配置Activity,让用户选择联系人并设置快捷拨号。这个Activity通常通过`<intent-filter>`在AndroidManifest.xml中声明,并关联到`...
创建一个最近联系人Widget,需要实现AppWidgetProvider类,并在XML布局文件中定义Widget的外观。AppWidgetProvider类是Widget的监听器,它会在特定事件(如添加、删除或更新Widget)时被调用。在onUpdate()方法中,...
5. **提供配置界面**:如果需要,可以创建一个配置Activity,让用户选择要添加到Widget的联系人。 6. **广播接收器**:AppWidgetProvider监听BroadcastIntent,当用户操作Widget或系统事件发生时,它会被唤醒执行...
- **访问联系人**:如果程序需要选择联系人,还需声明`<uses-permission android:name="android.permission.READ_CONTACTS" />`权限。 6. **源码结构分析**: - `AndroidManifest.xml`: 应用的配置文件,包含应用...
你可能会发现一个或多个`Intent`被用来在Widget和Activity之间传递数据和控制,例如选择或编辑拨号联系人。 `res`文件夹包含了各种资源,如图片、字符串、颜色等。拨号按钮的图标可能在`drawable`目录下,而应用的...
10 Android 一个批量删除联系人的Demo 11 Android 指南针程序 12 Android操作数据库实例 13 android连接SQLite数据库-----增加改查+分页 14 Android游戏的心跳效果 15 Android远程登录含有loading登录效果~~完整代码...
- 若组件需要访问设备的特定数据或服务,例如获取联系人、读取位置信息,开发者需要在AndroidManifest.xml中声明相应的权限。 6. **兼容性与优化** - 开发者需要注意不同版本的Android系统可能存在差异,确保组件...
NineGridView 类似QQ空间,微信朋友圈,微博主页等,展示图片的九宫格控件,自动根据图片的数量确定图片大小和控件大小...使用前,对于Android Studio的用户,可以选择添加: compile 'com.lzy.widget:ninegridview:0.2
总之,Android获取手机联系人电话号码的过程涉及到请求权限、启动选择联系人的意图、处理返回结果并查询联系人数据。以上代码实现了一个基本的示例,可以帮助开发者理解这一过程。在实际项目中,根据具体需求进行...
开发者可能会学习到如何使用ContentProvider来存储和检索数据,以及如何使用Intent启动系统联系人选择器。此外,还可能涉及如何处理权限请求,因为访问用户的联系人信息需要相应的权限。 ### Map(基于TomTom SDK)...
在Android应用开发中,RecyclerView是谷歌推出的一种高效、可复用的视图列表组件,用于替代ListView。...通过以上步骤,你就可以构建出一个功能齐全、性能良好的Android联系人列表,类似于微信的界面效果。
8. **配置Activity**:通常,用户需要配置快捷拨号,所以会有个配置Activity,让用户选择联系人并保存设置。配置完成后,Activity会传递相关信息给Widget。 9. **优化性能**:为了减少电量消耗和提高用户体验,应...