java攻城狮之路(Android篇)--widget_webview_metadata_popupwindow_tabhost_分页加载数据_菜单...

一、widget:桌面小控件
1 写一个类extends AppWidgetProvider
2 在清单文件件中注册:

<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.xml

<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攻城狮之路(Android篇)--widget_webview_metadata_popupwindow_tabhost_分页加载数据_菜单..._第1张图片

java攻城狮之路(Android篇)--widget_webview_metadata_popupwindow_tabhost_分页加载数据_菜单..._第2张图片

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);
    }

}
MainActivity.java
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);
    }
}
ExampleAppWidgetProvider.java
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;
    }

}
MyService.java
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>
新建在res/xml文件下的example_appwidget.xml
<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>
布局文件:activity_main.xml
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>
布局文件:widget.xml
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>
        
        <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>
AndroidManifest.xml

运行结果截图:

java攻城狮之路(Android篇)--widget_webview_metadata_popupwindow_tabhost_分页加载数据_菜单..._第3张图片

二、网页实现界面:webview
1 数据:应该来自于手机本身。
网页资源若放在本地asset目录中则会自动产生一个:file:///android_asset/目录
webview 可以把一个java对象传递给网页,再让javascript去调用这个对象里面的方法
1 onload() javascript 代码调用java代码 java再调用javascript

java攻城狮之路(Android篇)--widget_webview_metadata_popupwindow_tabhost_分页加载数据_菜单..._第4张图片

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 {
        //网页一加载就会执行οnlοad="javascript:contact.showcontacts()",写方法
        public void showcontacts(){
            try {
                List 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);
        }
    }
}
MainActivity.java
package com.shellway.service;

import java.util.ArrayList;
import java.util.List;

import com.shellway.domain.Contact;

public class ContactService {
    //模拟数据
    public List getContact(){
        List contacts = new ArrayList();
        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;
    }
}
ContactService.java
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 + "]";
    }
      
}
Contact.java
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 heretitle>
<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 = ""+ jsonobjs[y].phone+ ""; 
            }
    }
script>

head>

<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>
index.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>
布局文件:activity_main.xml
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>
AndroidManifest.xml

运行结果截图:

java攻城狮之路(Android篇)--widget_webview_metadata_popupwindow_tabhost_分页加载数据_菜单..._第5张图片

三、安装和卸载应用apk的minetype为:application/vnd.android.package-archive

java攻城狮之路(Android篇)--widget_webview_metadata_popupwindow_tabhost_分页加载数据_菜单..._第6张图片

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);
    }
}
MainActivity.java
<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>
activity_mian.xml
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>
AndroidManifest.xml

运行结果截图:

java攻城狮之路(Android篇)--widget_webview_metadata_popupwindow_tabhost_分页加载数据_菜单..._第7张图片java攻城狮之路(Android篇)--widget_webview_metadata_popupwindow_tabhost_分页加载数据_菜单..._第8张图片

四、metadata元数据

java攻城狮之路(Android篇)--widget_webview_metadata_popupwindow_tabhost_分页加载数据_菜单..._第9张图片

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();
        }
    }
}
MainActivity.java
<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>
activity_main.xml
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>
            
            <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>
AndroidManifest.xml

运行结果截图:

java攻城狮之路(Android篇)--widget_webview_metadata_popupwindow_tabhost_分页加载数据_菜单..._第10张图片

五、drawble:有一个可以把图片处理成.9.png类型的工具在android-sdk\tools下的draw9patch.bat
1、Layer List:叠代列表,比如相框和相片的关系
2、State List:状态列表,比如不点击是一个状态,点击了又是一个状态
3、Level List:打分效果,比如信号强弱
4、Transition Drawable:移动动画,即从一个动画到什么样的一个动画
5、Inset Drawable:插入图片,比如可以在一张图片周围空余的地方插入另一张图片
6、Clip Drawable:裁剪图片,比如进度条
7、Scale Drawable:拉伸和缩放图片
8、Shape Drawable:通过编码XML文件绘制一张图形,经常用到

java攻城狮之路(Android篇)--widget_webview_metadata_popupwindow_tabhost_分页加载数据_菜单..._第11张图片

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);
                                       
    }
}
MainActivity.java
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>
layerlist.xml
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>
levellist.xml
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>
selector.xml
xml version="1.0" encoding="utf-8"?>

<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>
shaplist.xml
<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>
布局文件:activity_main.xml
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>
AndroidManifest.xml

运行结果截图:

java攻城狮之路(Android篇)--widget_webview_metadata_popupwindow_tabhost_分页加载数据_菜单..._第12张图片java攻城狮之路(Android篇)--widget_webview_metadata_popupwindow_tabhost_分页加载数据_菜单..._第13张图片

java攻城狮之路(Android篇)--widget_webview_metadata_popupwindow_tabhost_分页加载数据_菜单..._第14张图片java攻城狮之路(Android篇)--widget_webview_metadata_popupwindow_tabhost_分页加载数据_菜单..._第15张图片

六、泡泡窗口:popupwindow

