收藏列表
- 全部 [59]
- 默认 [28]
- android [27]
- java [1]
- contact [1]
- 自定义mapview类,重写其onintercepttouchevent方法。来实现双击以后图片变大;让一个图片透明; 直接发送邮件;; 程序控制屏幕变亮;过滤特定文本 ;scrollview scroll停止事件 ;对于特定的程序 发起一个关联供打开 [1]
- android windowmanager [1]
标题 | 标签 | 来源 | |
windowManager 添加一个View(实现打电话的时候显示一个按钮) | android windowmanager | ||
WindowManager windowManager = (WindowManager)context.getApplicationContext().getSystemService(Context.WINDOW_SERVICE); Button view = new Button(context.getApplicationContext()); view.setText("window manager test!"); view.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { System.out.println("<<<<<<<<<<<<<<<"); } }); WindowManager.LayoutParams mParams = new WindowManager.LayoutParams(); mParams.type = WindowManager.LayoutParams.TYPE_SYSTEM_ALERT; // 设置window type mParams.format = PixelFormat.RGBA_8888; // 设置图片格式,效果为背景透明 mParams.flags =LayoutParams.FLAG_LAYOUT_INSET_DECOR|LayoutParams.FLAG_NOT_FOCUSABLE; // LayoutParams.FLAG_NOT_FOCUSABLE | LayoutParams.FLAG_NOT_TOUCHABLE;//LayoutParams.TYPE_SYSTEM_DIALOG ;//|LayoutParams.FLAG_ALT_FOCUSABLE_IM|LayoutParams.TYPE_STATUS_BAR ; mParams.gravity = Gravity.TOP|Gravity.CENTER_HORIZONTAL; // 以屏幕左上角为原点,设置x、y初始值 mParams.x = 0; mParams.y = 0; mParams.width = WindowManager.LayoutParams.WRAP_CONTENT;; mParams.height =WindowManager.LayoutParams.WRAP_CONTENT;; windowManager.addView(view, mParams); 添加权限 <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" /> <uses-permission android:name="android.permission.SYSTEM_OVERLAY_WINDOW" /> |
|||
APN | android | ||
package cc.mdev.apn; /** * 這裡是APN匹配,用於匹配移動或者聯通的APN * @author SinFrancis wong * @site http://mdev.cc * @wiki http://mdev.cc/wiki * @since 2010-01-08 * */ public final class APNMatchTools { public static class APNNet{ /** * 中国移动cmwap */ public static String CMWAP = "cmwap"; /** * 中国移动cmnet */ public static String CMNET = "cmnet"; //中国联通3GWAP设置 中国联通3G因特网设置 中国联通WAP设置 中国联通因特网设置 //3gwap 3gnet uniwap uninet /** * 3G wap 中国联通3gwap APN */ public static String GWAP_3 = "3gwap"; /** * 3G net 中国联通3gnet APN */ public static String GNET_3="3gnet"; /** * uni wap 中国联通uni wap APN */ public static String UNIWAP="uniwap"; /** * uni net 中国联通uni net APN */ public static String UNINET="uninet"; } public static String matchAPN(String currentName) { if("".equals(currentName) || null==currentName){ return ""; } currentName = currentName.toLowerCase(); if(currentName.startsWith(APNNet.CMNET)) return APNNet.CMNET; else if(currentName.startsWith(APNNet.CMWAP)) return APNNet.CMWAP; else if(currentName.startsWith(APNNet.GNET_3)) return APNNet.GNET_3; else if(currentName.startsWith(APNNet.GWAP_3)) return APNNet.GWAP_3; else if(currentName.startsWith(APNNet.UNINET)) return APNNet.UNINET; else if(currentName.startsWith(APNNet.UNIWAP)) return APNNet.UNIWAP; else if(currentName.startsWith("default")) return "default"; else return ""; // return currentName.substring(0, currentName.length() - SUFFIX.length()); } } |
|||
andorid 实现禁默安装apk | android | ||
import java.io.File; import android.app.Activity; import android.os.Bundle; import android.content.Intent; import android.content.pm.PackageInfo; import android.content.pm.PackageManager; import android.content.pm.PackageManager.NameNotFoundException; import android.content.pm.IPackageInstallObserver; import android.content.pm.IPackageDeleteObserver; import android.content.res.Resources; import android.graphics.drawable.Drawable; import android.net.Uri; import android.os.Environment; import android.os.Handler; import android.os.Message; import android.util.Log; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.ProgressBar; import android.widget.TextView; public class InstallActivity extends Activity { /** Called when the activity is first created. */ private Button btn1; private Button btn2; private final int INSTALL_COMPLETE = 1; private final int UNINSTALL_COMPLETE = 1; final static int SUCCEEDED = 1; final static int FAILED = 0; public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); btn1 = (Button) findViewById(R.id.btn1); btn2.setOnClickListener(listener1); btn2 = (Button) findViewById(R.id.btn2); btn2.setOnClickListener(listener2); } private OnClickListener listener1 = new OnClickListener() { public void onClick(View v) { String apkPath = Environment.getExternalStorageDirectory() + "/baidu/" + "UC.apk"; String packageName = "com.uc.browser"; install(apkPath, packageName); } }; private OnClickListener listener2 = new OnClickListener() { public void onClick(View v) { String packageName = "com.uc.browser"; uninstall(packageName); } }; // 安装 public void install(String apkPath, String packageName) { Uri uri = Uri.fromFile(new File(apkPath)); int installFlags = 0; PackageManager pm = getPackageManager(); try { PackageInfo pi = pm.getPackageInfo(packageName, PackageManager.GET_UNINSTALLED_PACKAGES); if (pi != null) { installFlags |= PackageManager.INSTALL_REPLACE_EXISTING; } } catch (NameNotFoundException e) { Log.d("debug", "NameNotFoundException--" + e.getMessage()); } PackageInstallObserver observer = new PackageInstallObserver(); pm.installPackage(uri, observer, installFlags, packageName); } // 卸载 public void uninstall(String packageName) { PackageManager pm = getPackageManager(); PackageDeleteObserver observer = new PackageDeleteObserver(); pm.deletePackage(packageName, observer, 0); } class PackageInstallObserver extends IPackageInstallObserver.Stub { public void packageInstalled(String packageName, int returnCode) { Message msg = mHandler.obtainMessage(INSTALL_COMPLETE); msg.arg1 = returnCode; mHandler.sendMessage(msg); } }; class PackageDeleteObserver extends IPackageDeleteObserver.Stub { public void packageDeleted(boolean succeeded) { Message msg = mHandler.obtainMessage(UNINSTALL_COMPLETE); msg.arg1 = succeeded ? SUCCEEDED : FAILED; mHandler.sendMessage(msg); } } private Handler mHandler = new Handler() { public void handleMessage(Message msg) { switch (msg.what) { case INSTALL_COMPLETE: int centerTextLabel; Drawable centerTextDrawable = null; if (msg.arg1 == SUCCEEDED) { } else { } if (centerTextDrawable != null) { } break; default: break; } } }; } 源: http://hi.baidu.com/w22ee/item/f995a28bc6858b56e73d1978 |
|||
android 代码安装apk包 | android | ||
Intent intent = new Intent(Intent.ACTION_VIEW); Uri uri = Uri.fromFile(apkFile); intent.setDataAndType(uri, "application/vnd.android.package-archive"); context.startActivity(intent); |
|||
android 修改文件夹的权限 | android | ||
public static String exec(String[] args) { String result = ""; ProcessBuilder processBuilder = new ProcessBuilder(args); Process process = null; InputStream errIs = null; InputStream inIs = null; ByteArrayOutputStream baos = null; try { baos = new ByteArrayOutputStream(); int read = -1; process = processBuilder.start(); errIs = process.getErrorStream(); while ((read = errIs.read()) != -1) { baos.write(read); } baos.write('\n'); inIs = process.getInputStream(); while ((read = inIs.read()) != -1) { baos.write(read); } byte[] data = baos.toByteArray(); result = new String(data); } catch (IOException e) { e.printStackTrace(); } catch (Exception e) { e.printStackTrace(); } finally { try { if (errIs != null) { errIs.close(); } if (inIs != null) { inIs.close(); } if (baos != null) { baos.close(); } } catch (IOException e) { Log.i("VCLIENTTOOL", "exec linux command error"); } if (process != null) { process.destroy(); } } return result; } // [文件夹705:drwx---r-x] String[] args1 = {"chmod", "705", apkFile.getParent()}; // [文件604:-rw----r--] String[] args2 = {"chmod", "604", apkFile.getPath()}; |
|||
android 导入工程报verifyerror | android | ||
高版本ADT运行低版本ADT创建的工程可能抛java.lang.VerifyError异常,简单的解决方法是在.classpath文件中添加: <classpathentry exported="true" kind="con" path="com.android.ide.eclipse.adt.LIBRARIES"/> |
|||
2011-05-07 16:40 Messenger 实现Activity与Service通讯、进程通讯(三 Object数据通讯) | android | http://hi.baidu.com/fox_message/item/53b4273395aa25bf633affaa | |
首先我们要知道Messener的send()函数的参数是传递Message信息的, 而Message传递的setData()是Bundle对象,而且Bundle对象传递Object是通过实现Serializable或Parcelable接口(当然这种也是可行的方案) 在这里我们传递的是数据,所以我们可以手动构建一个Bundle传递数据,当然如果这个数据有层次分类就只有考虑以上两种构建方式了可参见http://www.eoeandroid.com/thread-28036-1-1.html 1、在MessengerActivity和MessengerService中创建数据结构类DataStruct.java import android.os.Bundle; public class DataStruct { private String name,gender; private int id,age; //通过Bundle初始化数据 public void fromBundle(Bundle bundle){ id = bundle.getInt(_ID); name = bundle.getString(_NAME); gender = bundle.getString(_GENDER); age = bundle.getInt(_AGE); } //将数据写入到Bundle中 public Bundle toBundle(){ Bundle bundle = new Bundle(); bundle.putInt(_ID, id); bundle.putString(_NAME, name); bundle.putString(_GENDER, gender); bundle.putInt(_AGE, age); return bundle; } public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getGender() { return gender; } public void setGender(String gender) { this.gender = gender; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } //常量数据 public final static String _ID = "_id"; public final static String _NAME = "name"; public final static String _AGE = "age"; public final static String _GENDER = "gender"; } 2、在项目MessengerActivity项目中的MessengerActivity中修改如下: package com.activity; import android.app.Activity; import android.content.ComponentName; import android.content.Context; import android.content.Intent; import android.content.ServiceConnection; import android.os.Bundle; import android.os.Handler; import android.os.IBinder; import android.os.Message; import android.os.Messenger; import android.os.RemoteException; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.TextView; public class MessengerActivity extends Activity { final Messenger mService = new Messenger(new IncomingHandler()); Messenger mServiceSend = null; final IncomingHandler handler = new IncomingHandler(); private boolean mBound; private Button mButton; private TextView mTextView; private DataStruct mDataStruct = new DataStruct(); /* 和服务通讯的主要接口类 */ private ServiceConnection mConnection = new ServiceConnection() { @Override public void onServiceDisconnected(ComponentName name) { // TODO Auto-generated method stub mBound = false; } @Override public void onServiceConnected(ComponentName name, IBinder service) { // TODO Auto-generated method stub /* *通过Messenger于服务会话时,能得到从Service端的IBinder对象 *客服端通过得到的IBinder与Service通讯 */ mServiceSend = new Messenger(service); mBound = true; } }; public void getDataStruct(){ /* *创建并发送消息给Service */ try { Message msg = Message.obtain(handler, MSG.MSG_ONE,0,0); msg.replyTo = mService; if(mServiceSend!=null) mServiceSend.send(msg); } catch (RemoteException e) { e.printStackTrace(); } } /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); mButton = (Button)findViewById(R.id.button1); mTextView = (TextView)findViewById(R.id.textview); mButton.setOnClickListener(new OnClickListener(){ @Override public void onClick(View arg0) { // TODO Auto-generated method stub getDataStruct(); } }); } @Override protected void onDestroy() { // TODO Auto-generated method stub super.onDestroy(); //取消绑定 if(mBound){ unbindService(mConnection); mBound = false; } } @Override protected void onStart() { // TODO Auto-generated method stub super.onStart(); //绑定到服务器 Intent intent = new Intent(); ComponentName component = new ComponentName( "com.Messenger.main", "com.Messenger.main.MessengerService"); intent.setComponent(component); bindService(intent, this.mConnection, Context.BIND_AUTO_CREATE); } /** * 来Service端消息的handler */ class IncomingHandler extends Handler{ @Override public void handleMessage(Message msg) { // TODO Auto-generated method stub super.handleMessage(msg); switch (msg.what) { case MSG.MSG_ONE: mDataStruct.fromBundle(msg.getData()); mTextView.setText("_ID = "+mDataStruct.getId()+ "\n_NAME = "+mDataStruct.getName()+ "\n_AGE = "+mDataStruct.getAge()+ "\n_GENDER = "+mDataStruct.getGender()); break; case MSG.MSG_TWO: break; case MSG.MSG_THREE: break; case MSG.MSG_FOUR: break; default: break; } } } } 2、在项目MessengerService项目中的MessengerService中修改如下: package com.Messenger.main; import android.app.Service; import android.content.Intent; import android.os.Handler; import android.os.IBinder; import android.os.Message; import android.os.Messenger; import android.os.RemoteException; import android.util.Log; import android.widget.Toast; public class MessengerService extends Service { private final String log = "MessengerService"; DataStruct mDataInfo = new DataStruct(); /* 创建发送/接收消息的IncomingHandler */ final Messenger mMessenger = new Messenger(new IncomingHandler()); /** * 来自客户端消息的handler */ class IncomingHandler extends Handler{ @Override public void handleMessage(Message msg) { // TODO Auto-generated method stub super.handleMessage(msg); switch (msg.what) { case MSG.MSG_ONE: try { Message retMsg = Message.obtain(null, MSG.MSG_ONE); retMsg.replyTo = mMessenger; mDataInfo.setId(0); mDataInfo.setAge(19); mDataInfo.setName("张三"); mDataInfo.setGender("男"); retMsg.setData(mDataInfo.toBundle()); msg.replyTo.send(retMsg); } catch (RemoteException e) { // TODO Auto-generated catch block e.printStackTrace(); } break; case MSG.MSG_TWO: break; case MSG.MSG_THREE: break; case MSG.MSG_FOUR: break; default: break; } } } /* 当绑定服务时,返回一个接口给messenger,为了发送消息给服务器 */ @Override public IBinder onBind(Intent intent) { // TODO Auto-generated method stub Log.i(log, "binding."); return mMessenger.getBinder(); } @Override public void onStart(Intent intent, int startId) { // TODO Auto-generated method stub Log.i(log, "Service Start."); super.onStart(intent, startId); } } |
|||
android 调用系统的短信 | android | ||
//短信 Uri smsToUri = Uri.parse("smsto:" + staff.workMobile); intent = new Intent(android.content.Intent.ACTION_SENDTO, smsToUri); startActivity(intent); |
|||
android 实现view的界面的侧滑 | android | ||
在该viewGroup中的init中获取当前的scroller的对象 Scroller scroller = new Scroller(getContext()); 在view的onTouch的事件up的时候 mcScroller.startScroll(0,0,mCurrentIndex*width , 0); invalidate(); 在computeScroll中 if (mScroller.computeScrollOffset()) { scrollTo(mScroller.getCurrX(), mScroller.getCurrY()); postInvalidate(); } |
|||
android 实现view的onTouch事件有效 | android | ||
VelocityTracker mVelocityTracker; 在view的onInterceptTouchEvent和onTouchEvent的方法中添加滑动的事件 if (mVelocityTracker == null) { mVelocityTracker = VelocityTracker.obtain(); } mVelocityTracker.addMovement(ev); 初始化的时候实现 final ViewConfiguration configuration = ViewConfiguration .get(getContext()); // mTouchSlop = configuration.getScaledTouchSlop(); mMaximumVelocity = configuration.getScaledMaximumFlingVelocity(); 捕获up的事件实现: final VelocityTracker velocityTracker = mVelocityTracker; velocityTracker.computeCurrentVelocity(1000, mMaximumVelocity); int velocityX = (int) velocityTracker.getXVelocity(); if (mVelocityTracker != null) { mVelocityTracker.recycle(); mVelocityTracker = null; } |
|||
android 实现编辑图片变灰 | android | ||
public static Bitmap toGrayScale(Bitmap originalbit) { if (null == originalbit) { return null; } int height = originalbit.getHeight(); int width = originalbit.getWidth(); Bitmap bitGrayScale = Bitmap.createBitmap(width, height, Bitmap.Config.RGB_565); Canvas canvas = new Canvas(bitGrayScale); Paint paint = new Paint(); ColorMatrix colorMatrix = new ColorMatrix(); colorMatrix.setSaturation(0); ColorMatrixColorFilter colorFilter = new ColorMatrixColorFilter(colorMatrix); paint.setColorFilter(colorFilter); canvas.drawBitmap(originalbit, 0, 0, paint); return bitGrayScale; } |
|||
android 反射获取资源文件的图片 | android | ||
想要获取一类图片的资源的文件的时候 Field field = R.drawable.class.getDeclaredField("headimage" + id);//id:是图片名是以headimage开始的一类 图片 int resourcesid = Integer.parseInt(field.get(null).toString());//获取图片的真实的id |
|||
android 实现联系人的添加 | |||
private void WriteSingleContact(Contact contact) { //cr 是ContentResolver // DELETE CONTACT Uri personUri = ContactsContract.RawContacts.CONTENT_URI; String where =ContactsContract.Contacts.DISPLAY_NAME+"=?"; cr.delete(personUri,where,new String[] {contact.getDisplayName()}); //上面的几行代码删除某个指定联系人 //向contact 中添加联系人姓名,获得一个Id(rawContactId)作为后面添加信息的依据。 ContentValues values = new ContentValues(); values.put(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME, contact .getDisplayName()); Uri rawContactUri = cr.insert(RawContacts.CONTENT_URI, values); long rawContactId = ContentUris.parseId(rawContactUri); //也可以只添加一个空ContentValues ,来获得rawContactId。 // ContentValues values = new ContentValues(); //首先向RawContacts.CONTENT_URI执行一个空值插入(raw_contacts 表), 为了获取生成的联系人 ID Uri rawContactUri = this.getContext().getContentResolver().insert(RawContacts.CONTENT_URI, values); //• //• //然后获取系统返回的rawContactId , 就是新加入的这个联系人的 ID //• // long rawContactId = ContentUris.parseId(rawContactUri); //添加联系人姓名 values.clear(); values.put(ContactsContract.Data.RAW_CONTACT_ID, rawContactId); values.put(ContactsContract.Data.MIMETYPE, StructuredName.CONTENT_ITEM_TYPE); values.put(StructuredName.DISPLAY_NAME, contact.getDisplayName()); cr.insert(ContactsContract.Data.CONTENT_URI, values); Uri phoneUri = null; Uri emailUri = null; Uri addressUri = null; Uri imUri = null; Uri orgUri = null; Uri noteUri = null; //添加电话号码 for (Phone aPhone : contact.getPhone()) { phoneUri = Uri.withAppendedPath(rawContactUri, ContactsContract.Contacts.Data.CONTENT_DIRECTORY); values.clear(); values.put(ContactsContract.CommonDataKinds.Phone.TYPE, aPhone .getType()); values.put(ContactsContract.CommonDataKinds.Phone.IS_SUPER_PRIMARY, 1); values.put(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE); values.put(ContactsContract.CommonDataKinds.Phone.NUMBER, aPhone .getNumber()); cr.insert(phoneUri, values); } //添加Email for (Email aEmail : contact.getEmail()) { emailUri = Uri.withAppendedPath(rawContactUri, ContactsContract.Contacts.Data.CONTENT_DIRECTORY); values.clear(); values.put(ContactsContract.CommonDataKinds.Email.TYPE, aEmail .getType()); values.put(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.Email.CONTENT_ITEM_TYPE); values.put(ContactsContract.CommonDataKinds.Email.DATA, aEmail .getAddress()); cr.insert(emailUri, values); } for (String aNote : contact.getNotes()) { noteUri = Uri.withAppendedPath(rawContactUri, ContactsContract.Contacts.Data.CONTENT_DIRECTORY); values.clear(); values.put(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.Note.CONTENT_ITEM_TYPE); values.put(ContactsContract.CommonDataKinds.Note.NOTE, aNote); cr.insert(noteUri, values); } //添加IM for (IM aIM : contact.getImAddresses()) { imUri = Uri.withAppendedPath(rawContactUri, ContactsContract.Contacts.Data.CONTENT_DIRECTORY); values.clear(); values.put(ContactsContract.CommonDataKinds.Im.PROTOCOL, aIM .getType()); values.put(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.Im.CONTENT_ITEM_TYPE); values.put(ContactsContract.CommonDataKinds.Im.DATA, aIM.getName()); cr.insert(imUri, values); } 添加Organization for (Organization aORG : contact.getOrganization()) { orgUri = Uri.withAppendedPath(rawContactUri, ContactsContract.Contacts.Data.CONTENT_DIRECTORY); values.clear(); values.put(ContactsContract.CommonDataKinds.Organization.TYPE, aORG .getType()); values.put(ContactsContract.CommonDataKinds.Organization.TITLE, aORG.getTitle()); values .put( ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.Organization.CONTENT_ITEM_TYPE); values.put(ContactsContract.CommonDataKinds.Organization.DATA, aORG .getOrganization()); cr.insert(orgUri, values); } //添加Address,(国家,城市,街道,邮政编码等) for (Address aAdd : contact.getAddresses()) { addressUri = Uri.withAppendedPath(rawContactUri, ContactsContract.Contacts.Data.CONTENT_DIRECTORY); values.clear(); values .put( ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.StructuredPostal.CONTENT_ITEM_TYPE); if (aAdd.getCity() != null) values.put( ContactsContract.CommonDataKinds.StructuredPostal.CITY, aAdd.getCity()); if (aAdd.getCountry() != null) values .put( ContactsContract.CommonDataKinds.StructuredPostal.COUNTRY, aAdd.getCountry()); if (aAdd.getPoBox() != null) values .put( ContactsContract.CommonDataKinds.StructuredPostal.POBOX, aAdd.getPoBox()); if (aAdd.getPostalCode() != null) values .put( ContactsContract.CommonDataKinds.StructuredPostal.POSTCODE, aAdd.getPostalCode()); if (aAdd.getStreet() != null) values .put( ContactsContract.CommonDataKinds.StructuredPostal.STREET, aAdd.getStreet()); if (aAdd.getState() != null) values .put( ContactsContract.CommonDataKinds.StructuredPostal.REGION, aAdd.getState()); values.put(ContactsContract.CommonDataKinds.StructuredPostal.TYPE, aAdd.getType()); cr.insert(addressUri, values); } } public boolean WriteContact(ArrayList<Contact> LstContact) { try { for (Contact contact : LstContact) { WriteSingleContact(contact); } return true; } catch (Exception ex) { Log.d("ERROR", ex.toString()); return false; } } } |
|||
7 | |||
/** * 获取手机的联系人 */ private BroadcastReceiver operContact = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { //显示所有的联系人 if (ConstValue.QUERY_ALLCONTACTLIST.equals(intent.getAction())|| ConstValue.DEL_CONTACT.equals(intent.getAction())|| ConstValue.UPDATE_CONTACT.equals(intent.getAction())) { loadLocalContact(); } } }; /** * 实现控件的点击事件 * * @param v * * 要实现点击事件的view * * @see onClick */ @Override public void onClick(View v) { switch(v.getId()) { //创建分组 case R.id.new_builder: if(!PersonLogic.getInstance().isOper()) { break; } PersonLogic.getInstance().showGroupCreateDialog(this.getParent()); break; default: break; } } /** * 输入框中的值变化之前执行的函数 * * @param s * * 输入框中的值 * * @param start * * start * * @param count * * count * * @param after * * after * * @see beforeTextChanged */ @Override public void beforeTextChanged(CharSequence s, int start, int count, int after) { } /** * 输入框的值的变化 * * @param s * * 输入框中的值 * * @param start * * start * * @param before * * before * * @param count * * count * * @see onTextChanged */ @Override public void onTextChanged(CharSequence s, int start, int before, int count) { } /** * 输入框中的值变化之后 * * @param s * * 输入框 * * @see afterTextChanged */ @Override public void afterTextChanged(Editable s) { String value = s.toString(); if (!StringUtils.isEmpty(value)) { ((BootApp)getApplication()).personOperIndex = ConstValue.NO_RRSULT; listPersons = PersonLogic.getInstance().getContactByInput(value); searchcontactListView.setVisibility(View.VISIBLE); letterListView.setVisibility(View.GONE); contactsListView.setVisibility(View.GONE); if (null != personSearchadapter) { personSearchadapter.setListPerson(listPersons); } } else { searchcontactListView.setVisibility(View.GONE); contactsListView.setVisibility(View.VISIBLE); letterListView.setVisibility(View.VISIBLE); } } } |
|||
6 | |||
/** * 处理listView的滚动的事件 * * @param view * * 上下文 * * @param firstVisibleItem * * 显示的第一个iten的位置 * * @param visibleItemCount * * 显示的item的条数 * * @param totalItemCount * * item的总的条数 * * @see onScroll */ @Override public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) { if (visible) { Contact contact = ((Contact)contactsListView.getItemAtPosition(firstVisibleItem)); Contact contact1 = null; if(firstVisibleItem<totalItemCount) { contact1 = ((Contact)contactsListView.getItemAtPosition(firstVisibleItem+1)); } String str = contact.contactName; if (!StringUtils.isEmpty(str)) { text.setText(str.toString().substring(0, 1)); } text.setVisibility(View.VISIBLE); contactsListView.setOffy(0); if(null != contact1 && !StringUtils.isEmpty(contact1.letter)) { View fistView = view.getChildAt(0); int bottom = fistView.getBottom(); if(bottom<31) { contactsListView.setOffy(bottom-31); } } if (!StringUtils.isEmpty(contact.currentLetter)) { textViewletter.setText(contact.currentLetter.toUpperCase()); contactsListView.setTextView(textViewletter); } mainHandler.removeCallbacks(overlayThread); //延迟一秒后执行,让overlay为不可见 mainHandler.postDelayed(overlayThread, 1000); } } /** * * 设置中间显示的不可见 * * * @author sKF61027 * @version [版本号, 2012-2-21] * @see [相关类/方法] * @since [产品/模块版本] */ private class OverlayThread implements Runnable { /** * run */ @Override public void run() { text.setVisibility(View.INVISIBLE); } } |
|||
5 | |||
/** * 加载本地联系人 * * @see loadNativeContact */ private void loadLocalContact() { handler.post(new Runnable() { @Override public void run() { PersonLogic.getInstance().getAllContact(handler); } }); } /** * 实现字母的滑动的接口函数 * * @param s * * 点击的值 * * @see onTouchingLetterChanged */ @Override public void onTouchingLetterChanged(String s) { if (null != alphaIndexer && alphaIndexer.get(s) != null) { int position = alphaIndexer.get(s); contactsListView.setSelection(position); text.setText(((Contact)contactsListView.getItemAtPosition(position)).contactName.substring(0, 1) .toUpperCase()); text.setVisibility(View.VISIBLE); mainHandler.removeCallbacks(overlayThread); //延迟一秒后执行,让overlay为不可见 mainHandler.postDelayed(overlayThread, 1000); } } /** * 处理listView的状态的改变的函数 * * @param view * * 上下文 * * @param scrollState * * 状态 * * @see onScrollStateChanged */ @Override public void onScrollStateChanged(AbsListView view, int scrollState) { visible = true; if (scrollState == ListView.OnScrollListener.SCROLL_STATE_IDLE) { text.setVisibility(View.INVISIBLE); } } |
|||
4 | |||
/** * onDestory * * @see onDestroy */ @Override protected void onDestroy() { unregisterReceiver(operContact); super.onDestroy(); } /** * 注册监听事件 * * @see setListener */ private void setListener() { contactsListView.setOnScrollListener(this); letterListView.setOnTouchingLetterChangedListener(this); //实现创建分组的点击事件 createPriGroup.setOnClickListener(this); //设置输入框的监听事件 searchContactEditText.addTextChangedListener(this); } /** * 初始化各个控件 * * @see initView */ private void initView() { //初始化联系人显示的控件 contactsListView = (PersonListView)this.findViewById(R.id.contacts_listview); //初始化查询出联系人的listView searchcontactListView = (ListView)this.findViewById(R.id.search_contact); //初始化化字母的列表 letterListView = (MyLetterListView)this.findViewById(R.id.MyLetterListView01); //初始化中间显示的view text = (TextView)findViewById(R.id.TextView_CenterChar); //初始化创建分组的按钮 createPriGroup = (ImageView)this.findViewById(R.id.new_builder); //初始界面显示的线程 overlayThread = new OverlayThread(); //联系人搜索框 searchContactEditText = (EditText)this.findViewById(R.id.localEditText); //初始化handler mainHandler = new Handler(getMainLooper()); } |
|||
3 | |||
/** * 初始化popupwindow * * @see initPop */ private void initLetterBar() { textViewletter = new TextView(this); textViewletter.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT, 31)); textViewletter.setPadding(12, 0, 0, 0); textViewletter.setTextColor(R.color.black); textViewletter.setGravity(Gravity.CENTER_VERTICAL); textViewletter.setBackgroundResource(R.drawable.contact_zm_bg); } /** * onCreate * * @param savedInstanceState * * 上下文 */ @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.showall_native); //初始化各个控件 initView(); //初始化popupwindow initLetterBar(); //注册监听事件 setListener(); //注册联系人的查询的广播事件 IntentFilter intentFilter = new IntentFilter(); intentFilter.addAction(ConstValue.QUERY_ALLCONTACTLIST); intentFilter.addAction(ConstValue.DEL_CONTACT); intentFilter.addAction(ConstValue.UPDATE_CONTACT); registerReceiver(operContact, intentFilter); //加载联系人 loadLocalContact(); //获取传来的操作的类型 Intent intent = getIntent(); if(null != intent) { type = intent.getStringExtra("type"); if(!StringUtils.isEmpty(type)) { createPriGroup.setVisibility(View.GONE); } } //初始化查询出联系人的适配器 personSearchadapter = new PersonSearhAdapter(this, type); searchcontactListView.setAdapter(personSearchadapter); } /** * onResume * * @see onResume */ @Override protected void onResume() { super.onResume(); } |
|||
2 | |||
/** * 声明handler用于界面的更新 */ private Handler handler = new Handler() { @Override public void handleMessage(Message msg) { super.handleMessage(msg); switch (msg.what) { case ConstValue.ZERO: List<Contact> list = (List<Contact>)msg.obj; List<Contact> list1 = new ArrayList<Contact>(); if (null != list) { contactsListView.setAdapter(null); PersonSearhAdapter contactAdapter = new PersonSearhAdapter(ShowAllLocalActivity.this, type); //显示联系人的信息 contactsListView.setAdapter(contactAdapter); //初始化数组和map sections = new String[list.size()]; alphaIndexer = new HashMap<String, Integer>(); String tempStrletter = ""; PinyinDBHelper pdb = new PinyinDBHelper(Global.getInstance().getContext()); for (int i = 0; i < list.size(); i++) { Contact contact = list.get(i); // List<String> listindex = ContactUtils.Name2Pinyin(contact.contactName,pdb); String tempStr = ""; if (!StringUtils.isEmpty(contact.jianPin)) { tempStr = contact.jianPin.substring(0,1); } //获取当前汉语的首字母 String currentStr = tempStr.length() > 0 ? tempStr.substring(0, 1) : " "; //获取前面得字母 String previewStr = (i - 1) >= 0 ? tempStrletter : " "; if (!StringUtils.isEmpty(currentStr)) { char[] buf = currentStr.toCharArray(); if ('0' <= buf[0] && buf[0] <= '9') { currentStr = "#"; } } if (StringUtils.isEmpty(textViewletter.getText().toString())) { textViewletter.setText(currentStr); } contact.currentLetter = contact.letter = currentStr; if (!previewStr.equals(currentStr)) { alphaIndexer.put(currentStr.toUpperCase(), i); sections[i] = currentStr.toUpperCase(); } else { contact.letter = ""; } list1.add(contact); tempStrletter = currentStr; } pdb.colsePinyinDB(); pdb = null; contactAdapter.setListPerson(list1); contactsListView.setTextView(textViewletter); } break; default: break; } } }; |
|||
android 绘制带拼音的view1 | android | ||
/** * 文 件 名: ShowAllNativeActivity.java * 版 权: Huawei Technologies Co., Ltd. Copyright YYYY-YYYY, All rights reserved * 描 述: <描述> * 修 改 人: sKF61027 * 修改时间: 2012-2-20 * 跟踪单号: <跟踪单号> * 修改单号: <修改单号> * 修改内容: <修改内容> */ package com.huawei.ecs.person.ui; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.text.Editable; import android.text.TextWatcher; import android.view.Gravity; import android.view.View; import android.view.View.OnClickListener; import android.view.ViewGroup.LayoutParams; import android.widget.AbsListView; import android.widget.AbsListView.OnScrollListener; import android.widget.EditText; import android.widget.ImageView; import android.widget.ListView; import android.widget.TextView; import com.huawei.ecs.R; import com.huawei.ecs.comm.ConstValue; import com.huawei.ecs.comm.boot.BootApp; import com.huawei.ecs.comm.ui.BaseActivity; import com.huawei.ecs.message.data.Contact; import com.huawei.ecs.msg.view.MyLetterListView; import com.huawei.ecs.msg.view.MyLetterListView.OnTouchingLetterChangedListener; import com.huawei.ecs.person.adapter.PersonSearhAdapter; import com.huawei.ecs.person.logic.PersonLogic; import com.huawei.ecs.person.view.PersonListView; import com.huawei.ecs.sdk.comm.env.Global; import com.huawei.ecs.sdk.comm.util.StringUtils; import com.huawei.ecs.sdk.data.dbhelper.impl.PinyinDBHelper; /** * 展示查询出来的native联系人 * * * @author sKF61027 * @version [版本号, 2012-2-20] * @see [相关类/方法] * @since [产品/模块版本] */ public class ShowAllLocalActivity extends BaseActivity implements OnScrollListener, OnTouchingLetterChangedListener,OnClickListener,TextWatcher { /** * 显示native的联系人 */ private PersonListView contactsListView; /** * 显示查询出来的联系人 */ private ListView searchcontactListView; /** * 消息Handler */ private Handler mainHandler; /** * 中间的提示框 */ private OverlayThread overlayThread; /** * 创建分组 */ private ImageView createPriGroup; /** * 右边字母索引列表 */ private MyLetterListView letterListView; /** * 存放存在的汉语拼音首字母和与之对应的列表位置 */ private HashMap<String, Integer> alphaIndexer; /** * 存放存在的汉语拼音首字母 */ private String[] sections; /** * 操作的类型 */ private String type=""; /** * 是否显示拼音的标志位 */ private boolean visible; /** * 中间的提示框显示的消息 */ private TextView text; /** * 显示选中item的字母 */ private TextView textViewletter; /** * 联系人查询搜索框 */ private EditText searchContactEditText; /** * 用于保存查询出来的联系人的列表的集合 */ private List<Contact> listPersons; /** * 联系人查询的赋值的适配器 */ private PersonSearhAdapter personSearchadapter; |
|||
android 绘制带拼音的view | android | ||
package com.huawei.ecs.msg.view; import android.content.Context; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.graphics.Typeface; import android.util.AttributeSet; import android.view.MotionEvent; import android.view.View; public class MyLetterListView extends View { OnTouchingLetterChangedListener onTouchingLetterChangedListener; String[] charList = {"#", "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z"}; int choose = -1; Paint paint = new Paint(); boolean showBkg = false; public MyLetterListView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); } public MyLetterListView(Context context, AttributeSet attrs) { super(context, attrs); } public MyLetterListView(Context context) { super(context); } @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); if (showBkg) { paint.setColor(Color.parseColor("#000000")); canvas.drawColor(Color.parseColor("#40000000")); } int height = getHeight(); int width = getWidth(); int singleHeight = height / charList.length; for (int i = 0; i < charList.length; i++) { paint.setColor(Color.parseColor("#B4BEC8")); paint.setTypeface(Typeface.DEFAULT_BOLD); paint.setAntiAlias(true); paint.setTextSize(15); if (i == choose) { paint.setColor(Color.parseColor("#3399ff")); paint.setFakeBoldText(true); } float xPos = width / 2 - paint.measureText(charList[i]) / 2; float yPos = singleHeight * i + singleHeight; canvas.drawText(charList[i], xPos, yPos, paint); paint.reset(); } } @Override public boolean dispatchTouchEvent(MotionEvent event) { final int action = event.getAction(); final float y = event.getY(); final int oldChoose = choose; final OnTouchingLetterChangedListener listener = onTouchingLetterChangedListener; final int c = (int)(y / getHeight() * charList.length); switch (action) { case MotionEvent.ACTION_DOWN: showBkg = true; if (oldChoose != c && listener != null) { if (c >=0 && c < charList.length) { listener.onTouchingLetterChanged(charList[c]); choose = c; invalidate(); } } break; case MotionEvent.ACTION_MOVE: if (oldChoose != c && listener != null) { if (c > 0 && c < charList.length) { listener.onTouchingLetterChanged(charList[c]); choose = c; invalidate(); } } break; case MotionEvent.ACTION_UP: showBkg = false; choose = -1; invalidate(); break; } return true; } @Override public boolean onTouchEvent(MotionEvent event) { return super.onTouchEvent(event); } public void setOnTouchingLetterChangedListener(OnTouchingLetterChangedListener onTouchingLetterChangedListener) { this.onTouchingLetterChangedListener = onTouchingLetterChangedListener; } public interface OnTouchingLetterChangedListener { public void onTouchingLetterChanged(String s); } } |
|||
android NDK .base_profile的书写 | android | ||
# base-files version 4.0-6 # ~/.bash_profile: executed by bash(1) for login shells. # The latest version as installed by the Cygwin Setup program can # always be found at /etc/defaults/etc/skel/.bash_profile # Modifying /etc/skel/.bash_profile directly will prevent # setup from updating it. # The copy in your home directory (~/.bash_profile) is yours, please # feel free to customise it to create a shell # environment to your liking. If you feel a change # would be benifitial to all, please feel free to send # a patch to the cygwin mailing list. # User dependent .bash_profile file # source the users bashrc if it exists if [ -f "${HOME}/.bashrc" ] ; then source "${HOME}/.bashrc" fi # Set PATH so it includes user's private bin if it exists # if [ -d "${HOME}/bin" ] ; then # PATH="${HOME}/bin:${PATH}" # fi # Set MANPATH so it includes users' private man if it exists # if [ -d "${HOME}/man" ]; then # MANPATH="${HOME}/man:${MANPATH}" # fi # Set INFOPATH so it includes users' private info if it exists # if [ -d "${HOME}/info" ]; then # INFOPATH="${HOME}/info:${INFOPATH}" # fi NDK=/cygdrive/d/android-ndk-r5 export NDK |
|||
android 实现联系人字母变化 | android | ||
public class MyLetterListView extends View { OnTouchingLetterChangedListener onTouchingLetterChangedListener; String[] charList = {"#", "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z"}; int choose = -1; Paint paint = new Paint(); boolean showBkg = false; public MyLetterListView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); } public MyLetterListView(Context context, AttributeSet attrs) { super(context, attrs); } public MyLetterListView(Context context) { super(context); } @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); if (showBkg) { paint.setColor(Color.parseColor("#000000")); //canvas.drawColor(Color.parseColor("#40000000")); } int height = getHeight(); int width = getWidth(); int singleHeight = height / charList.length; for (int i = 0; i < charList.length; i++) { paint.setColor(Color.parseColor("#C4C4C4")); paint.setTypeface(Typeface.DEFAULT_BOLD); paint.setAntiAlias(true); paint.setTextSize(15); if (i == choose) { paint.setColor(Color.parseColor("#3399ff")); paint.setFakeBoldText(true); } float xPos = width / 2 - paint.measureText(charList[i]) / 2; float yPos = singleHeight * i + singleHeight; canvas.drawText(charList[i], xPos, yPos, paint); paint.reset(); } } @Override public boolean dispatchTouchEvent(MotionEvent event) { final int action = event.getAction(); final float y = event.getY(); final int oldChoose = choose; final OnTouchingLetterChangedListener listener = onTouchingLetterChangedListener; final int c = (int)(y / getHeight() * charList.length); switch (action) { case MotionEvent.ACTION_DOWN: showBkg = true; if (oldChoose != c && listener != null) { if (c > 0 && c < charList.length) { listener.onTouchingLetterChanged(charList[c]); choose = c; invalidate(); } } break; case MotionEvent.ACTION_MOVE: if (oldChoose != c && listener != null) { if (c > 0 && c < charList.length) { listener.onTouchingLetterChanged(charList[c]); choose = c; invalidate(); } } break; case MotionEvent.ACTION_UP: showBkg = false; choose = -1; invalidate(); break; } return true; } @Override public boolean onTouchEvent(MotionEvent event) { return super.onTouchEvent(event); } public void setOnTouchingLetterChangedListener(OnTouchingLetterChangedListener onTouchingLetterChangedListener) { this.onTouchingLetterChangedListener = onTouchingLetterChangedListener; } public interface OnTouchingLetterChangedListener { public void onTouchingLetterChanged(String s); } } |
|||
java 格林时间和普通的时间相互转换 | java | ||
//格林时间转long SimpleDateFormat Gmt = new SimpleDateFormat("EEE, d MMM yyyy HH:mm:ss z",Locale.ENGLISH); return Gmt.parse(gmtTime).getTime(); //long转格林事件 Date date = new Date(); SimpleDateFormat format1 = new SimpleDateFormat("EEE, d MMM ", Locale.US); SimpleDateFormat format2 = new SimpleDateFormat("HH:mm:ss 'GMT'", Locale.US); TimeZone gmtZone = TimeZone.getTimeZone("GMT"); format1.setTimeZone(gmtZone); format2.setTimeZone(gmtZone); GregorianCalendar gc = new GregorianCalendar(gmtZone); return format1.format(date) + gc.get(Calendar.YEAR) + format2.format(date); |
|||
android 监听网络的变化 | android | http://www.cnblogs.com/over140/archive/2011/01/27/1945964.html | |
当然,首先要加权限 <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <receiver 2 android:name="NetworkReceiver"> 3 <intent-filter> 4 <action android:name="android.net.conn.CONNECTIVITY_CHANGE" /> 5 </intent-filter> 6 7 </receiver> public class NetworkReceiver extends BroadcastReceiver { 02 03 protected Context mContext; 04 05 @Override 06 public void onReceive(Context context, Intent intent) { 07 mContext = context; 08 // 第一种 09 ConnectivityManager connectivityManager = (ConnectivityManager) context 10 .getSystemService(Context.CONNECTIVITY_SERVICE); 11 NetworkInfo activeNetInfo = connectivityManager.getActiveNetworkInfo(); 12 NetworkInfo mobileNetInfo = connectivityManager 13 .getNetworkInfo(ConnectivityManager.TYPE_MOBILE); 14 showToast("Active Network Type", activeNetInfo); 15 showToast("Mobile Network Type", mobileNetInfo); 16 // 第二种 17 NetworkInfo networkInfo = intent 18 .getParcelableExtra(ConnectivityManager.EXTRA_NETWORK_INFO); 19 String extraInfo = intent 20 .getStringExtra(ConnectivityManager.EXTRA_EXTRA_INFO); 21 boolean isFailOver = intent.getBooleanExtra( 22 ConnectivityManager.EXTRA_IS_FAILOVER, false); 23 boolean noConnectivity = intent.getBooleanExtra( 24 ConnectivityManager.EXTRA_NO_CONNECTIVITY, false); 25 NetworkInfo otherNetworkInfo = intent 26 .getParcelableExtra(ConnectivityManager.EXTRA_OTHER_NETWORK_INFO); 27 String reason = intent.getStringExtra(ConnectivityManager.EXTRA_REASON); 28 // 29 showToast("networkInfo", networkInfo); 30 showToast("extraInfo", extraInfo); 31 showToast("isFailOver", isFailOver); 32 showToast("noConnectivity", noConnectivity); 33 showToast("otherNetworkInfo", otherNetworkInfo); 34 showToast("reason", reason); 35 } 36 37 public void showToast(String info, Object object) { 38 if (object == null) { 39 return; 40 } 41 Toast.makeText(mContext, info + " : " + object.toString(), 0).show(); 42 } 43 44 } 在开发android应用时,涉及到要进行网络访问,时常需要进行网络状态的检查,以提供给用户必要的提醒。一般可以通过ConnectivityManager来完成该工作。 ConnectivityManager有四个主要任务: 1、监听手机网络状态(包括GPRS,WIFI, UMTS等) 2、手机状态发生改变时,发送广播 3、当一个网络连接失败时进行故障切换 4、为应用程序提供可以获取可用网络的高精度和粗糙的状态 当我们要在程序中监听网络状态时,只要以下几个步骤即可: 1、定义一个Receiver重载其中的onReceive函数,在其中完成所需要的功能,如根据WIFI和GPRS是否断开 import android.app.Activity; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.net.ConnectivityManager; import android.net.NetworkInfo; import android.os.Handler; public class NetstateReceiver extends BroadcastReceiver { private Handler mHandler; private Activity mAct; private NetstateReceiver mReceiver; public final static int IS_CONNECTED = 5; public final static int IS_NOT_CONNECTED = 6; private NetstateReceiver() { super(); } public NetstateReceiver(Handler handler,Activity act) { mHandler = handler; mAct = act; if(mReceiver == null) mReceiver = new NetstateReceiver(); } @Override public void onReceive(Context context, Intent intent) { ConnectivityManager manager = (ConnectivityManager)context.getSystemService(Context.CONNECTIVITY_SERVICE); NetworkInfo gprs = manager.getNetworkInfo(ConnectivityManager.TYPE_MOBILE); NetworkInfo wifi = manager.getNetworkInfo(ConnectivityManager.TYPE_WIFI); if(!gprs.isConnected() && !wifi.isConnected()) { mHandler.sendEmptyMessage(IS_NOT_CONNECTED); } else { mHandler.sendEmptyMessage(IS_CONNECTED); } } public void register() { IntentFilter filter = new IntentFilter(Context.CONNECTIVITY_SERVICE); mAct.registerReceiver(mReceiver, filter); } public void unregister() { mAct.unregisterReceiver(mReceiver); } |
|||
android 实现软件盘得隐藏 | android | ||
//隐藏软件盘 InputMethodManager m = (InputMethodManager)this.getSystemService(INPUT_METHOD_SERVICE); if (null != m && null != this.getCurrentFocus()) { m.hideSoftInputFromWindow(this.getCurrentFocus().getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS); } |
|||
android 添加联系人的过滤事件 | android | ||
<!-- 编辑联系人 --> <intent-filter > <action android:name="android.intent.action.EDIT" /> <category android:name="android.intent.category.DEFAULT" /> <data android:mimeType="vnd.android.cursor.item/person" android:host="contacts" /> <data android:mimeType="vnd.android.cursor.item/contact" android:host="com.android.contacts" /> <data android:mimeType="vnd.android.cursor.item/raw_contact" android:host="com.android.contacts" /> </intent-filter> <!-- 插入联系人 --> <intent-filter > <action android:name="android.intent.action.INSERT" /> <category android:name="android.intent.category.DEFAULT" /> <data android:mimeType="vnd.android.cursor.dir/person" /> <data android:mimeType="vnd.android.cursor.dir/contact" /> <data android:mimeType="vnd.android.cursor.dir/raw_contact" /> </intent-filter> <!-- 点击拨号按钮跳转到该界面 --> <intent-filter> <action android:name="android.intent.action.CALL_BUTTON" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> <!-- 当是打电话的时候,电话结束了,回调用该界面来显示 --> <intent-filter> <action android:name="android.intent.action.VIEW" /> <category android:name="android.intent.category.DEFAULT" /> <category android:name="android.intent.category.BROWSABLE" /> <data android:mimeType="vnd.android.cursor.dir/calls" /> </intent-filter> |
|||
android 实现qq的好友的功能 | android | http://www.eoeandroid.com/thread-148866-1-1.html | |
主要代码:PinnedHeaderListView.java /** * @author douzifly * * @Date 2011-9-13 */ /** * 可固定标题的ExpandableListView * * @author douzifly * @date 2011-9-13 */ public class PinnedExpandableListView extends ExpandableListView implements OnScrollListener { /** * 该ListView的Adapter必须实现该接口 * * @author LiuXiaoyuan@hh.com.cn * @date 2011-9-13 */ public interface PinnedExpandableListViewAdapter { /** * 固定标题状态:不可见 */ public static final int PINNED_HEADER_GONE = 0; /** * 固定标题状态:可见 */ public static final int PINNED_HEADER_VISIBLE = 1; /** * 固定标题状态:正在往上推 */ public static final int PINNED_HEADER_PUSHED_UP = 2; public int getPinnedHeaderState(int groupPosition, int childPosition); public void configurePinnedHeader(View header, int groupPosition, int childPosition, int alpha); } private static final int MAX_ALPHA = 255; private PinnedExpandableListViewAdapter mAdapter; private View mHeaderView; private boolean mHeaderVisible; private int mHeaderViewWidth; private int mHeaderViewHeight; private OnClickListener mPinnedHeaderClickLisenter; public void setOnPinnedHeaderClickLisenter(OnClickListener listener) { mPinnedHeaderClickLisenter = listener; } public PinnedExpandableListView(Context context, AttributeSet attrs) { super(context, attrs); setOnScrollListener(this); } public void setPinnedHeaderView(View view) { mHeaderView = view; if (mHeaderView != null) { setFadingEdgeLength(0); } requestLayout(); } @Override public void setAdapter(ExpandableListAdapter adapter) { super.setAdapter(adapter); mAdapter = (PinnedExpandableListViewAdapter) adapter; } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { super.onMeasure(widthMeasureSpec, heightMeasureSpec); if (mHeaderView != null) { measureChild(mHeaderView, widthMeasureSpec, heightMeasureSpec); mHeaderViewWidth = mHeaderView.getMeasuredWidth(); mHeaderViewHeight = mHeaderView.getMeasuredHeight(); } } private int mOldState = -1; @Override protected void onLayout(boolean changed, int l, int t, int r, int b) { super.onLayout(changed, l, t, r, b); final long flatPostion = getExpandableListPosition(getFirstVisiblePosition()); final int groupPos = ExpandableListView.getPackedPositionGroup(flatPostion); final int childPos = ExpandableListView.getPackedPositionChild(flatPostion); int state = mAdapter.getPinnedHeaderState(groupPos, childPos); //只有在状态改变时才layout,这点相当重要,不然可能导致视图不断的刷新 if (mHeaderView != null && mAdapter != null && state != mOldState) { mOldState = state; mHeaderView.layout(0, 0, mHeaderViewWidth, mHeaderViewHeight); } configureHeaderView(groupPos, childPos); } public void configureHeaderView(int groupPosition, int childPosition) { if (mHeaderView == null || mAdapter == null) { return; } final int state = mAdapter.getPinnedHeaderState(groupPosition, childPosition); switch (state) { case PinnedExpandableListViewAdapter.PINNED_HEADER_GONE: { mHeaderVisible = false; break; } case PinnedExpandableListViewAdapter.PINNED_HEADER_VISIBLE: { mAdapter.configurePinnedHeader(mHeaderView, groupPosition, childPosition, MAX_ALPHA); if (mHeaderView.getTop() != 0) { mHeaderView.layout(0, 0, mHeaderViewWidth, mHeaderViewHeight); } mHeaderVisible = true; break; } case PinnedExpandableListViewAdapter.PINNED_HEADER_PUSHED_UP: { final View firstView = getChildAt(0); if (firstView == null) { break; } int bottom = firstView.getBottom(); int headerHeight = mHeaderView.getHeight(); int y; int alpha; if (bottom < headerHeight) { y = bottom - headerHeight; alpha = MAX_ALPHA * (headerHeight + y) / headerHeight; } else { y = 0; alpha = MAX_ALPHA; } mAdapter.configurePinnedHeader(mHeaderView, groupPosition, childPosition, alpha); if (mHeaderView.getTop() != y) { mHeaderView.layout(0, y, mHeaderViewWidth, mHeaderViewHeight + y); } mHeaderVisible = true; break; } default: break; } } @Override protected void dispatchDraw(Canvas canvas) { super.dispatchDraw(canvas); //由于HeaderView并没有添加到ExpandableListView的子控件中,所以要draw他 if (mHeaderVisible) { drawChild(canvas, mHeaderView, getDrawingTime()); } } private float mDownX; private float mDownY; private static final float FINGER_WIDTH = 20; @Override public boolean onTouchEvent(MotionEvent ev) { if (mHeaderVisible) { switch (ev.getAction()) { case MotionEvent.ACTION_DOWN: mDownX = ev.getX(); mDownY = ev.getY(); if (mDownX <= mHeaderViewWidth && mDownY <= mHeaderViewHeight ) { return true; } break; case MotionEvent.ACTION_UP: float x = ev.getX(); float y = ev.getY(); float offsetX = Math.abs(x - mDownX); float offsetY = Math.abs(y - mDownY); // 如果在固定标题内点击了,那么触发事件 if (x <= mHeaderViewWidth && y <= mHeaderViewHeight && offsetX <= FINGER_WIDTH && offsetY <= FINGER_WIDTH) { if (mPinnedHeaderClickLisenter != null) { mPinnedHeaderClickLisenter.onClick(mHeaderView); } return true; } break; default: break; } } return super.onTouchEvent(ev); } @Override public void onScrollStateChanged(AbsListView view, int scrollState) { } @Override public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) { final long flatPos = getExpandableListPosition(firstVisibleItem); int groupPosition = ExpandableListView.getPackedPositionGroup(flatPos); int childPosition = ExpandableListView.getPackedPositionChild(flatPos); Log.d("TEST", "configure in onScroll"); configureHeaderView(groupPosition, childPosition); } } 一般情况下,通过继承该类来使用,列表标题当前的状态(可见,不可见,正在推动)由Adapter来决定,所以Adapter里面的代码就相当重要了。以下是我的一个实现: @Override public int getPinnedHeaderState(int groupPosition, int childPosition) { final int childCount = getChildrenCount(groupPosition); if(childPosition == childCount - 1){ return PINNED_HEADER_PUSHED_UP; }else if(childPosition == -1 && !BlockListView.this.isGroupExpanded(groupPosition)){ return PINNED_HEADER_GONE; }else { return PINNED_HEADER_VISIBLE; } } @Override public void configurePinnedHeader(View header, int groupPosition, int childPosition, int alpha) { TextView pinned = (TextView) header; pinned.setText((String)getGroup(groupPosition)); } 01.当然需要在子类初始化的地方加上对HeaderView的配置 当然需要在子类初始化的地方加上对HeaderView的配置 ? txtPinned = new TextView(context); txtPinned.setTextSize(mGroupTextSize); txtPinned.setBackgroundResource(mGroupBgDrawableId); AbsListView.LayoutParams lp = new AbsListView.LayoutParams(-1, -2); txtPinned.setLayoutParams(lp); txtPinned.setTextColor(Color.WHITE); setPinnedHeaderView(txtPinned); setOnPinnedHeaderClickLisenter(new OnClickListener() { @Override public void onClick(View v) { final long flatPos = getExpandableListPosition(getFirstVisiblePosition()); final int groupPos = ExpandableListView.getPackedPositionGroup(flatPos); collapseGroup(groupPos); } }); 这样,上图中的效果就实现了。 需要注意的就是HeaderView并没有加入到ExpandableListView的子控件中,所以要重写dispatchDraw函数,并在里面绘制HeaderView,这样导致一个问题就是直接在HeaderView上面设置的click监听函数无效,所以需要重写onTouchEvent来模拟在HeaderView上的OnClick事件。 以上是引用博客园http://www.cnblogs.com/douzifly/archive/2011/09/13/2175027.html 最近把通讯录联系人列表处单独提取出来了。不过还是有些小问题没有处理,这里贴出源码给需要的童鞋参考参考吧, 再windows下需要 完整froyo,jar包。 android.jar不能编译通过 压缩包大概30MB 一般这个包能够让你再windows环境下调试系统APP源码,并且编译通过。 使用方法:properites-> libraries->romove系统自带->Add library->user library ->usrs libraries->new-> 名称随便取如:AndroidFull-froyo,勾上system library->add JARS 解压那四个jar文件->ok 项目clean-> build就OK 下载地址: http://115.com/file/bhyn7ncb#4_android.jar http://115.com/file/bhyn7v5q#3_android-common_intermediates-classes-full-names.jar http://115.com/file/dn3jzt8y#2_layoutlib.jar http://115.com/file/aqv8gcnl#1_framework_intermediates-classes-full-names.jar |
|||
设置Gallry的中图片的显示位置 | android | ||
gallery.setOnItemSelectedListener(new OnItemSelectedListener() { @Override public void onItemSelected(AdapterView parent, View v, int position,long id) { if(position > galley.getCount()-3 || position < 2) gallery.setSelection(gallery.getPosition()); else if(position != gallery.getPosition()) gallery.setPosition(position); } } |
|||
android 动态设置系统的语言环境 | android | ||
String able= getResources().getConfiguration().locale.getCountry(); Configuration config = getResources().getConfiguration(); DisplayMetrics dm = getResources() .getDisplayMetrics(); config.locale = Locale.SIMPLIFIED_CHINESE; getResources().updateConfiguration(config, dm); |