当前位置:  编程技术>移动开发
本页文章导读:
    ▪ContentProvider 示例        【原创】ContentProvider 示例 package com.firewings.smstools; import java.util.HashMap; import java.util.LinkedHashMap; import java.util.List; import android.content.ContentProvider; import android.content.ContentUris; import .........
    ▪ 兑现在popwindow中展示listview列表        实现在popwindow中展示listview列表 之前我实现了在listview中显示图片和checkbox,具体看这儿:http://gqdy365.iteye.com/blog/992340 接下来我将上述listview添加到popupwindow窗口中。关于这个listview我就再不.........
    ▪ 2.3 dialog 图标小时的有关问题       2.3 dialog 图标小时的问题 发现2.3里面没有android.R.drawable.ic_dialog_xxxx 这几个图标,如果直接调用的话是不行的 看来只能从以前的复制进来了 ......

[1]ContentProvider 示例
    来源: 互联网  发布时间: 2014-02-18
【原创】ContentProvider 示例

package com.firewings.smstools;  
  
import java.util.HashMap;  
import java.util.LinkedHashMap;  
import java.util.List;  
  
import android.content.ContentProvider;  
import android.content.ContentUris;  
import android.content.ContentValues;  
import android.content.Context;  
import android.content.UriMatcher;  
import android.content.pm.PackageManager;  
import android.database.Cursor;  
import android.database.sqlite.SQLiteDatabase;  
import android.database.sqlite.SQLiteQueryBuilder;  
import android.database.sqlite.SQLiteTransactionListener;  
import android.net.Uri;  
import android.os.Binder;  
import android.provider.BaseColumns;  
import android.provider.ContactsContract;  
import android.provider.SyncStateContract;  
import android.provider.ContactsContract.Data;  
import android.provider.ContactsContract.Groups;  
import android.provider.ContactsContract.RawContacts;  
import android.util.Log;  
  
public class SmsProvider extends ContentProvider implements SQLiteTransactionListener {  
  
    private static final String TAG = "SmsProvider";  
  
    private static final boolean VERBOSE_LOGGING = Log.isLoggable(TAG, Log.VERBOSE);  
  
    private DbHelper mDbHelper;  
  
    private SQLiteDatabase mDb;  
  
    private static final UriMatcher sUriMatcher = new UriMatcher(UriMatcher.NO_MATCH);  
  
    private static final int SMS = 1000;  
    private static final int SMS_ID = 1001;  
  
    public static final String SMS_ITEM_TYPE = "vnd.android.cursor.item/sms";  
  
    public static final String AUTHORITY = "com.firewings.smstools";  
  
    public static final Uri AUTHORITY_URI = Uri.parse("content://" + AUTHORITY);  
  
    public static final HashMap<string, string=""> sCountProjectionMap;  
    public static final HashMap<string, string=""> smsProjectionMap;  
  
    static {  
  
        final UriMatcher matcher = sUriMatcher;  
        matcher.addURI(AUTHORITY, "sms", SMS);  
        matcher.addURI(AUTHORITY, "sms/#", SMS_ID);  
  
        sCountProjectionMap = new LinkedHashMap<string, string="">();  
        sCountProjectionMap.put(BaseColumns._COUNT, "COUNT(*)");  
  
        smsProjectionMap = new LinkedHashMap<string, string="">();  
        smsProjectionMap.put(DbHelper.SmsColumns._ID, DbHelper.SmsColumns._ID);  
        smsProjectionMap.put(DbHelper.SmsColumns.ADDRESS, DbHelper.SmsColumns.ADDRESS);  
        smsProjectionMap.put(DbHelper.SmsColumns.PERSON, DbHelper.SmsColumns.PERSON);  
        smsProjectionMap.put(DbHelper.SmsColumns.DATE, DbHelper.SmsColumns.DATE);  
        smsProjectionMap.put(DbHelper.SmsColumns.TYPE, DbHelper.SmsColumns.TYPE);  
        smsProjectionMap.put(DbHelper.SmsColumns.BODY, DbHelper.SmsColumns.BODY);  
        smsProjectionMap.put(DbHelper.SmsColumns.SEND, DbHelper.SmsColumns.SEND);  
    }  
  
    private final ThreadLocal<boolean> mApplyingBatch = new ThreadLocal<boolean>();  
  
