代码是参考某位仁兄的片段,以下是可行的完整测试代码:
参考信息:
Getting Height of Status and Title Bar
package com.aslibra.test;
import android.app.Activity;
import android.graphics.Rect;
import android.os.Bundle;
import android.util.Log;
import android.view.Window;
import android.widget.ImageView;
public class test extends Activity {
ImageView iv;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
iv = (ImageView) this.findViewById(R.id.ImageView01);
iv.post(new Runnable()
{
public void run()
{
viewInited();
}
}
);
Log.v("test", "== ok ==");
}
private void viewInited(){
Rect rect= new Rect();
Window window= getWindow();
iv.getWindowVisibleDisplayFrame(rect);
int statusBarHeight= rect.top;
int contentViewTop= window.findViewById(Window.ID_ANDROID_CONTENT).getTop();
int titleBarHeight= contentViewTop - statusBarHeight;
//测试结果:ok之后 100多 ms 才运行了
Log.v("test", "=-init-= statusBarHeight="+statusBarHeight+
" contentViewTop="+contentViewTop+
" titleBarHeight="+titleBarHeight);
}
/*
* 07-14 02:36:48.449: VERBOSE/test(1385): == ok ==
* 07-14 02:36:48.558: VERBOSE/test(1385): =-init-= statusBarHeight=25 contentViewTop=50 titleBarHeight=25
*/
}
import android.app.Activity;
import android.graphics.Rect;
import android.os.Bundle;
import android.util.Log;
import android.view.Window;
import android.widget.ImageView;
public class test extends Activity {
ImageView iv;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
iv = (ImageView) this.findViewById(R.id.ImageView01);
iv.post(new Runnable()
{
public void run()
{
viewInited();
}
}
);
Log.v("test", "== ok ==");
}
private void viewInited(){
Rect rect= new Rect();
Window window= getWindow();
iv.getWindowVisibleDisplayFrame(rect);
int statusBarHeight= rect.top;
int contentViewTop= window.findViewById(Window.ID_ANDROID_CONTENT).getTop();
int titleBarHeight= contentViewTop - statusBarHeight;
//测试结果:ok之后 100多 ms 才运行了
Log.v("test", "=-init-= statusBarHeight="+statusBarHeight+
" contentViewTop="+contentViewTop+
" titleBarHeight="+titleBarHeight);
}
/*
* 07-14 02:36:48.449: VERBOSE/test(1385): == ok ==
* 07-14 02:36:48.558: VERBOSE/test(1385): =-init-= statusBarHeight=25 contentViewTop=50 titleBarHeight=25
*/
}
参考信息:
Getting Height of Status and Title Bar
在上篇 android处理单击双击和滑动事件 里有介绍双击,可如果需要自己控制一个双击事件的单击间隔时间,怎么弄呢?
其实就是在单击之后,在间隔时间内等候下次点击再次发生,我们可以用线程处理等候时间,如果时间到了还没有下个点击,那就是取消双击的可能了,可以参考下面的代码:
其实就是在单击之后,在间隔时间内等候下次点击再次发生,我们可以用线程处理等候时间,如果时间到了还没有下个点击,那就是取消双击的可能了,可以参考下面的代码:
package com.aslibra.test;
import android.app.Activity;
import android.graphics.Color;
import android.os.Bundle;
import android.util.Log;
import android.view.GestureDetector;
import android.view.MotionEvent;
import android.view.GestureDetector.OnGestureListener;
import android.widget.LinearLayout;
import android.widget.TextView;
/*
* 自定义双击等待时间
* http://www.aslibra.com/blog/post/android_doubleClick.php
*/
public class touchGesture extends Activity implements OnGestureListener {
private LinearLayout main;
private TextView viewA;
private boolean waitDoubleClick = false;
private static final int DOUBLE_CLICK_TIME = 350;
private GestureDetector gestureScanner;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
gestureScanner = new GestureDetector(this);
main = new LinearLayout(this);
main.setBackgroundColor(Color.GRAY);
main.setLayoutParams(new LinearLayout.LayoutParams(320,480));
main.setOrientation(LinearLayout.VERTICAL);
viewA = new TextView(this);
viewA.setBackgroundColor(Color.YELLOW);
viewA.setTextColor(Color.BLACK);
viewA.setTextSize(16);
viewA.setLayoutParams(new LinearLayout.LayoutParams(320,50));
main.addView(viewA);
setContentView(main);
}
@Override
public boolean onTouchEvent(MotionEvent me) {
return gestureScanner.onTouchEvent(me);
}
@Override
public boolean onDown(MotionEvent e) {
//viewA.setText("-" + "DOWN" + "-");
return true;
}
@Override
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
//viewA.setText("-" + "FLING" + "- "+velocityX + "- "+velocityY);
Log.v("test", "onFling "+e1.getX()+" "+e2.getX());
return true;
}
@Override
public void onLongPress(MotionEvent e) {
//viewA.setText("-" + "LONG PRESS" + "-");
}
@Override
public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {
//viewA.setText("-" + "SCROLL" + "- "+distanceX + "- "+distanceY);
Log.v("test", "onScroll "+e1.getX()+" "+e2.getX());
return true;
}
@Override
public void onShowPress(MotionEvent e) {
//viewA.setText("-" + "SHOW PRESS" + "-");
}
@Override
public boolean onSingleTapUp(MotionEvent e) {
//viewA.setText("-" + "SINGLE TAP UP" + "-"+ i++);
Log.v("test", "onSingleTapUp "+e.getX()+" "+e.getY());
if(!waitDoubleClick){
waitDoubleClick = true;
Log.v("test", "waitDoubleClick");
//等待下次点击
Thread checkUpdate = new Thread() {
public void run() {
//固定时间后如果还没有改变状态,说明是单击,取消等待状态
try {
sleep( DOUBLE_CLICK_TIME );
if(waitDoubleClick){
waitDoubleClick = false;
Log.v("test", "cancle waitDoubleClick");
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
};
checkUpdate.start();
viewA.setText("");
}else{
//双击
waitDoubleClick = false;
onDoubleClick();
}
return true;
}
//双击事件
private void onDoubleClick(){
viewA.setText("dobule click");
Log.v("test", "DoubleClick");
}
}
import android.app.Activity;
import android.graphics.Color;
import android.os.Bundle;
import android.util.Log;
import android.view.GestureDetector;
import android.view.MotionEvent;
import android.view.GestureDetector.OnGestureListener;
import android.widget.LinearLayout;
import android.widget.TextView;
/*
* 自定义双击等待时间
* http://www.aslibra.com/blog/post/android_doubleClick.php
*/
public class touchGesture extends Activity implements OnGestureListener {
private LinearLayout main;
private TextView viewA;
private boolean waitDoubleClick = false;
private static final int DOUBLE_CLICK_TIME = 350;
private GestureDetector gestureScanner;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
gestureScanner = new GestureDetector(this);
main = new LinearLayout(this);
main.setBackgroundColor(Color.GRAY);
main.setLayoutParams(new LinearLayout.LayoutParams(320,480));
main.setOrientation(LinearLayout.VERTICAL);
viewA = new TextView(this);
viewA.setBackgroundColor(Color.YELLOW);
viewA.setTextColor(Color.BLACK);
viewA.setTextSize(16);
viewA.setLayoutParams(new LinearLayout.LayoutParams(320,50));
main.addView(viewA);
setContentView(main);
}
@Override
public boolean onTouchEvent(MotionEvent me) {
return gestureScanner.onTouchEvent(me);
}
@Override
public boolean onDown(MotionEvent e) {
//viewA.setText("-" + "DOWN" + "-");
return true;
}
@Override
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
//viewA.setText("-" + "FLING" + "- "+velocityX + "- "+velocityY);
Log.v("test", "onFling "+e1.getX()+" "+e2.getX());
return true;
}
@Override
public void onLongPress(MotionEvent e) {
//viewA.setText("-" + "LONG PRESS" + "-");
}
@Override
public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {
//viewA.setText("-" + "SCROLL" + "- "+distanceX + "- "+distanceY);
Log.v("test", "onScroll "+e1.getX()+" "+e2.getX());
return true;
}
@Override
public void onShowPress(MotionEvent e) {
//viewA.setText("-" + "SHOW PRESS" + "-");
}
@Override
public boolean onSingleTapUp(MotionEvent e) {
//viewA.setText("-" + "SINGLE TAP UP" + "-"+ i++);
Log.v("test", "onSingleTapUp "+e.getX()+" "+e.getY());
if(!waitDoubleClick){
waitDoubleClick = true;
Log.v("test", "waitDoubleClick");
//等待下次点击
Thread checkUpdate = new Thread() {
public void run() {
//固定时间后如果还没有改变状态,说明是单击,取消等待状态
try {
sleep( DOUBLE_CLICK_TIME );
if(waitDoubleClick){
waitDoubleClick = false;
Log.v("test", "cancle waitDoubleClick");
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
};
checkUpdate.start();
viewA.setText("");
}else{
//双击
waitDoubleClick = false;
onDoubleClick();
}
return true;
}
//双击事件
private void onDoubleClick(){
viewA.setText("dobule click");
Log.v("test", "DoubleClick");
}
}
android有处理鼠标动作的GestureDetector,使用起来也挺方便,几个常用事件你都可以找到接口接入处理:
单击、双击(比如双击放大)、滑动(比如翻页)
下面是简化的例子,参考并整合所得,来源参考页尾参考内容:
参考资料:
1 GestureDetector and GestureDetector.OnGestureListener
2 how to implement android double tap?
单击、双击(比如双击放大)、滑动(比如翻页)
下面是简化的例子,参考并整合所得,来源参考页尾参考内容:
package com.aslibra.test;
import android.app.Activity;
import android.graphics.Color;
import android.os.Bundle;
import android.util.Log;
import android.view.GestureDetector;
import android.view.MotionEvent;
import android.view.GestureDetector.OnGestureListener;
import android.widget.LinearLayout;
import android.widget.TextView;
public class touchGesture extends Activity implements OnGestureListener {
private LinearLayout main;
private TextView viewA;
private GestureDetector gestureScanner;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
gestureScanner = new GestureDetector(this);
gestureScanner.setOnDoubleTapListener(new GestureDetector.OnDoubleTapListener(){
public boolean onDoubleTap(MotionEvent e) {
viewA.setText("-" + "onDoubleTap" + "-");
//双击时产生一次
Log.v("test", "onDoubleTap");
return false;
}
public boolean onDoubleTapEvent(MotionEvent e) {
//双击时产生两次
Log.v("test", "onDoubleTapEvent");
return false;
}
public boolean onSingleTapConfirmed(MotionEvent e) {
viewA.setText("-" + "onSingleTapConfirmed" + "-");
//短快的点击算一次单击
Log.v("test", "onSingleTapConfirmed");
return false;
}
});
main = new LinearLayout(this);
main.setBackgroundColor(Color.GRAY);
main.setLayoutParams(new LinearLayout.LayoutParams(320,480));
main.setOrientation(LinearLayout.VERTICAL);
viewA = new TextView(this);
viewA.setBackgroundColor(Color.YELLOW);
viewA.setTextColor(Color.BLACK);
viewA.setTextSize(16);
viewA.setLayoutParams(new LinearLayout.LayoutParams(320,50));
main.addView(viewA);
setContentView(main);
}
@Override
public boolean onTouchEvent(MotionEvent me) {
return gestureScanner.onTouchEvent(me);
}
@Override
public boolean onDown(MotionEvent e) {
//viewA.setText("-" + "DOWN" + "-");
return true;
}
@Override
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
//viewA.setText("-" + "FLING" + "- "+velocityX + "- "+velocityY);
Log.v("test", "onFling "+e1.getX()+" "+e2.getX());
return true;
}
@Override
public void onLongPress(MotionEvent e) {
//viewA.setText("-" + "LONG PRESS" + "-");
}
@Override
public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {
//viewA.setText("-" + "SCROLL" + "- "+distanceX + "- "+distanceY);
Log.v("test", "onScroll "+e1.getX()+" "+e2.getX());
return true;
}
@Override
public void onShowPress(MotionEvent e) {
//viewA.setText("-" + "SHOW PRESS" + "-");
}
@Override
public boolean onSingleTapUp(MotionEvent e) {
Log.v("test", "onSingleTapUp");
//viewA.setText("-" + "SINGLE TAP UP" + "-"+ i++);
return true;
}
}
import android.app.Activity;
import android.graphics.Color;
import android.os.Bundle;
import android.util.Log;
import android.view.GestureDetector;
import android.view.MotionEvent;
import android.view.GestureDetector.OnGestureListener;
import android.widget.LinearLayout;
import android.widget.TextView;
public class touchGesture extends Activity implements OnGestureListener {
private LinearLayout main;
private TextView viewA;
private GestureDetector gestureScanner;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
gestureScanner = new GestureDetector(this);
gestureScanner.setOnDoubleTapListener(new GestureDetector.OnDoubleTapListener(){
public boolean onDoubleTap(MotionEvent e) {
viewA.setText("-" + "onDoubleTap" + "-");
//双击时产生一次
Log.v("test", "onDoubleTap");
return false;
}
public boolean onDoubleTapEvent(MotionEvent e) {
//双击时产生两次
Log.v("test", "onDoubleTapEvent");
return false;
}
public boolean onSingleTapConfirmed(MotionEvent e) {
viewA.setText("-" + "onSingleTapConfirmed" + "-");
//短快的点击算一次单击
Log.v("test", "onSingleTapConfirmed");
return false;
}
});
main = new LinearLayout(this);
main.setBackgroundColor(Color.GRAY);
main.setLayoutParams(new LinearLayout.LayoutParams(320,480));
main.setOrientation(LinearLayout.VERTICAL);
viewA = new TextView(this);
viewA.setBackgroundColor(Color.YELLOW);
viewA.setTextColor(Color.BLACK);
viewA.setTextSize(16);
viewA.setLayoutParams(new LinearLayout.LayoutParams(320,50));
main.addView(viewA);
setContentView(main);
}
@Override
public boolean onTouchEvent(MotionEvent me) {
return gestureScanner.onTouchEvent(me);
}
@Override
public boolean onDown(MotionEvent e) {
//viewA.setText("-" + "DOWN" + "-");
return true;
}
@Override
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
//viewA.setText("-" + "FLING" + "- "+velocityX + "- "+velocityY);
Log.v("test", "onFling "+e1.getX()+" "+e2.getX());
return true;
}
@Override
public void onLongPress(MotionEvent e) {
//viewA.setText("-" + "LONG PRESS" + "-");
}
@Override
public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {
//viewA.setText("-" + "SCROLL" + "- "+distanceX + "- "+distanceY);
Log.v("test", "onScroll "+e1.getX()+" "+e2.getX());
return true;
}
@Override
public void onShowPress(MotionEvent e) {
//viewA.setText("-" + "SHOW PRESS" + "-");
}
@Override
public boolean onSingleTapUp(MotionEvent e) {
Log.v("test", "onSingleTapUp");
//viewA.setText("-" + "SINGLE TAP UP" + "-"+ i++);
return true;
}
}
参考资料:
1 GestureDetector and GestureDetector.OnGestureListener
2 how to implement android double tap?
android程序如果需要全屏或者去掉标题栏,则可以在oncreate开始处,在未处理layout前加上:
今天处理了时间戳的问题,sqlite里面没有自动更新的timestamp字段,需要自己更新:
另外一个不同语言的时间戳的方法:
protected void onCreate(Bundle savedInstanceState) {
//不显示标题栏
requestWindowFeature(Window.FEATURE_NO_TITLE);
//全屏,不显示信息栏
//getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN ,
// WindowManager.LayoutParams.FLAG_FULLSCREEN);
super.onCreate(savedInstanceState);
....
//不显示标题栏
requestWindowFeature(Window.FEATURE_NO_TITLE);
//全屏,不显示信息栏
//getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN ,
// WindowManager.LayoutParams.FLAG_FULLSCREEN);
super.onCreate(savedInstanceState);
....
今天处理了时间戳的问题,sqlite里面没有自动更新的timestamp字段,需要自己更新:
private void updateArticle(long aId) {
//取得时间戳
long timestamp = System.currentTimeMillis()/1000;
String sql = "update aslibra_article set lastTime='"+timestamp+"' where aId = "+aId;
mDb.execSQL(sql);
}
//取得时间戳
long timestamp = System.currentTimeMillis()/1000;
String sql = "update aslibra_article set lastTime='"+timestamp+"' where aId = "+aId;
mDb.execSQL(sql);
}
另外一个不同语言的时间戳的方法:
引用
To Get Unix timestamp value in seconds
java:
long timestamp = System.currentTimeMillis()/1000
Python:
import time
timestamp = int(time.time())
Erlang:
{Mega, Secs, _} = now(),
Timestamp = Mega*1000000 + Secs,
Working with timestamps in MySQL
mysql> SELECT UNIX_TIMESTAMP('1997-10-04 22:23:00');
-> 875996580
mysql> SELECT FROM_UNIXTIME(1111885200);
+---------------------------+
| FROM_UNIXTIME(1111885200) |
+---------------------------+
| 2005-03-27 03:00:00 |
+---------------------------+
java:
long timestamp = System.currentTimeMillis()/1000
Python:
import time
timestamp = int(time.time())
Erlang:
{Mega, Secs, _} = now(),
Timestamp = Mega*1000000 + Secs,
Working with timestamps in MySQL
mysql> SELECT UNIX_TIMESTAMP('1997-10-04 22:23:00');
-> 875996580
mysql> SELECT FROM_UNIXTIME(1111885200);
+---------------------------+
| FROM_UNIXTIME(1111885200) |
+---------------------------+
| 2005-03-27 03:00:00 |
+---------------------------+
这个例子很简单,打开线程处理任务变得很轻松:
原文:Display a progress dialog while computing
final ProgressDialog dialog = ProgressDialog.show(this, "Title", "Message", true);
final Handler handler = new Handler() {
public void handleMessage(Message msg) {
dialog.dismiss();
}
};
Thread checkUpdate = new Thread() {
public void run() {
//
// YOUR LONG CALCULATION (OR OTHER) GOES HERE
//
handler.sendEmptyMessage(0);
}
};
checkUpdate.start();
final Handler handler = new Handler() {
public void handleMessage(Message msg) {
dialog.dismiss();
}
};
Thread checkUpdate = new Thread() {
public void run() {
//
// YOUR LONG CALCULATION (OR OTHER) GOES HERE
//
handler.sendEmptyMessage(0);
}
};
checkUpdate.start();
原文:Display a progress dialog while computing
在PHP中,我习惯转换xml为数组,在android里面,我也喜欢这样,可以分配到map类型。
先看看示例数据:
我们可以用一个Map类型的变量保存最后的结果:
简单的分析一下:
取得xml里site的所有节点 doc.getElementsByTagName("site")
取得某个子节点 doc.getElementsByTagName("site").item(i)
取得节点包含的字符串 mysite.getFirstChild().getNodeValue()
取得属性值 mysite.getAttributes().item(j).getNodeName()
取得属性的值 mysite.getAttributes().item(j).getNodeValue()
这有点复杂,貌似我也不习惯,可记住之后,自己就知道怎么取xml值了,一般xml有如下类型
根据A取得此小段,D是此段的getFirstChild().getNodeValue()
B是此段的getAttributes().item(j).getNodeName()
C是此段的getAttributes().item(j).getNodeValue()
当然,有多个,那就循环一下即可
最终得到类似php数组类型,可以自己遍历来用:
先看看示例数据:
<?xml version="1.0" encoding="UTF-8"?>
<list>
<site id="65" url="http://www.aslibra.com" >阿权的书房</site>
<site id="5" url="http://www.google.com" >谷歌</site>
</list>
<list>
<site id="65" url="http://www.aslibra.com" >阿权的书房</site>
<site id="5" url="http://www.google.com" >谷歌</site>
</list>
我们可以用一个Map类型的变量保存最后的结果:
Map<Integer,Map<String,String>> sites = new HashMap<Integer,Map<String,String>>();
try{
String myurl = "http://www.aslibra.com/teach/android/sites.xml";
URL url = new URL(myurl);
HttpURLConnection conn;
conn = (HttpURLConnection) url.openConnection();
conn.setDoInput(true);
conn.connect();
InputStream is = conn.getInputStream();
DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
Document doc = builder.parse(is);
NodeList nl = doc.getElementsByTagName("site");
int sites_number = nl.getLength();
for (int i=0; i<sites_number; i++){
Node mysite = doc.getElementsByTagName("site").item(i);
Map<String,String> sitesChild = new HashMap<String,String>();
sitesChild.put("siteName", mysite.getFirstChild().getNodeValue());
for(int j=0;j<mysite.getAttributes().getLength();j++){
sitesChild.put( mysite.getAttributes().item(j).getNodeName(),
mysite.getAttributes().item(j).getNodeValue() );
}
sites.put(i, sitesChild);
}
}catch(Exception e){
//Log.e(tag, e.toString() );
}
Log.d(tag, "size:"+sites.size() );
try{
String myurl = "http://www.aslibra.com/teach/android/sites.xml";
URL url = new URL(myurl);
HttpURLConnection conn;
conn = (HttpURLConnection) url.openConnection();
conn.setDoInput(true);
conn.connect();
InputStream is = conn.getInputStream();
DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
Document doc = builder.parse(is);
NodeList nl = doc.getElementsByTagName("site");
int sites_number = nl.getLength();
for (int i=0; i<sites_number; i++){
Node mysite = doc.getElementsByTagName("site").item(i);
Map<String,String> sitesChild = new HashMap<String,String>();
sitesChild.put("siteName", mysite.getFirstChild().getNodeValue());
for(int j=0;j<mysite.getAttributes().getLength();j++){
sitesChild.put( mysite.getAttributes().item(j).getNodeName(),
mysite.getAttributes().item(j).getNodeValue() );
}
sites.put(i, sitesChild);
}
}catch(Exception e){
//Log.e(tag, e.toString() );
}
Log.d(tag, "size:"+sites.size() );
简单的分析一下:
取得xml里site的所有节点 doc.getElementsByTagName("site")
取得某个子节点 doc.getElementsByTagName("site").item(i)
取得节点包含的字符串 mysite.getFirstChild().getNodeValue()
取得属性值 mysite.getAttributes().item(j).getNodeName()
取得属性的值 mysite.getAttributes().item(j).getNodeValue()
这有点复杂,貌似我也不习惯,可记住之后,自己就知道怎么取xml值了,一般xml有如下类型
<A B="C">D</A>
根据A取得此小段,D是此段的getFirstChild().getNodeValue()
B是此段的getAttributes().item(j).getNodeName()
C是此段的getAttributes().item(j).getNodeValue()
当然,有多个,那就循环一下即可
最终得到类似php数组类型,可以自己遍历来用:
Map<Integer,Map<String,String>> sites = XXXX(前面的处理返回值);
int len = sites.size();
Map<String,String> row;
for(int i=0;i<len;i++){
row = sites.get(i);
//比如row.get("url")
}
int len = sites.size();
Map<String,String> row;
for(int i=0;i<len;i++){
row = sites.get(i);
//比如row.get("url")
}
看着网上教程做的,可以参考附录的文章,这里简单说明一些体会:
1 注册admob账号,忽略
2 添加一个网站/程序,添加后,会有一个文件下载提示,下载回来就是范例和jar等文件,并且会提示你 Publisher ID
3 工程导入该jar文件,可以使用external jar,不用放工程目录的
4 添加attrs.xml,主要是adview的样式,如果添加后说找不到某个key,那可能是这里没有定义
5 修改 AndroidManifest.xml
主要是添加Publisher ID和允许互联网访问
6 添加一个AdView到你的界面
这里注意的是前面的 xmlns
1 注册admob账号,忽略
2 添加一个网站/程序,添加后,会有一个文件下载提示,下载回来就是范例和jar等文件,并且会提示你 Publisher ID
3 工程导入该jar文件,可以使用external jar,不用放工程目录的
4 添加attrs.xml,主要是adview的样式,如果添加后说找不到某个key,那可能是这里没有定义
5 修改 AndroidManifest.xml
主要是添加Publisher ID和允许互联网访问
<meta-data android:value="a14bd55de1982dd" android:name="ADMOB_PUBLISHER_ID" />
</application>
<uses-sdk android:minSdkVersion="3" />
<uses-permission android:name="android.permission.INTERNET" />
</application>
<uses-sdk android:minSdkVersion="3" />
<uses-permission android:name="android.permission.INTERNET" />
6 添加一个AdView到你的界面
这里注意的是前面的 xmlns






