1、widget:桌面小控件
1 寫一個類extends AppWidgetProvider
2 在清單文件件中註冊:javascript
<receiver android:name=".ExampleAppWidgetProvider" > <intent-filter> <action android:name="android.appwidget.action.APPWIDGET_UPDATE" /> </intent-filter> <meta-data android:name="android.appwidget.provider" android:resource="@xml/example_appwidget_info" /> </receiver>
3 在res/xml建立example_appwidget_info.xmlhtml
<appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android" android:minWidth="294dp" android:minHeight="72dp" android:initialLayout="@layout/example_appwidget"> </appwidget-provider>
4 指定佈局 example_appwidget.xml
生命週期:
1 添加到桌面:
onEnabled() --> onUpdate() //通過測試,4.0之後的版本添加到桌面時不會執行onEnabled()了
2 刪除
onDeleted()----> onDisabled() //通過測試,4.0之後的版本刪除時不會執行onDisabled()了
若是桌面已經有一個了widget的實例存在,再次添加onUpdate()
刪除以後,若是桌面上還有widget的實例存在,只會調用onDeleted().
更成時間的顯示:
1 使用一個Servic來執行時間的更新
Timer TimerTask
練習:查看API文檔能夠根據文檔裏面的例子來作java
package com.shellway.widget; import android.support.v7.app.ActionBarActivity; import android.os.Bundle; import android.view.Menu; import android.view.MenuItem; public class MainActivity extends ActionBarActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } }
package com.shellway.widget; import java.text.SimpleDateFormat; import android.app.PendingIntent; import android.appwidget.AppWidgetManager; import android.appwidget.AppWidgetProvider; import android.content.Context; import android.content.Intent; import android.sax.StartElementListener; import android.util.Log; import android.widget.RemoteViews; public class ExampleAppWidgetProvider extends AppWidgetProvider { @Override public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) { // TODO Auto-generated method stub super.onUpdate(context, appWidgetManager, appWidgetIds); //開啓一個實時計時的服務 Intent intent = new Intent(context,MyService.class); context.startService(intent); /*RemoteViews view = new RemoteViews(context.getPackageName(), R.layout.wedget); long date = java.lang.System.currentTimeMillis(); SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); String time = sdf.format(date); //給view設置時間 view.setTextViewText(R.id.tv_timer, time); //點擊它,要跳轉到一個新的界面 Intent intent = new Intent(context,MainActivity.class); PendingIntent pintent = PendingIntent.getActivity(context, 100, intent, 0); view.setOnClickPendingIntent(R.id.tv_timer, pintent); //更新widget,要放在最後 appWidgetManager.updateAppWidget(appWidgetIds, view);*/ } @Override public void onDeleted(Context context, int[] appWidgetIds) { // TODO Auto-generated method stub super.onDeleted(context, appWidgetIds); Log.i("i", " onDeleted "); //在用戶刪除掉的時候把服務也中止 Intent intent = new Intent(context,MyService.class); context.stopService(intent); } }
package com.shellway.widget; import java.text.SimpleDateFormat; import java.util.Timer; import java.util.TimerTask; import android.app.PendingIntent; import android.app.Service; import android.appwidget.AppWidgetHostView; import android.appwidget.AppWidgetManager; import android.content.ComponentName; import android.content.Intent; import android.os.IBinder; import android.widget.RemoteViews; public class MyService extends Service { private Timer timer; private TimerTask task = new TimerTask(){ @Override public void run() { // TODO Auto-generated method stub AppWidgetManager appWidgetManager = AppWidgetManager .getInstance(getApplicationContext()); RemoteViews view = new RemoteViews(getPackageName(), R.layout.wedget); long date = java.lang.System.currentTimeMillis(); SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); String time = sdf.format(date); //給view設置時間 view.setTextViewText(R.id.tv_timer, time); //點擊它,要跳轉到一個新的界面 Intent intent = new Intent(getApplicationContext(),MainActivity.class); PendingIntent pintent = PendingIntent.getActivity(getApplicationContext(), 100, intent, 0); view.setOnClickPendingIntent(R.id.tv_timer, pintent); ComponentName provider = new ComponentName(getApplicationContext(), ExampleAppWidgetProvider.class); appWidgetManager.updateAppWidget(provider, view); } }; @Override public void onCreate() { // TODO Auto-generated method stub super.onCreate(); //新建一個計時器 timer = new Timer(); //用計時器開啓一個任務,計時器產生1秒後開始,每隔一秒更新一次(即:每秒執行一次run方法) timer.schedule(task, 1000, 1000); } @Override public void onDestroy() { // TODO Auto-generated method stub super.onDestroy(); //取消計時器 timer.cancel(); task = null; } @Override public IBinder onBind(Intent intent) { // TODO Auto-generated method stub return null; } }
<?xml version="1.0" encoding="utf-8"?> <appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android" android:minWidth="294dp" android:minHeight="40dp" android:initialLayout="@layout/wedget" > </appwidget-provider>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context="com.shellway.widget.MainActivity" > <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="這是一個widget" /> </RelativeLayout>
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" android:background="@android:color/white" > <TextView android:id="@+id/tv_timer" android:layout_width="fill_parent" android:layout_height="fill_parent" android:textColor="#f00" android:text="我是widget" /> </LinearLayout>
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.shellway.widget" android:versionCode="1" android:versionName="1.0" > <uses-sdk android:minSdkVersion="8" android:targetSdkVersion="21" /> <application android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" > <activity android:name=".MainActivity" android:label="@string/app_name" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <!-- widget其實是一個廣播接收者BroadcastReceiver --> <receiver android:name=".ExampleAppWidgetProvider" > <intent-filter> <action android:name="android.appwidget.action.APPWIDGET_UPDATE" /> </intent-filter> <meta-data android:name="android.appwidget.provider" android:resource="@xml/example_appwidget" /> </receiver> <service android:name=".MyService"></service> </application> </manifest>
運行結果截圖:android
2、網頁實現界面:webview
1 數據:應該來自於手機自己。
網頁資源若放在本地asset目錄中則會自動產生一個:file:///android_asset/目錄
webview 能夠把一個java對象傳遞給網頁,再讓javascript去調用這個對象裏面的方法
1 onload() javascript 代碼調用java代碼 java再調用javascriptweb
package com.shellway.htmlui; import java.util.List; import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; import com.shellway.domain.Contact; import com.shellway.service.ContactService; import android.support.v7.app.ActionBarActivity; import android.annotation.SuppressLint; import android.content.Intent; import android.net.Uri; import android.os.Bundle; import android.view.Menu; import android.view.MenuItem; import android.view.Window; import android.webkit.WebView; public class MainActivity extends ActionBarActivity { private WebView webview; private ContactService service; @SuppressLint({ "JavascriptInterface", "SetJavaScriptEnabled" }) @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // requestWindowFeature(Window.FEATURE_NO_TITLE); 設置無標題 setContentView(R.layout.activity_main); webview = (WebView) findViewById(R.id.webview); service = new ContactService(); //給webview傳遞一個對象 webview.addJavascriptInterface(new ContactPulgin(), "contact"); //設置webview能夠執行JavaScript代碼 webview.getSettings().setJavaScriptEnabled(true); //加載網頁 webview.loadUrl("file:///android_asset/index.html"); } private class ContactPulgin { //網頁一加載就會執行onload="javascript:contact.showcontacts()",寫方法 public void showcontacts(){ try { List<Contact> contacts = service.getContact(); JSONArray jsonArray = new JSONArray(); for (int i = 0; i < contacts.size(); i++) { JSONObject jsonObject = new JSONObject(); Contact info = contacts.get(i); jsonObject.put("name", info.getName()); jsonObject.put("amount", info.getAmount()); jsonObject.put("phone", info.getPhone()); jsonArray.put(jsonObject); } String json = jsonArray.toString(); //給javascript返回一個json數據 webview.loadUrl("javascript:show("+ json +")"); } catch (JSONException e) { e.printStackTrace(); } } //實現點擊電話號碼打電話功能 public void call(String phone){ Intent intent = new Intent(Intent.ACTION_CALL,Uri.parse("tel:"+phone)); startActivity(intent); } } }
package com.shellway.service; import java.util.ArrayList; import java.util.List; import com.shellway.domain.Contact; public class ContactService { //模擬數據 public List<Contact> getContact(){ List<Contact> contacts = new ArrayList<Contact>(); contacts.add(new Contact("李斯", 12000, "13128783361")); contacts.add(new Contact("趙高", 10000, "13128783362")); contacts.add(new Contact("張良", 15000, "13128783363")); contacts.add(new Contact("劉邦", 13000, "13128783364")); contacts.add(new Contact("項羽", 17000, "13128783365")); return contacts; } }
package com.shellway.domain; public class Contact { private String name; private long amount; private String phone; public Contact(String name, long amount, String phone) { super(); this.name = name; this.amount = amount; this.phone = phone; } public String getName() { return name; } public void setName(String name) { this.name = name; } public long getAmount() { return amount; } public void setAmount(long amount) { this.amount = amount; } public String getPhone() { return phone; } public void setPhone(String phone) { this.phone = phone; } @Override public String toString() { return "Contact [name=" + name + ", amount=" + amount + ", phone=" + phone + "]"; } }
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Insert title here</title> <script type="text/javascript"> function show(jsondata){// [{name:"xxx",amount:600,phone:"13988888"},{name:"bb",amount:200,phone:"1398788"}] var jsonobjs = eval(jsondata); var table = document.getElementById("personTable"); for(var y=0; y<jsonobjs.length; y++){ var tr = table.insertRow(table.rows.length); //添加一行 //添加三列 var td1 = tr.insertCell(0); var td2 = tr.insertCell(1); td2.align = "center"; var td3 = tr.insertCell(2); td3.align = "center"; //設置列內容和屬性 td1.innerHTML = jsonobjs[y].name; td2.innerHTML = jsonobjs[y].amount; td3.innerHTML = "<a href='javascript:contact.call(\""+ jsonobjs[y].phone+ "\")'>"+ jsonobjs[y].phone+ "</a>"; } } </script> </head> <!-- js代碼經過webView調用其插件中的java代碼 --> <body onload="javascript:contact.showcontacts()"> <table border="0" width="100%" id="personTable" cellspacing="0"> <tr> <td width="35%">姓名</td><td width="30%" align="center">存款</td><td align="center">電話</td> </tr> </table> <a href="javascript:window.location.reload()">刷新</a> </body> </html>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" tools:context="com.shellway.htmlui.MainActivity" > <WebView android:id="@+id/webview" android:layout_width="fill_parent" android:layout_height="fill_parent" /> </RelativeLayout>
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.shellway.htmlui" android:versionCode="1" android:versionName="1.0" > <uses-sdk android:minSdkVersion="8" android:targetSdkVersion="21" /> <uses-permission android:name="android.permission.CALL_PHONE"/> <application android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" > <activity android:name=".MainActivity" android:label="@string/app_name" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> </manifest>
運行結果截圖:shell
3、安裝和卸載應用:apk的minetype爲:application/vnd.android.package-archive數據庫
package com.shellway.install; import java.io.File; import android.support.v7.app.ActionBarActivity; import android.content.Intent; import android.net.Uri; import android.os.Bundle; import android.os.Environment; import android.view.Menu; import android.view.MenuItem; import android.view.View; public class MainActivity extends ActionBarActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } public void install(View view){ //由於在系統中已經存在安裝模塊的實現,咱們只需激活它就能夠了 Intent intent = new Intent(); intent.setAction(Intent.ACTION_VIEW); File file = new File(Environment.getExternalStorageDirectory(),"htmlui.apk"); //文件類型通常能夠在tomcat的web.xml配置文件中查找 intent.setDataAndType(Uri.fromFile(file), "application/vnd.android.package-archive"); startActivity(intent); } public void uninstall(View view){ Intent intent = new Intent(); intent.setAction(Intent.ACTION_DELETE); //卸載應用只須要包名 intent.setData(Uri.parse("package:com.shellway.htmlui")); startActivity(intent); } }
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:onClick="install" android:text="安裝" /> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:onClick="uninstall" android:text="卸載" /> </LinearLayout>
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.shellway.install" android:versionCode="1" android:versionName="1.0" > <uses-sdk android:minSdkVersion="8" android:targetSdkVersion="21" /> <application android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" > <activity android:name=".MainActivity" android:label="@string/app_name" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> </manifest>
運行結果截圖:json
4、metadata元數據windows
package com.shellway.metadata; import android.support.v7.app.ActionBarActivity; import android.content.ComponentName; import android.content.pm.ActivityInfo; import android.content.pm.PackageManager; import android.content.pm.PackageManager.NameNotFoundException; import android.os.Bundle; import android.util.Log; import android.view.Menu; import android.view.MenuItem; import android.view.View; public class MainActivity extends ActionBarActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } public void get(View view){ try { //獲得包管理器,它能夠獲取四大組件的元數據信息 PackageManager pm = getPackageManager(); ComponentName component = new ComponentName(this, MainActivity.class); ActivityInfo info = pm.getActivityInfo(component, PackageManager.GET_META_DATA); Bundle bundle = info.metaData; String name = bundle.getString("name"); int number = bundle.getInt("number"); String first = bundle.getString("first"); String two = getString(bundle.getInt("two")); Log.i("i", name); Log.i("i", number+""); Log.i("i", first); Log.i("i", two); } catch (NameNotFoundException e) { e.printStackTrace(); } } }
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" > <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:onClick="get" android:text="獲得數據" /> </LinearLayout>
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.shellway.metadata" android:versionCode="1" android:versionName="1.0" > <uses-sdk android:minSdkVersion="8" android:targetSdkVersion="21" /> <application android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" > <activity android:name=".MainActivity" android:label="@string/app_name" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> <!-- 給activity組件添加一些元數據信息 --> <meta-data android:name="name" android:value="驕陽08的博客" /> <meta-data android:name="number" android:value="08" /> <meta-data android:name="first" android:value="@string/first" /> <meta-data android:name="two" android:resource="@string/two" /> </activity> </application> </manifest>
運行結果截圖:tomcat
5、drawble:有一個能夠把圖片處理成.9.png類型的工具在android-sdk\tools下的draw9patch.bat
一、Layer List:疊代列表,好比相框和相片的關係
二、State List:狀態列表,好比不點擊是一個狀態,點擊了又是一個狀態
三、Level List:打分效果,好比信號強弱
四、Transition Drawable:移動動畫,即從一個動畫到什麼樣的一個動畫
五、Inset Drawable:插入圖片,好比能夠在一張圖片周圍空餘的地方插入另外一張圖片
六、Clip Drawable:裁剪圖片,好比進度條
七、Scale Drawable:拉伸和縮放圖片
八、Shape Drawable:經過編碼XML文件繪製一張圖形,常常用到
package com.shellway.drawable; import android.support.v7.app.ActionBarActivity; import android.graphics.drawable.LayerDrawable; import android.graphics.drawable.LevelListDrawable; import android.os.Bundle; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.widget.ImageView; public class MainActivity extends ActionBarActivity { private ImageView iv; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); iv = (ImageView) findViewById(R.id.iv); } public void reset(View view){ //獲得咱們自定義的layerlist對象 // LayerDrawable layerDrawable = (LayerDrawable) getResources() // .getDrawable(R.drawable.layerlist); //把layerlist對象裏面的R.id.user圖片替換成咱們想要的圖片ic_launcher // layerDrawable.setDrawableByLayerId(R.id.user, getResources() // .getDrawable(R.drawable.ic_launcher)); //替換後再設置回給ImageView // iv.setImageDrawable(layerDrawable); LevelListDrawable levelList = (LevelListDrawable) iv.getDrawable(); levelList.setLevel(20); iv.setImageDrawable(levelList); } }
<?xml version="1.0" encoding="utf-8"?> <layer-list xmlns:android="http://schemas.android.com/apk/res/android" > <item android:drawable="@drawable/faceback" /> <item android:drawable="@drawable/user" android:id="@+id/user" android:top="68dp" android:right="18dp" android:bottom="22dp" android:left="18dp" /> </layer-list>
<?xml version="1.0" encoding="utf-8"?> <level-list xmlns:android="http://schemas.android.com/apk/res/android" > <item android:drawable="@drawable/faceback" android:maxLevel="10" android:minLevel="0" /> <item android:drawable="@drawable/user" android:maxLevel="20" android:minLevel="10" /> </level-list>
<?xml version="1.0" encoding="utf-8"?> <selector xmlns:android="http://schemas.android.com/apk/res/android" > <!-- 這裏注意,有動做條件的代碼必定要放在沒有條件即正常狀態的前面 --> <item android:state_pressed="true" android:drawable="@drawable/bg_selected"></item> <item android:drawable="@drawable/bg_normal"></item> </selector>
<?xml version="1.0" encoding="utf-8"?> <!-- android:shape="rectangle" 圖形的形狀,這裏是長方形 corners 圓角 gradient 漸變色 padding 內邊距 size 圖形大小 solid 內填充色,它和gradient只使用一個 stroke 畫邊虛線的效果 --> <shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle"> <corners android:radius="3dp" /> <gradient android:startColor="#D0F4F9" android:centerColor="#4BED23" android:endColor="#5FF2FA" /> <padding android:left="2dp" android:top="2dp" android:right="2dp" android:bottom="2dp" /> <stroke android:width="1dp" android:color="#00f" android:dashWidth="10dp" android:dashGap="2dp" /> </shape>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <ImageView android:id="@+id/iv" android:layout_width="wrap_content" android:layout_height="wrap_content" android:src="@drawable/levellist" /> <Button android:id="@+id/bt" android:layout_width="wrap_content" android:layout_height="wrap_content" android:onClick="reset" android:text=" 下 一 張 " android:background="@drawable/shapelist" /> </LinearLayout>
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.shellway.drawable" android:versionCode="1" android:versionName="1.0" > <uses-sdk android:minSdkVersion="8" android:targetSdkVersion="21" /> <application android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" > <activity android:name=".MainActivity" android:label="@string/app_name" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> </manifest>
運行結果截圖:
6、泡泡窗口:popupwindow
package com.shellway.popupwindow; import android.support.v7.app.ActionBarActivity; import android.graphics.ColorFilter; import android.graphics.drawable.BitmapDrawable; import android.graphics.drawable.Drawable; import android.os.Bundle; import android.view.LayoutInflater; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.view.ViewGroup; import android.view.ViewGroup.LayoutParams; import android.widget.AdapterView; import android.widget.AdapterView.OnItemClickListener; import android.widget.BaseAdapter; import android.widget.GridView; import android.widget.ImageView; import android.widget.PopupWindow; import android.widget.TextView; public class MainActivity extends ActionBarActivity { private LayoutInflater inflater; private PopupWindow mpPopupWindow; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); inflater = LayoutInflater.from(this); } public void show(View view){ View contentView = inflater.inflate(R.layout.popupwindow, null); GridView gv = (GridView) contentView.findViewById(R.id.gridview); gv.setAdapter(new MyAdapter()); gv.setOnItemClickListener(new MyOnItemClickListener()); mpPopupWindow = new PopupWindow(contentView, LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT); //若是須要點擊其餘的地方popupwindow自動消失: 1 popupwindow必須指定背景 2 poupwindow必須獲取焦點 mpPopupWindow.setBackgroundDrawable(new BitmapDrawable()); mpPopupWindow.setFocusable(true); //把它顯示在view下面即所點擊的按鈕下面 mpPopupWindow.showAsDropDown(view); } private class MyOnItemClickListener implements OnItemClickListener{ @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { // TODO Auto-generated method stub mpPopupWindow.dismiss(); } } private class MyAdapter extends BaseAdapter{ private int[] images = new int[]{R.drawable.i1,R.drawable.i2,R.drawable.i3 ,R.drawable.i4,R.drawable.i5,R.drawable.i6,R.drawable.i7,R.drawable.i8}; private String[] names = new String[]{"搜索", "文件管理", "下載管理", "全屏" , "網址", "書籤", "加入書籤", "分享頁面"}; @Override public int getCount() { // TODO Auto-generated method stub return images.length; } @Override public Object getItem(int position) { // TODO Auto-generated method stub return names[position]; } @Override public long getItemId(int position) { // TODO Auto-generated method stub return position; } @Override public View getView(int position, View convertView, ViewGroup parent) { View view = inflater.inflate(R.layout.item, null); ImageView iv = (ImageView) view.findViewById(R.id.iv); TextView tv = (TextView) view.findViewById(R.id.tv); iv.setImageResource(images[position]); tv.setText(names[position]); return view; } } }
<?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle"> <gradient android:startColor="#5FF2FA" android:endColor="#4BED23"/> </shape>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:onClick="show" android:text="顯示" /> </LinearLayout>
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" android:background="@drawable/bg"> <GridView android:id="@+id/gridview" android:layout_width="fill_parent" android:layout_height="wrap_content" android:numColumns="4" android:horizontalSpacing="2dp" android:verticalSpacing="2dp" ></GridView> </LinearLayout>
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <ImageView android:id="@+id/iv" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" /> <TextView android:id="@+id/tv" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" /> </LinearLayout>
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.shellway.popupwindow" android:versionCode="1" android:versionName="1.0" > <uses-sdk android:minSdkVersion="8" android:targetSdkVersion="21" /> <application android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" > <activity android:name=".MainActivity" android:label="@string/app_name" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> </manifest>
運行結果截圖:
7、tabhost標籤頁、自定義標籤頁
package com.shellway.tabhost; import android.support.v7.app.ActionBarActivity; import android.os.Bundle; import android.util.Log; import android.view.LayoutInflater; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.widget.ImageView; import android.widget.TabHost; import android.widget.TabHost.TabSpec; import android.widget.TextView; public class MainActivity extends ActionBarActivity { private TabHost tb; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); tb = (TabHost) findViewById(R.id.tabhost); tb.setup();//找到tabwidget 、 FrameLayout TabSpec tab1 = tb.newTabSpec("tab1"); //指定標籤 // tab1.setIndicator("首頁", getResources().getDrawable(R.drawable.i1)); tab1.setIndicator(createView("首頁", R.drawable.i1));//指定標籤 tab1.setContent(R.id.line1);//指定標籤頁的內容 tb.addTab(tab1); TabSpec tab2 = tb.newTabSpec("tab2"); //指定標籤 // tab2.setIndicator("第二頁", getResources().getDrawable(R.drawable.i2)); tab2.setIndicator(createView("第二頁", R.drawable.i2));//指定標籤 tab2.setContent(R.id.line2);//指定標籤頁的內容 tb.addTab(tab2); TabSpec tab3 = tb.newTabSpec("tab3"); //指定標籤 // tab3.setIndicator("第三頁", getResources().getDrawable(R.drawable.i7)); tab3.setIndicator(createView("第三頁", R.drawable.i7));//指定標籤 tab3.setContent(R.id.line3);//指定標籤頁的內容 tb.addTab(tab3); } //建立一個View返回 public View createView(String name,int image){ View view = View.inflate(this, R.layout.tab, null); ImageView iv_title = (ImageView) view.findViewById(R.id.iv_tile); TextView tv_title = (TextView) view.findViewById(R.id.tv_title); iv_title.setImageResource(image); tv_title.setText(name); return view; } }
<?xml version="1.0" encoding="utf-8"?> <selector xmlns:android="http://schemas.android.com/apk/res/android" > <item android:state_selected="true" android:drawable="@drawable/bg_selected"></item> <item android:drawable="@drawable/bg_normal"></item> </selector>
<TabHost xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:id="@+id/tabhost" android:orientation="vertical" > <LinearLayout android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical" > <TabWidget android:id="@android:id/tabs" android:layout_width="fill_parent" android:layout_height="wrap_content" /> <FrameLayout android:id="@android:id/tabcontent" android:layout_width="fill_parent" android:layout_height="0dp" android:layout_weight="1" > <LinearLayout android:id="@+id/line1" android:layout_width="fill_parent" android:layout_height="fill_parent" android:background="@android:color/darker_gray" > <TextView android:layout_width="fill_parent" android:layout_height="fill_parent" android:text="首頁" /> </LinearLayout> <LinearLayout android:id="@+id/line2" android:layout_width="fill_parent" android:layout_height="fill_parent" android:background="@android:color/darker_gray" > <TextView android:layout_width="fill_parent" android:layout_height="fill_parent" android:text="第二頁" /> </LinearLayout> <LinearLayout android:id="@+id/line3" android:layout_width="fill_parent" android:layout_height="fill_parent" android:background="@android:color/darker_gray" > <TextView android:layout_width="fill_parent" android:layout_height="fill_parent" android:text="第三頁" /> </LinearLayout> </FrameLayout> </LinearLayout> </TabHost>
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" android:background="@drawable/selector"> <ImageView android:id="@+id/iv_tile" android:layout_width="match_parent" android:layout_height="wrap_content" android:src="@drawable/i1" /> <TextView android:id="@+id/tv_title" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center_horizontal" android:text="首頁" /> </LinearLayout>
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.shellway.tabhost" android:versionCode="1" android:versionName="1.0" > <uses-sdk android:minSdkVersion="8" android:targetSdkVersion="21" /> <application android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" > <activity android:name=".MainActivity" android:label="@string/app_name" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> </manifest>
運行結果截圖:
8、數據量多:分頁加載數據
package com.shellway.pageloaddata; import java.util.ArrayList; import java.util.List; import com.shellway.service.DataService; import android.support.v7.app.ActionBarActivity; import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.os.SystemClock; import android.view.LayoutInflater; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.widget.AbsListView; import android.widget.AbsListView.OnScrollListener; import android.widget.ArrayAdapter; import android.widget.ListView; public class MainActivity extends ActionBarActivity { private static final int FINISH_GET_DATA = 0; private ListView lv_data; private List<String> data;//加載的總數據 private DataService service; private ArrayAdapter<String> adapter; private View footer; private boolean finish = true;//是否加載完成的標誌 Handler handler = new Handler(){ public void handleMessage(android.os.Message msg) { switch (msg.what) { case FINISH_GET_DATA: ArrayList<String> result = (ArrayList<String>) msg.obj; data.addAll(result); adapter.notifyDataSetChanged();//讓listview自動刷新 finish = true; if (lv_data.getFooterViewsCount()>0) { lv_data.removeFooterView(footer); } break; default: break; } }; }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); lv_data = (ListView) findViewById(R.id.lv_data); service = new DataService(); data = new ArrayList<String>(); List<String> result = service.getData(1, 20); data.addAll(result); adapter = new ArrayAdapter<String>(this, R.layout.item, R.id.tv_data, data); footer = View.inflate(this, R.layout.footer, null); //在這裏先給適配器聲明說我要添加頁腳,而後爲了避免讓一開始就有添加的頁腳存在咱們先除去頁腳 lv_data.addFooterView(footer); lv_data.setAdapter(adapter); lv_data.removeFooterView(footer); //給listview設置滑動事件 lv_data.setOnScrollListener(new MyOnScrollListener()); } private class MyOnScrollListener implements OnScrollListener{ int totalPage = 5;//設定加載的總頁數 final int pageSize = 20;//設定每頁加載20條數據 //scrollState:表示滑動狀態 1表示開始滑動、2表示正在滑動、0表示中止滑動 public void onScrollStateChanged(AbsListView view, int scrollState) { // TODO Auto-generated method stub } /** * firstVisibleItem:表示當前可見頁面的起始數據(即最上面一條) * visibleItemCount:表示當前手機窗口能夠顯示的總共數據條數 * totalItemCount:表示已經加載的總共數據條數 */ public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) { //已經滑動完的總共條數 final int totalCount = firstVisibleItem + visibleItemCount; int currentPage = totalCount/pageSize;//當時是第幾頁 int nextPage = currentPage + 1;//下一頁的頁數 //判斷是否已經移動到了listview的最後 if (totalCount == totalItemCount&&nextPage <= totalPage&&finish) { finish = false; //添加頁腳 lv_data.addFooterView(footer); new Thread(){ @Override public void run() { SystemClock.sleep(3000);//模擬網絡延遲,睡3秒 List<String> data = service.getData(totalCount+1, pageSize); Message msg = new Message(); msg.what = FINISH_GET_DATA; msg.obj = data; handler.sendMessage(msg); } }.start(); } } } }
package com.shellway.service; import java.util.ArrayList; import java.util.List; public class DataService { //加載數據 public List<String> getData(int startData,int pageSize){ int length = startData + pageSize; List<String> list = new ArrayList<String>(); for (int i = startData; i < length; i++) { String data = new String("分頁加載的數據:數據"+i); list.add(data); } return list; } }
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:background="@color/abc_search_url_text_normal" android:orientation="vertical" > <ListView android:id="@+id/lv_data" android:layout_width="match_parent" android:layout_height="match_parent" ></ListView> </LinearLayout>
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal" > <ProgressBar android:layout_width="wrap_content" android:layout_height="wrap_content" /> <TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_gravity="center_vertical" android:textSize="20dp" android:text="數據正在加載中。。。。" /> </LinearLayout>
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <TextView android:id="@+id/tv_data" android:layout_width="match_parent" android:layout_height="26dp" android:layout_marginLeft="5dp" android:textSize="20dp" /> </LinearLayout>
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.shellway.pageloaddata" android:versionCode="1" android:versionName="1.0" > <uses-sdk android:minSdkVersion="8" android:targetSdkVersion="21" /> <application android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" > <activity android:name=".MainActivity" android:label="@string/app_name" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> </manifest>
運行結果截圖:
9、快捷圖標的建立和刪除
能夠參考Android源碼中的apps\Launcher2\AndroidManifest.xml文件,它對應的數據庫表爲:launcher.db
package com.shellway.shortcut; import android.support.v7.app.ActionBarActivity; import android.app.PendingIntent; import android.content.ComponentName; import android.content.Intent; import android.database.Cursor; import android.net.Uri; import android.os.Bundle; import android.os.Parcelable; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.widget.Toast; public class MainActivity extends ActionBarActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } public void create(View view){ if (isExist()) { Toast.makeText(this, "快捷方式已經存在", 1).show(); }else{ Intent intent = new Intent(); intent.setAction("com.android.launcher.action.INSTALL_SHORTCUT"); //設置快捷方式的名稱 intent.putExtra(Intent.EXTRA_SHORTCUT_NAME, "快捷方式"); //設置快捷方式的圖標 Parcelable icon = Intent.ShortcutIconResource.fromContext(this, R.drawable.main_icon); intent.putExtra(Intent.EXTRA_SHORTCUT_ICON_RESOURCE, icon); //設置快捷方式要要激活的應用 Intent i = new Intent(); i.setAction(Intent.ACTION_MAIN); i.addCategory(Intent.CATEGORY_LAUNCHER); i.setComponent(new ComponentName(this, MainActivity.class)); intent.putExtra(Intent.EXTRA_SHORTCUT_INTENT, i); //發出廣播 sendBroadcast(intent); } } //檢查快捷方式是否已經存在 public boolean isExist(){ Uri uri = null; //添加兼容性 if (getSDKVersion()<8) {//8表明2.2如下版本,而在2.2版本之前是launcher,以後纔是launcher2 uri = Uri.parse("content://com.android.launcher.settings/favorites"); }else{ uri = Uri.parse("content://com.android.launcher2.settings/favorites"); } boolean flag = false; Cursor c = getContentResolver().query(uri, null, "title=?", new String[]{"快捷方式"}, null); if (c.moveToNext()) { flag = true; } c.close(); return flag; } //獲得SDK版本信息 public int getSDKVersion(){ return android.os.Build.VERSION.SDK_INT; } //刪除快捷方式 public void delete(View view){ Intent intent = new Intent(); intent.setAction("com.android.launcher.action.UNINSTALL_SHORTCUT"); //設置快捷方式的名稱 intent.putExtra(Intent.EXTRA_SHORTCUT_NAME, "快捷方式"); //設置快捷方式的圖標 Parcelable icon = Intent.ShortcutIconResource.fromContext(this, R.drawable.main_icon); intent.putExtra(Intent.EXTRA_SHORTCUT_ICON_RESOURCE, icon); //設置快捷方式要要激活的應用 Intent i = new Intent(); i.setAction(Intent.ACTION_MAIN); i.addCategory(Intent.CATEGORY_LAUNCHER); i.setComponent(new ComponentName(this, MainActivity.class)); intent.putExtra(Intent.EXTRA_SHORTCUT_INTENT, i); //發出廣播 sendBroadcast(intent); } }
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:onClick="create" android:text="建立快捷圖標" /> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:onClick="delete" android:text="刪除快捷圖標" /> </LinearLayout>
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.shellway.shortcut" android:versionCode="1" android:versionName="1.0" > <uses-sdk android:minSdkVersion="8" android:targetSdkVersion="21" /> <uses-permission android:name="com.android.launcher.permission.INSTALL_SHORTCUT"/> <uses-permission android:name="com.android.launcher.permission.READ_SETTINGS"/> <uses-permission android:name="com.android.launcher.permission.UNINSTALL_SHORTCUT"/> <uses-permission android:name="com.android.launcher.permission.WRITE_SETTINGS"/> <application android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" > <activity android:name=".MainActivity" android:label="@string/app_name" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> </manifest>
運行結果截圖:
10、菜單的建立和上下文菜單
一、普通菜單:佈局文件實現和代碼實現兩種方式
package com.shellway.menu; import android.support.v7.app.ActionBarActivity; import android.os.Bundle; import android.view.Menu; import android.view.MenuInflater; import android.view.MenuItem; import android.view.SubMenu; import android.widget.Toast; public class MainActivity extends ActionBarActivity { private static final int MENU_NEW = 0; private static final int MENU_DELETE = 1; private static final int SUBMENU = 3; private static final int SUBMENU1 = 4; private static final int SUBMENU2 = 5; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } @Override public boolean onCreateOptionsMenu(Menu menu) { //編碼方式建立菜單 /* menu.add(0, MENU_NEW, 0, "新建"); menu.add(0, MENU_DELETE, 0, "刪除"); SubMenu subMenu = menu.addSubMenu("子菜單"); SubMenu subMenu1 = subMenu.addSubMenu(0, SUBMENU1, 0, "子菜單1"); SubMenu subMenu2 = subMenu.addSubMenu(0, SUBMENU2, 0, "子菜單2");*/ //這裏使用佈局文件建立菜單代替編碼方式 MenuInflater inflater = getMenuInflater(); inflater.inflate(R.menu.main, menu); return super.onCreateOptionsMenu(menu); } @Override public boolean onOptionsItemSelected(MenuItem item) { //給菜單添加點擊事件 int id = item.getItemId(); switch (id) { case MENU_NEW: Toast.makeText(this, item.getTitle(), Toast.LENGTH_SHORT).show(); break; case MENU_DELETE: Toast.makeText(this, item.getTitle(), Toast.LENGTH_SHORT).show(); break; case SUBMENU1: Toast.makeText(this, item.getTitle(), Toast.LENGTH_SHORT).show(); break; case SUBMENU2: Toast.makeText(this, item.getTitle(), Toast.LENGTH_SHORT).show(); break; default: Toast.makeText(this, item.getTitle(), Toast.LENGTH_SHORT).show(); break; } return super.onOptionsItemSelected(item); } }
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" tools:context="com.shellway.menu.MainActivity" > <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/hello_world" /> </RelativeLayout>
<menu xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" tools:context="com.shellway.menu.MainActivity" > <item android:id="@+id/menu_new" android:title="新創建" /> <item android:id="@+id/menu_delete" android:title="刪除" /> <item android:id="@+id/submenu" android:title="子菜單" > <menu> <item android:id="@+id/submenu1" android:title="子菜單1" /> <item android:id="@+id/submenu2" android:title="子菜單2" /> </menu> </item> </menu>
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.shellway.menu" android:versionCode="1" android:versionName="1.0" > <uses-sdk android:minSdkVersion="8" android:targetSdkVersion="21" /> <application android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" > <activity android:name=".MainActivity" android:label="@string/app_name" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> </manifest>
運行結果截圖:
二、上下文菜單:實現複製號碼到撥號盤、發送短信、複製電話號碼到剪切板
package com.shellway.contextmenu; import android.support.v7.app.ActionBarActivity; import android.annotation.SuppressLint; import android.content.ClipData; import android.content.ClipboardManager; import android.content.Context; import android.content.Intent; import android.database.Cursor; import android.graphics.Color; import android.net.Uri; import android.os.Bundle; import android.provider.CallLog.Calls; import android.view.ContextMenu; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.view.ViewGroup; import android.view.ContextMenu.ContextMenuInfo; import android.widget.AdapterView.AdapterContextMenuInfo; import android.widget.CursorAdapter; import android.widget.ListView; import android.widget.TextView; public class MainActivity extends ActionBarActivity { private static final int COPY_NUMBERTO_ID = 0; private static final int SEND_SMS_ID = 1; private static final int COPY_NUMBER_ID = 2; private ListView listview; private CursorAdapter adapter; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); listview = (ListView) findViewById(R.id.listview); //查詢聯繫人表得到聯繫人電話號碼 Cursor c = getContentResolver().query(Calls.CONTENT_URI, new String[]{Calls._ID,Calls.NUMBER} , null, null, null); adapter = new MyCursorAdapter(this, c); //若是數據是來自於手機本省的數據庫,就使用CursorAdpater的子類 listview.setAdapter(adapter); //註冊上下文菜單 registerForContextMenu(listview); } //建立一個上下文菜單 public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) { // TODO Auto-generated method stub menu.add(0, COPY_NUMBERTO_ID, 0, "複製電話號碼到撥號盤"); menu.add(0, SEND_SMS_ID, 0, "發送短信"); menu.add(0, COPY_NUMBER_ID, 0, "複製電話號碼"); super.onCreateContextMenu(menu, v, menuInfo); } //給上下文菜單添加點擊事件 @SuppressLint("NewApi") public boolean onContextItemSelected(MenuItem item) { // TODO Auto-generated method stub int id = item.getItemId(); AdapterContextMenuInfo info = (AdapterContextMenuInfo) item.getMenuInfo(); int position = info.position; Cursor c = (Cursor) adapter.getItem(position); String number = null; if (c.moveToNext()) { number = c.getString(c.getColumnIndex(Calls.NUMBER)); } Intent intent = null; switch (id) { case COPY_NUMBERTO_ID: intent = new Intent(); intent.setAction(Intent.ACTION_DIAL); intent.setData(Uri.parse("tel:" + number)); startActivity(intent); break; case SEND_SMS_ID: intent = new Intent(); intent.setAction(Intent.ACTION_SENDTO); intent.setData(Uri.parse("smsto:" + number)); startActivity(intent); break; case COPY_NUMBER_ID: //獲得剪貼板服務 ClipboardManager cm = (ClipboardManager) getSystemService(Context.CLIPBOARD_SERVICE); cm.setPrimaryClip(ClipData.newPlainText("number", number)); break; default: break; } return super.onContextItemSelected(item); } private class MyCursorAdapter extends CursorAdapter{ public MyCursorAdapter(Context context, Cursor c) { super(context, c); // TODO Auto-generated constructor stub } //建立item的佈局 public View newView(Context context, Cursor cursor, ViewGroup parent) { // TODO Auto-generated method stub TextView tv = new TextView(context); tv.setTextSize(22); //tv.setBackgroundColor(getResources().getColor(R.color.color)); tv.setBackgroundColor(Color.LTGRAY); tv.setTextColor(Color.BLACK); return tv; } //把數據與控件綁定 public void bindView(View view, Context context, Cursor cursor) { // TODO Auto-generated method stub String number = cursor.getString(cursor.getColumnIndex(Calls.NUMBER)); TextView tv = (TextView) view; tv.setText(number); } } }
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" > <ListView android:id="@+id/listview" android:layout_width="fill_parent" android:layout_height="fill_parent" ></ListView> </LinearLayout>
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.shellway.contextmenu" android:versionCode="1" android:versionName="1.0" > <uses-sdk android:minSdkVersion="8" android:targetSdkVersion="21" /> <uses-permission android:name="android.permission.READ_CONTACTS"/> <uses-permission android:name="android.permission.WRITE_CALL_LOG"/> <uses-permission android:name="android.permission.READ_CALL_LOG"/> <application android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" > <activity android:name=".MainActivity" android:label="@string/app_name" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> </manifest>
運行結果截圖:
上下文菜單通常是針對ListView(多條數據的操做)
11、反編譯反編譯的步驟:1 apktool1.4.1.tar.bz2 apktool-install-windows-r04-brut1.tar.bz2 dex2jar-0.0.7.11-SNAPSHOT.zip jd-gui.cfg 工具2 解壓上面的工具3 把apktool1.4.1.tar.bz2解壓出來的apktool.jar複製到apktool-install-windows-r04-brut1.tar.bz2目錄4 放置一個xxx.apk到apktool-install-windows-r04-brut1目錄cd /d C:\tools\apktool-install-windows-r04-brut1apktool.bat d -s taskman_2.apk 生成一個taskman_2的文件夾5 把classes.dex複製到C:\tools\dex2jar-0.0.7.11-SNAPSHOT\dex2jar-0.0.7.11-SNAPSHOTcd /d C:\tools\dex2jar-0.0.7.11-SNAPSHOT\dex2jar-0.0.7.11-SNAPSHOTdex2jar.bat classes.dex 生成 classes_dex2jar.jar6 經過jd-gui.cfg工具查看classes_dex2jar.jar