    private volatile boolean mNotifyChange;  
  
    @Override  
    public int delete(Uri uri, String selection, String[] selectionArgs) {  
        int count = 0;  
        boolean applyingBatch = applyingBatch();  
        if (!applyingBatch) {  
            mDb = mDbHelper.getWritableDatabase();  
            mDb.beginTransactionWithListener(this);  
            try {  
                count = deleteInTransaction(uri, selection, selectionArgs);  
                if (count > 0) {  
                    mNotifyChange = true;  
                }  
                mDb.setTransactionSuccessful();  
            } finally {  
                mDb.endTransaction();  
            }  
  
            onEndTransaction();  
        } else {  
            count = deleteInTransaction(uri, selection, selectionArgs);  
            if (count > 0) {  
                mNotifyChange = true;  
            }  
        }  
        return count;  
    }  
  
    protected int deleteInTransaction(Uri uri, String selection, String[] selectionArgs) {  
        if (VERBOSE_LOGGING) {  
            Log.v(TAG, "updateInTransaction: " + uri);  
        }  
  
        int count = 0;  
  
        final int match = sUriMatcher.match(uri);  
  
        switch (match) {  
  
        case SMS: {  
            count = mDb.delete(DbHelper.Tables.SMS, selection, selectionArgs);  
            break;  
        }  
  
        case SMS_ID: {  
            long smsId = ContentUris.parseId(uri);  
            if (selection != null) {  
                selectionArgs = selectionArg(selectionArgs, String.valueOf(smsId));  
                count = mDb.delete(DbHelper.Tables.SMS, RawContacts._ID + "=?" + " AND (" + selection + ")", selectionArgs);  
            } else {  
                count = mDb.delete(DbHelper.Tables.SMS, RawContacts._ID + "=?", new String[] { String.valueOf(smsId) });  
            }  
            break;  
        }  
  
        default: {  
            throw new UnsupportedOperationException(exceptionMessage(uri));  
        }  
        }  
  
        return count;  
    }  
  
    @Override  
    public String getType(Uri uri) {  
        final int match = sUriMatcher.match(uri);  
        switch (match) {  
        case SMS:  
            return SMS_ITEM_TYPE;  
  
        default:  
            throw new IllegalArgumentException(exceptionMessage(uri));  
        }  
    }  
  
    /** 
     * Returns a detailed exception message for the supplied URI. It includes 
     * the calling user and calling package(s). 
     */  
    public String exceptionMessage(Uri uri) {  
        return exceptionMessage(null, uri);  
    }  
  
    /** 
     * Returns a detailed exception message for the supplied URI. It includes 
     * the calling user and calling package(s). 
     */  
    public String exceptionMessage(String message, Uri uri) {  
        StringBuilder sb = new StringBuilder();  
        if (message != null) {  
            sb.append(message).append("; ");  
        }  
        sb.append("URI: ").append(uri);  
        final PackageManager pm = getContext().getPackageManager();  
        int callingUid = Binder.getCallingUid();  
        sb.append(", calling user: ");  
        String userName = pm.getNameForUid(callingUid);  
        if (userName != null) {  
            sb.append(userName);  
        } else {  
            sb.append(callingUid);  
        }  
  
        final String[] callerPackages = pm.getPackagesForUid(callingUid);  
        if (callerPackages != null && callerPackages.length > 0) {  
            if (callerPackages.length == 1) {  
                sb.append(", calling package:");  
                sb.append(callerPackages[0]);  
            } else {  
                sb.append(", calling package is one of: [");  
                for (int i = 0; i < callerPackages.length; i++) {  
                    if (i != 0) {  
                        sb.append(", ");  
                    }  
                    sb.append(callerPackages[i]);  
                }  
                sb.append("]");  
            }  
        }  
  
        return sb.toString();  
    }  
  
    private boolean applyingBatch() {  
        return mApplyingBatch.get() != null && mApplyingBatch.get();  
    }  
  
    @Override  
    public Uri insert(Uri uri, ContentValues values) {  
        Uri result = null;  
        boolean applyingBatch = applyingBatch();  
        if (!applyingBatch) {  
            mDb = mDbHelper.getWritableDatabase();  
            mDb.beginTransactionWithListener(this);  
            try {  
                result = insertInTransaction(uri, values);  
                if (result != null) {  
                    mNotifyChange = true;  
                }  
                mDb.setTransactionSuccessful();  
            } finally {  
                mDb.endTransaction();  
            }  
  
            onEndTransaction();  
        } else {  
            result = insertInTransaction(uri, values);  
            if (result != null) {  
                mNotifyChange = true;  
            }  
        }  
        return result;  
    }  
  