java攻城狮之路(Android篇)--widget_webview_metadata_popupwindow_tabhost_分页加载数据_菜单..._第16张图片

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;
        }
    }
}
MainActivity.java
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>
bg.xml
<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>
布局文件:activity_main.xml
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>
布局文件:opupwindow.xml
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>
布局文件:item.xml
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>
AndroidManifest.xml

运行结果截图:

java攻城狮之路(Android篇)--widget_webview_metadata_popupwindow_tabhost_分页加载数据_菜单..._第17张图片

七、tabhost标签页、自定义标签页

java攻城狮之路(Android篇)--widget_webview_metadata_popupwindow_tabhost_分页加载数据_菜单..._第18张图片

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;
    }

    
}
MainActivity.java
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>
selector.xml
<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>
布局文件:activity_main.xml
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>
布局文件:tb.xml
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>
AndroidManifest.xml

运行结果截图:

java攻城狮之路(Android篇)--widget_webview_metadata_popupwindow_tabhost_分页加载数据_菜单..._第19张图片

八、数据量多:分页加载数据

java攻城狮之路(Android篇)--widget_webview_metadata_popupwindow_tabhost_分页加载数据_菜单..._第20张图片

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 data;//加载的总数据
    private DataService service;
    private ArrayAdapter 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 result = (ArrayList) 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();
        List result = service.getData(1, 20);
        data.addAll(result);
        adapter = new ArrayAdapter(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 data = service.getData(totalCount+1, pageSize);
                        Message msg = new Message();
                        msg.what = FINISH_GET_DATA;
                        msg.obj = data;
                        handler.sendMessage(msg);
                    }
                }.start();
            }
        }
    }
}
MainActivity.java
package com.shellway.service;

import java.util.ArrayList;
import java.util.List;

public class DataService {
     //加载数据
     public List getData(int startData,int pageSize){
         int length = startData + pageSize;
         List list = new ArrayList();
         for (int i = startData; i < length; i++) {
            String data = new String("分页加载的数据:数据"+i);
            list.add(data);
        }
         return list;
     }
}
DataService.java
<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>
布局文件:activity_main.xml
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>
布局文件footer.xml
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>
布局文件:item.xml
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>
AndroidManifest.xml

运行结果截图:

java攻城狮之路(Android篇)--widget_webview_metadata_popupwindow_tabhost_分页加载数据_菜单..._第21张图片

九、快捷图标的创建和删除
可以参考Android源码中的apps\Launcher2\AndroidManifest.xml文件,它对应的数据库表为:launcher.db

java攻城狮之路(Android篇)--widget_webview_metadata_popupwindow_tabhost_分页加载数据_菜单..._第22张图片

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);
    }
    
}
MainActivity.java
<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>
布局文件:activity_main.xml
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>
AndroidManifest.xml

运行结果截图:

java攻城狮之路(Android篇)--widget_webview_metadata_popupwindow_tabhost_分页加载数据_菜单..._第23张图片java攻城狮之路(Android篇)--widget_webview_metadata_popupwindow_tabhost_分页加载数据_菜单..._第24张图片java攻城狮之路(Android篇)--widget_webview_metadata_popupwindow_tabhost_分页加载数据_菜单..._第25张图片

十、菜单的创建和上下文菜单

1、普通菜单:布局文件实现和代码实现两种方式

java攻城狮之路(Android篇)--widget_webview_metadata_popupwindow_tabhost_分页加载数据_菜单..._第26张图片

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);
    }
}
MainActivity.java
<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>
布局文件:activity_main.xml
<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>
menu目录下的菜单文件:main.xml
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>
AndroidManifest.xml

运行结果截图:

java攻城狮之路(Android篇)--widget_webview_metadata_popupwindow_tabhost_分页加载数据_菜单..._第27张图片

2、上下文菜单:实现复制号码到拨号盘、发送短信、复制电话号码到剪切板

java攻城狮之路(Android篇)--widget_webview_metadata_popupwindow_tabhost_分页加载数据_菜单..._第28张图片

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);
        }
    }
}
MainActivity.xml
<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>
activity_main.xml
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>
AndroidManifest.xml

运行结果截图:

java攻城狮之路(Android篇)--widget_webview_metadata_popupwindow_tabhost_分页加载数据_菜单..._第29张图片

上下文菜单一般是针对ListView(多条数据的操作)

十一、反编译
反编译的步骤:
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-brut1
apktool.bat d -s taskman_2.apk 生成一个taskman_2的文件夹
5 把classes.dex复制到C:\tools\dex2jar-0.0.7.11-SNAPSHOT\dex2jar-0.0.7.11-SNAPSHOT
cd /d C:\tools\dex2jar-0.0.7.11-SNAPSHOT\dex2jar-0.0.7.11-SNAPSHOT
dex2jar.bat classes.dex 生成 classes_dex2jar.jar
6 通过jd-gui.cfg工具查看classes_dex2jar.jar

 

转载于:https://www.cnblogs.com/shellway/p/4197782.html

你可能感兴趣的:(java攻城狮之路(Android篇)--widget_webview_metadata_popupwindow_tabhost_分页加载数据_菜单...)