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

时间:2023-01-20 14:33:53

一、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_分页加载数据_菜单

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

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>
<!-- 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>

AndroidManifest.xml

运行结果截图:

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

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

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

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

MainActivity.java

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

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

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_分页加载数据_菜单

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

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

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_分页加载数据_菜单java攻城狮之路(Android篇)--widget_webview_metadata_popupwindow_tabhost_分页加载数据_菜单

四、metadata元数据

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

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>
<!-- 给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>

AndroidManifest.xml

运行结果截图:

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

五、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_分页加载数据_菜单

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"?>
<!--
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>

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_分页加载数据_菜单java攻城狮之路(Android篇)--widget_webview_metadata_popupwindow_tabhost_分页加载数据_菜单

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

六、泡泡窗口:popupwindow

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

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_分页加载数据_菜单

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

java攻城狮之路(Android篇)--widget_webview_metadata_popupwindow_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;
} }

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_分页加载数据_菜单

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

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

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

MainActivity.java

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

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_分页加载数据_菜单

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

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

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_分页加载数据_菜单java攻城狮之路(Android篇)--widget_webview_metadata_popupwindow_tabhost_分页加载数据_菜单java攻城狮之路(Android篇)--widget_webview_metadata_popupwindow_tabhost_分页加载数据_菜单

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

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

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

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_分页加载数据_菜单

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

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

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_分页加载数据_菜单

上下文菜单一般是针对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

java攻城狮之路(Android篇)--widget_webview_metadata_popupwindow_tabhost_分页加载数据_菜单的更多相关文章

  1. java攻城狮之路&lpar;Android篇&rpar;--BroadcastReceiver&amp&semi;Service

    四大组件:activity 显示. contentProvider 对外暴露自己的数据给其他的应用程序.BroadcastReceiver 广播接收者,必须指定要接收的广播类型.必须明确的指定acti ...

  2. java攻城狮之路&lpar;Android篇&rpar;--MP3 MP4、拍照、国际化、样式主题、图片移动和缩放

    一.MP3播放器 查看Android API文档可以看到MediaPlayer状态转换图: 练习: package com.shellway.mp3player; import java.io.Fil ...

  3. java攻城狮之路&lpar;Android篇&rpar;--Activity生命

    一:Activity的激活 1.写一个类 extends Activity Activity是android的四大组件之一.Activity的激活分为显式意图激活和隐式意图激活.如果一个activit ...

  4. java攻城狮之路&lpar;Android篇&rpar;--与服务器交互

    一.图片查看器和网页源码查看器 在输入地址的是不能输入127.0.0.1 或者是 localhost.ScrollView :可以看成一个滚轴 可以去包裹很多的控件在里面 练习1(图片查看器): pa ...

  5. java攻城狮之路&lpar;Android篇&rpar;--ListView与ContentProvider

    一.ListView 1.三种Adapter构建ListView ListView添加条目的时候, 可以使用setAdapter(ListAdapter)方法, 常用的ListAdapter有三种 B ...

  6. java攻城狮之路&lpar;Android篇&rpar;--SQLite

    一.Junit    1.怎么使用        在AndroidManifest.xml文件中进行配置, 在manifest借点下配置instrumentation, 在application借点下 ...

  7. java攻城师之路&lpar;Android篇&rpar;--搭建开发环境、拨打电话、发送短信、布局例子

    一.搭建开发环境 1.所需资源 JDK6以上 Eclipse3.6以上 SDK17, 2.3.3 ADT17 2.安装注意事项 不要使用中文路径 如果模拟器默认路径包含中文, 可以设置android_ ...

  8. Android中ListView分页加载数据

    public class MainActivity extends Activity { private ListView listView=null; //listview的数据填充器 privat ...

  9. java攻城狮之路--复习xml&amp&semi;dom&lowbar;pull编程续

    本章节我们要学习XML三种解析方式: 1.JAXP DOM 解析2.JAXP SAX 解析3.XML PULL 进行 STAX 解析 XML 技术主要企业应用1.存储和传输数据 2.作为框架的配置文件 ...

随机推荐

  1. ASP&period;NET Web API 2&period;1支持Binary JSON(Bson)

    ASP.NET Web API 2.1内建支持XML.Json.Bson.form-urlencoded的MiME type,今天重点介绍下Bson.BSON是由10gen开发的一个数据格式,目前主要 ...

  2. redis 密码配置

    http://blog.csdn.net/vtopqx/article/details/46833099 http://www.2cto.com/database/201412/365757.html ...

  3. CSS分页

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  4. (原)Ubuntu14中安装GraphicsMagick

    转载请注明出处: http://www.cnblogs.com/darkknightzh/p/5661439.html 参考网址: http://comments.gmane.org/gmane.co ...

  5. mysql 组合索引

    MySQL单列索引是我们使用MySQL数据库中经常会见到的,MySQL单列索引和组合索引的区别可能有很多人还不是十分的了解,下面就为您分析两者的主要区别,供您参考学习. 为了形象地对比两者,再建一个表 ...

  6. SQL查询多条不重复记录值简要解析【转载】

    转载http://hi.baidu.com/my_favourate/item/3716b0cbe125f312505058eb SQL查询多条不重复记录值简要解析2008-02-28 11:36 以 ...

  7. &lbrack;No0000EB&rsqb;C&num; 数组(Array)

    数组是一个存储相同类型元素的固定大小的顺序集合.数组是用来存储数据的集合,通常认为数组是一个同一类型变量的集合. 声明数组变量并不是声明 number0.number1.....number99 一个 ...

  8. Linux下使用Quagga&lpar;Zebra&rpar;搭建路由器记录(转)

    写在前面 从22号中午开始琢磨zebra/quagga的用法,一直到晚上11点多都没有什么头绪.各种Google,百度,几近崩溃.由于网上关于zebra/quagga的配置方法都是在真实的若干台电脑上 ...

  9. 12C的审计模式

    1.Mixed Auditing Policy 混合审计模式支持新的审计引擎和老的审计引擎一起工作数据库升级后,已有的审计设置不会受到影响.但是官方建议迁移到统一审计模式.数据库创建后,默认是使用混合 ...

  10. 【uoj121】 NOI2013—向量内积

    http://uoj.ac/problem/121 (题目链接) 题意 给出${n}$个${d}$维向量,问是否有两个不同的向量的内积是${k}$的倍数. Solution 又卡了一上午常数,我弃了T ...