    protected Uri insertInTransaction(Uri uri, ContentValues values) {  
        if (VERBOSE_LOGGING) {  
            Log.v(TAG, "insertInTransaction: " + uri + " " + values);  
        }  
  
        final int match = sUriMatcher.match(uri);  
        long id = 0;  
  
        switch (match) {  
  
        case SMS: {  
            values.putNull(DbHelper.SmsColumns._ID);  
            id = mDb.insert(DbHelper.Tables.SMS, DbHelper.SmsColumns._ID, values);  
            break;  
        }  
  
        default: {  
            throw new UnsupportedOperationException(exceptionMessage(uri));  
        }  
        }  
  
        if (id < 0) {  
            return null;  
        }  
  
        return ContentUris.withAppendedId(uri, id);  
    }  
  
    @Override  
    public boolean onCreate() {  
        try {  
            return initialize();  
        } catch (RuntimeException e) {  
            Log.e(TAG, "Cannot start provider", e);  
            return false;  
        }  
    }  
  
    @Override  
    public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) {  
  
        if (VERBOSE_LOGGING) {  
            Log.v(TAG, "query: " + uri);  
        }  
  
        final SQLiteDatabase db = mDbHelper.getReadableDatabase();  
  
        SQLiteQueryBuilder qb = new SQLiteQueryBuilder();  
        String groupBy = null;  
        String limit = getLimit(uri);  
  
        final int match = sUriMatcher.match(uri);  
  
        switch (match) {  
        case SMS: {  
            setTablesAndProjectionMapForSms(qb, uri);  
            break;  
        }  
        }  
  
        return query(db, qb, projection, selection, selectionArgs, sortOrder, groupBy, limit);  
    }  
  
    private Cursor query(final SQLiteDatabase db, SQLiteQueryBuilder qb, String[] projection, String selection, String[] selectionArgs, String sortOrder, String groupBy, String limit) {  
        if (projection != null && projection.length == 1 && BaseColumns._COUNT.equals(projection[0])) {  
            qb.setProjectionMap(sCountProjectionMap);  
        }  
        final Cursor c = qb.query(db, projection, selection, selectionArgs, groupBy, null, sortOrder, limit);  
        if (c != null) {  
            c.setNotificationUri(getContext().getContentResolver(), AUTHORITY_URI);  
        }  
        return c;  
    }  
  
    private void setTablesAndProjectionMapForSms(SQLiteQueryBuilder qb, Uri uri) {  
        StringBuilder sb = new StringBuilder();  
        sb.append(DbHelper.Tables.SMS);  
        qb.setTables(sb.toString());  
        qb.setProjectionMap(smsProjectionMap);  
    }  
  
    @Override  
    public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) {  
        int count = 0;  
        boolean applyingBatch = applyingBatch();  
        if (!applyingBatch) {  
            mDb = mDbHelper.getWritableDatabase();  
            mDb.beginTransactionWithListener(this);  
            try {  
                count = updateInTransaction(uri, values, selection, selectionArgs);  
                if (count > 0) {  
                    mNotifyChange = true;  
                }  
                mDb.setTransactionSuccessful();  
            } finally {  
                mDb.endTransaction();  
            }  
  
            onEndTransaction();  
        } else {  
            count = updateInTransaction(uri, values, selection, selectionArgs);  
            if (count > 0) {  
                mNotifyChange = true;  
            }  
        }  
  
        return count;  
    }  
  
    protected int updateInTransaction(Uri uri, ContentValues values, String selection, String[] selectionArgs) {  
        if (VERBOSE_LOGGING) {  
            Log.v(TAG, "updateInTransaction: " + uri);  
        }  
  
        int count = 0;  
  
        final int match = sUriMatcher.match(uri);  
  
        switch (match) {  
  
        case SMS: {  
            count = mDb.update(DbHelper.Tables.SMS, values, selection, selectionArgs);  
            break;  
        }  
  
        case SMS_ID: {  
            long smsId = ContentUris.parseId(uri);  
            if (selection != null) {  
                selectionArgs = selectionArg(selectionArgs, String.valueOf(smsId));  
                count = mDb.update(DbHelper.Tables.SMS, values, RawContacts._ID + "=?" + " AND (" + selection + ")", selectionArgs);  
            } else {  
                count = mDb.update(DbHelper.Tables.SMS, values, RawContacts._ID + "=?", new String[] { String.valueOf(smsId) });  
            }  
            break;  
        }  
  
        default: {  
            throw new UnsupportedOperationException(exceptionMessage(uri));  
        }  
        }  
  
        return count;  
    }  
  
    /** 
     * Inserts an argument at the beginning of the selection arg list. 
     */  
    private String[] selectionArg(String[] selectionArgs, String arg) {  
        if (selectionArgs == null) {  
            return new String[] { arg };  
        } else {  
            int newLength = selectionArgs.length + 1;  
            String[] newSelectionArgs = new String[newLength];  
            newSelectionArgs[0] = arg;  
            System.arraycopy(selectionArgs, 0, newSelectionArgs, 1, selectionArgs.length);  
            return newSelectionArgs;  
        }  
    }  
  
    private boolean initialize() {  
        final Context context = getContext();  
        mDbHelper = (DbHelper) DbHelper.getInstance(context);  
        return true;  
    }  
  
    private String getLimit(Uri uri) {  
        String limitParam = getQueryParameter(uri, "limit");  
        if (limitParam == null) {  
            return null;  
        }  
        // make sure that the limit is a non-negative integer  
        try {  
            int l = Integer.parseInt(limitParam);  
            if (l < 0) {  
                Log.w(TAG, "Invalid limit parameter: " + limitParam);  
                return null;  
            }  
            return String.valueOf(l);  
        } catch (NumberFormatException ex) {  
            Log.w(TAG, "Invalid limit parameter: " + limitParam);  
            return null;  
        }  
    }  
  
    /* package */static String getQueryParameter(Uri uri, String parameter) {  
        String query = uri.getEncodedQuery();  
        if (query == null) {  
            return null;  
        }  
  
        int queryLength = query.length();  
        int parameterLength = parameter.length();  
  
        String value;  
        int index = 0;  
        while (true) {  
            index = query.indexOf(parameter, index);  
            if (index == -1) {  
                return null;  
            }  
  
            index += parameterLength;  
  
            if (queryLength == index) {  
                return null;  
            }  
  
            if (query.charAt(index) == '=') {  
                index++;  
                break;  
            }  
        }  
  
        int ampIndex = query.indexOf('&', index);  
        if (ampIndex == -1) {  
            value = query.substring(index);  
        } else {  
            value = query.substring(index, ampIndex);  
        }  
  
        return Uri.decode(value);  
    }  
  
    public void onBegin() {  
        // TODO Auto-generated method stub  
  
    }  
  
    public void onCommit() {  
        // TODO Auto-generated method stub  
  
    }  
  
    public void onRollback() {  
        // TODO Auto-generated method stub  
  
    }  
  
    protected void onEndTransaction() {  
        if (mNotifyChange) {  
            mNotifyChange = false;  
            notifyChange(true);  
        }  
    }  
  
    protected void notifyChange(boolean syncToNetwork) {  
        getContext().getContentResolver().notifyChange(AUTHORITY_URI, null, syncToNetwork);  
    }  
  
}  
 

    
[2] 兑现在popwindow中展示listview列表
    来源: 互联网  发布时间: 2014-02-18
实现在popwindow中展示listview列表

之前我实现了在listview中显示图片和checkbox,具体看这儿:http://gqdy365.iteye.com/blog/992340

接下来我将上述listview添加到popupwindow窗口中。关于这个listview我就再不多说了,主要是实现popupwindow和美化popupwindow。

先看看我做截图:



1、创建一个popupwindow,并设置相应的样式。

Java代码  
  • private   void  popAwindow(View parent) {  
  •         if  (window ==  null ) {  
  •             LayoutInflater lay = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);  
  •             View v = lay.inflate(R.layout.popupwindow, null );  
  •             v.setBackgroundDrawable(getResources().getDrawable(R.drawable.rounded_corners_view));  
  •               
  •             //初始化按钮   
  •             submit = (Button) v.findViewById(R.id.submit);  
  •             submit.setOnClickListener(submitListener);  
  •             cancel = (Button) v.findViewById(R.id.cancel);  
  •             cancel.setOnClickListener(cancelListener);  
  •               
  •             //初始化listview,加载数据。   
  •             list=(ListView)v.findViewById(R.id.lv);  
  •             MyAdapter adapter=new  MyAdapter(Main. this );  
  •             list.setAdapter(adapter);  
  •             list.setItemsCanFocus(false );  
  •             list.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);  
  •             list.setOnItemClickListener(listClickListener);  
  •               
  •             window = new  PopupWindow(v,  500 , 260 );  
  •         }  
  •           
  •         //设置整个popupwindow的样式。   
  •         window.setBackgroundDrawable(getResources().getDrawable(R.drawable.rounded_corners_pop));  
  •         //使窗口里面的空间显示其相应的效果,比较点击button时背景颜色改变。   
  •         //如果为false点击相关的空间表面上没有反应,但事件是可以监听到的。   
  •         //listview的话就没有了作用。   
  •         window.setFocusable(true );  
  •         window.update();  
  •         window.showAtLocation(parent, Gravity.CENTER_VERTICAL, 0 ,  0 );  
  •     }  
  •   
  •     OnItemClickListener listClickListener = new  OnItemClickListener() {  
  •         @Override   
  •         public   void  onItemClick(AdapterView<?> parent, View view,  int  position,  
  •                 long  id) {  
  •             ViewHolder vHollder = (ViewHolder) view.getTag();  
  •             // 在每次获取点击的item时将对于的checkbox状态改变,同时修改map的值。   
  •             vHollder.cBox.toggle();  
  •             MyAdapter.isSelected.put(position, vHollder.cBox.isChecked());  
  •         }  
  •     };  

  • 给按钮添加监听事件:

    Java代码  
  • OnClickListener submitListener =  new  OnClickListener() {  
  •         @Override   
  •         public   void  onClick(View v) {  
  •             //这儿可以写提交数据的代码。   
  •             closeWindow();  
  •         }  
  •     };  
  •   
  •     OnClickListener cancelListener=new  OnClickListener(){  
  •         @Override   
  •         public   void  onClick(View v){  
  •             closeWindow();  
  •         }  
  •     };  
  •       
  •     private   void  closeWindow(){  
  •         //将每个checkbox的标记改为false,以便下次弹出window时是初始的状态。   
  •         for  ( int  j =  0 ; j < MyAdapter.isSelected.size(); j++) {  
  •             MyAdapter.isSelected.put(j, false );  
  •             ViewHolder vHollder = (ViewHolder) list.getChildAt(j).getTag();  
  •             vHollder.cBox.setChecked(false );  
  •         }  
  •         //提交数据时关闭popupwindow。   
  •         if  (window !=  null ) {  
  •             window.dismiss();  
  •         }  
  •     }  



  • 在layout中新建popupwindow.xml文件,具体内容如下,主要是对window的布局:

    Java代码  
  • <?xml version= "1.0"  encoding= "utf-8" ?>  
  • <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"   
  •     android:orientation="vertical"   
  •     android:layout_width="fill_parent"   
  •     android:layout_height="fill_parent" >  
  •     <TextView  
  •         android:id="@+id/tip"    
  •         android:layout_width="wrap_content"    
  •         android:layout_height="wrap_content"   
  •         android:layout_gravity="center"   
  •         android:textSize="18dip"   
  •         android:background="@drawable/rounded_corners_list"   
  •         android:text="这是一个popupWindow的例子" />  
  •         <!-- 如果layout_width的值为fill_parent时,居中要用android:gravity="center" -->  
  •     <ListView  
  •         android:id="@+id/lv"   
  •         android:layout_width="fill_parent"    
  •         android:layout_height="wrap_content"   
  •         android:background="@drawable/rounded_corners_list" />  
  •     <LinearLayout  
  •         android:orientation="horizontal"   
  •         android:layout_gravity="center"   
  •         android:layout_width="wrap_content"   
  •         android:layout_height="wrap_content"   
  •         android:background="@drawable/rounded_corners_list" >  
  •         <Button   
  •             android:id="@+id/submit"    
  •             android:layout_width="100dip"    
  •             android:layout_height="50dip"    
  •             android:text="提交" />  
  •         <Button   
  •             android:id="@+id/cancel"    
  •             android:layout_width="100dip"    
  •             android:layout_height="50dip"    
  •             android:text="取消" />  
  •     </LinearLayout>  
  • </LinearLayout>  


  • 其中listView的布局的布局和实现请参考文章开头提到的另一篇文章。
    新建rounded_corners_pop.xml,用于自定义窗口的样式文件,具体内容如下:

    Java代码  
  • <?xml version= "1.0"  encoding= "utf-8" ?>  
  • <shape xmlns:android="http://schemas.android.com/apk/res/android" >  
  •     <solid android:color="#ffffffff"  />  
  •     <stroke android:width="3dp"  color= "#ffff8080"  />  
  •     <corners android:radius="10dp"  />  
  •     <padding   
  •         android:left="3dp"   
  •         android:top="3dp"    
  •         android:right="3dp"   
  •         android:bottom="3dp"  />  
  • </shape>  

  • 这个就可以实现圆角的样式,周围的白边是通过在白的样式上面叠加黑色的来实现的。
    其他样式文件大家可以参考上面的rounded_corners_pop.xml自己写。

    2、在main.xml中添加按钮,一个用于显示window,一个用于隐藏window

    Java代码  
  • <?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"   
  •     android:id="@+id/lmain"   
  •     >  
  •     <Button   
  •         android:id="@+id/myButton1"    
  •         android:layout_width="100dip"    
  •         android:layout_height="50dip"    
  •         android:text="显示" />  
  •     <Button   
  •         android:id="@+id/myButton2"    
  •         android:layout_width="100dip"    
  •         android:layout_height="50dip"    
  •         android:text="隐藏" />  
  • </LinearLayout>  

  • 在activity中初始化这两个按钮,并添加监听事件:

    Java代码  
  • OnClickListener bPop =  new  OnClickListener() {  
  •     @Override   
  •     public   void  onClick(View v) {  
  •         popAwindow(v);  
  •     }  
  • };  
  •   
  • OnClickListener boff = new  OnClickListener() {  
  •     @Override   
  •     public   void  onClick(View v) {  
  •         if (window!= null ){  
  •             window.dismiss();  
  •         }  
  •     }  
  • }; 

  •     
    [3] 2.3 dialog 图标小时的有关问题
        来源: 互联网  发布时间: 2014-02-18
    2.3 dialog 图标小时的问题

    发现2.3里面没有android.R.drawable.ic_dialog_xxxx 这几个图标,如果直接调用的话是不行的

    看来只能从以前的复制进来了


        
    最新技术文章:
    ▪Android开发之登录验证实例教程
    ▪Android开发之注册登录方法示例
    ▪Android获取手机SIM卡运营商信息的方法
    ▪Android实现将已发送的短信写入短信数据库的...
    ▪Android发送短信功能代码
    ▪Android根据电话号码获得联系人头像实例代码
    ▪Android中GPS定位的用法实例
    ▪Android实现退出时关闭所有Activity的方法
    ▪Android实现文件的分割和组装
    ▪Android录音应用实例教程
    ▪Android双击返回键退出程序的实现方法
    ▪Android实现侦听电池状态显示、电量及充电动...
    ▪Android获取当前已连接的wifi信号强度的方法
    ▪Android实现动态显示或隐藏密码输入框的内容
    ▪根据USER-AGENT判断手机类型并跳转到相应的app...
    ▪Android Touch事件分发过程详解
    ▪Android中实现为TextView添加多个可点击的文本
    ▪Android程序设计之AIDL实例详解
    ▪Android显式启动与隐式启动Activity的区别介绍
    ▪Android按钮单击事件的四种常用写法总结
    ▪Android消息处理机制Looper和Handler详解
    ▪Android实现Back功能代码片段总结
    ▪Android实用的代码片段 常用代码总结
    ▪Android实现弹出键盘的方法
    ▪Android中通过view方式获取当前Activity的屏幕截...
    ▪Android提高之自定义Menu(TabMenu)实现方法
    ▪Android提高之多方向抽屉实现方法
    ▪Android提高之MediaPlayer播放网络音频的实现方法...
    ▪Android提高之MediaPlayer播放网络视频的实现方法...
    ▪Android提高之手游转电视游戏的模拟操控
     


    站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3