0%

替换后:最终效果如下图,点击菜单会切换Activity,有动画效果。 从早上起床就研究这个东西,因为之前一直都直接用系统提供的几个控件,从来没搞过图片背景、嵌套布局什么的,今天是第一次,没什么经验,花了一个上午才搞定。 简单介绍一下思路,使用LinearLayout嵌套,分三部分,第一部分是顶部的标题栏,第二部分是内容,第三部分是底部菜单。参考网上的代码,一路顺风顺水搞定,但在模拟器测试时出了问题(开发时用I9000),模拟器的屏幕是HVGA的,在上面运行看不到菜单栏。这个问题困扰了很久,网上也搜不出有用的答案(说是用dip,不用px,我开始就是用dip的),最后还是自己冥思苦想解决了问题,解决方法也很简单,就是让内容fill_parent,然后菜单layout_marginTop取个负值。 2011年7月18日更新:其实上面的问题可以用相对布局RelativeLayout解决,很简单,具体用法自己搜索一下吧,有时间我会写篇 main.xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" android:layout_width="fill_parent"
    android:gravity="clip_horizontal"
    android:layout_height="fill_parent" android:id="@+id/toplayout">
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:orientation="horizontal" android:layout_width="fill_parent"
        android:layout_height="30dip" android:background="@drawable/header"
        android:gravity="center">
        <TextView android:layout_width="wrap_content"
            android:layout_height="wrap_content" android:id="@+id/toptv"
            android:gravity="center" android:textSize="20dip"
            android:layout_gravity="center" android:text="@string/home"/>
    </LinearLayout>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:orientation="vertical" android:layout_width="fill_parent"
        android:layout_height="fill_parent">
                <TextView android:layout_width="wrap_content"
            android:gravity="center" android:textSize="20dip"
            android:layout_gravity="center" android:text="@string/home" android:layout_height="fill_parent"/>
    </LinearLayout>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:orientation="vertical" android:layout_width="fill_parent" android:layout_marginTop="-50dip"
        android:layout_height="50dip" android:gravity="bottom" android:background="@drawable/header">
        <include layout="@layout/foot" />
    </LinearLayout>
</LinearLayout>

foot.xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="horizontal" android:layout_width="fill_parent"
    android:layout_height="wrap_content">
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:orientation="vertical" android:layout_width="80dip"
        android:layout_height="80dip" android:id="@+id/home"
        android:gravity="center_horizontal"
        >
        <TextView android:layout_width="wrap_content"
            android:layout_height="50dip"
            android:gravity="center" android:paddingTop="29dip"
            android:background="@drawable/tab_home"
            android:id="@+id/hometv"			
             />
    </LinearLayout>
    <ImageView android:layout_width="wrap_content"
            android:layout_height="wrap_content"  android:src="@drawable/line" />
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:orientation="vertical" android:layout_width="80dip"
        android:layout_height="wrap_content" android:gravity="center_horizontal"
        android:id="@+id/channel">
        <TextView android:layout_width="wrap_content"
            android:layout_height="50dip"
            android:gravity="center" android:paddingTop="29dip"
             android:background="@drawable/tab_channel" android:id="@+id/channeltv" />
    </LinearLayout>
    <ImageView android:layout_width="wrap_content"
            android:layout_height="wrap_content"  android:src="@drawable/line" />
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:orientation="vertical" android:layout_width="80dip" android:id="@+id/fav"
        android:layout_height="wrap_content" android:gravity="center_horizontal" >
        <TextView android:layout_width="wrap_content"
            android:layout_height="50dip"
            android:gravity="center" android:paddingTop="29dip"
             android:background="@drawable/tab_fav" android:id="@+id/favtv" />
    </LinearLayout>
    <ImageView android:layout_width="wrap_content"
            android:layout_height="wrap_content"  android:src="@drawable/line" />
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:orientation="vertical" android:layout_width="80dip" android:id="@+id/search"
        android:layout_height="wrap_content" android:gravity="center_horizontal">
        <TextView android:layout_width="wrap_content"
            android:layout_height="50dip"
            android:gravity="center" android:paddingTop="29dip"
             android:background="@drawable/tab_search" android:id="@+id/searchtv"/>
    </LinearLayout>
</LinearLayout>

main.java: 动画效果scale.xml:

<set xmlns:android="http://schemas.android.com/apk/res/android">
    <scale android:interpolator="@android:anim/decelerate_interpolator"
        android:fromXScale="0.0" 
        android:toXScale="1.0" 
        android:fromYScale="0.0"
        android:toYScale="1.0" 
        android:pivotX="50%" 
        android:pivotY="50%"
        android:fillAfter="true" 
        android:duration="300" />
</set>

其他几个activity代码就不贴了,反正内容都一样,下面有代码打包供大家参考。 [download id=”11”]

在程序中除了用VideoView可以播放视频外,也可以利用Intent,调用外部系统播放器来播放视频。

        Intent intent = new Intent(Intent.ACTION_VIEW);
        String type = "video/mp4";
        Uri name = Uri.parse("http://f.youku.com/player/getFlvPath/sid/129854212582401_01/st/mp4/fileid/03000801004D6526C97FEF04785EA6F0D54811-8D31-A46E-A24D-C648913873BE?K=c1d181b998f9c289161b850a");
        intent.setDataAndType(name, type);
        startActivity(intent); 

这里的例子是在线播放优酷的视频

先看效果图: 图中显示了一个activity启动另一个activity的效果,布局文件是同一个。其中被启动的activity2是以对话框样式显示,不完全覆盖住启动它的activit1,类似alertDialog。这与普通的activity不同,默认情况下,activity2会完全遮住activity1,启动activity2后,会调用activity1的onStop方法,而这种以对话框样式显示的activity不会。 实现方法: 在AndroidManifest.xml注册activity2的时候,给activity2加上下面的属性:

<activity android:name=".activity2" android:theme="@android:style/Theme.Dialog"></activity>

其他步骤与普通的activity相同。

今天把网站搬到了韩国,大家是不是感觉快了点呢?

当我们的APP升级到新版本时,一般采用的方法就是程序检测服务器上的版本,如果比当前版本更新,则下载服务器上的版本,然后安装。这里就不讨论下载的过程了,如果不会请参考之前的文章 Android文件下载进度条的实现,这里只讨论下载完后执行安装的操作。 首先,安装程序需要特殊权限。打开AndroidMenifest.xml,在后、之前加上后面的代码: ,这样你的APP就有安装软件权限了。 接下是安装的关键代码,下载完后执行:

        Uri uri = Uri.fromFile(new File("/sdcard/temp.apk")); //这里是APK路径
        Intent intent = new Intent(Intent.ACTION_VIEW);
        intent.setDataAndType(uri,"application/vnd.android.package-archive");
        startActivity(intent);

下面是获取缓存目录方法:

File cacheDir = getCacheDir();//文件所在目录为getFilesDir();
String cachePath=cacheDir.getPath();

获取的目录默认没有最后的”/“,需要自己加上

今天醒来,习惯性地在市场搜索自己的软件,查看下载量,结果却搜索不到,马上登录开发者网站,竟然提示我付那25$,第一反应就是,帐号被封了。马上登录邮箱,果然,邮箱里有封信,英文的,大概意思是我违反了规定,封帐号。悲剧啊,想来想去,唯一可能的就是昨天在壁纸软件里加了几张内衣模特,难道就是这几张图片导致Google封我帐号?这个不算色情吧?唉,现在淘宝上开发者帐号都涨到300块了…

为了推广其他软件,可以使用这个功能,当用户点击“更多软件”时,自动打开market,并搜索指定作者或指定名字的软件。 首先在AndroidManifest.xml加入以下代码:

<intent-filter>    
    <action android:name="android.intent.action.VIEW" />    
    <category android:name="android.intent.category.DEFAULT" />    
    <data android:scheme="market" android:host="search" />    
</intent-filter> 

在程序执行的地方加上下面一句:

startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse("market://search?q=pub:Droidwork2010"))); 

这里是搜索发布者Droidwork2010的全部软件

WebView是个好东西,作用相当于一个迷你的浏览器,采用Webkit内核,因此完美支持html,javascript,css等。有时候,我们完全可以把UI甚至数据处理都交给WebView,配合PHP等服务端程序,这样Android开发就变成了网页开发,可以省很多精力。 下面是一个WebView的简单例子,如果用把所有功能都交给服务端脚本处理,这个程序已经很完整了,你只要写好网页,把URL填上,再编译,就是一个新软件。 程序功能介绍:打开网页同时显示一个ProgressDialog,网页载入完毕则隐藏,点击页面上链接时再次显示ProgressDialog,载入完隐藏,可用返回键返回上一页。 XML布局:

<?xml version="1.0" encoding="UTF-8"?>
<AbsoluteLayout android:orientation="vertical" android:id="@+id/tab1" android:layout_width="fill_parent" android:layout_height="fill_parent"
  xmlns:android="http://schemas.android.com/apk/res/android">
    <WebView android:id="@+id/wv"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:layout_x="0.0dip"
        android:layout_y="0.0dip"
        android:layout_weight="1.0" />
</AbsoluteLayout>

JAVA代码:

package com.pocketdigi.webview;

import android.app.Activity;
import android.app.AlertDialog;
import android.app.ProgressDialog;
import android.content.DialogInterface;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.KeyEvent;
import android.webkit.WebChromeClient;
import android.webkit.WebView;
import android.webkit.WebViewClient;

public class main extends Activity {
    /** Called when the activity is first created. */
    WebView wv;
    ProgressDialog pd;
    Handler handler;
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        init();//执行初始化函数
        loadurl(wv,"http://www.pocketdigi.com");
        handler=new Handler(){
            public void handleMessage(Message msg)
            {//定义一个Handler,用于处理下载线程与UI间通讯
              if (!Thread.currentThread().isInterrupted())
              {
                switch (msg.what)
                {
                case 0:
                	pd.show();//显示进度对话框        	
                	break;
                case 1:
                	pd.hide();//隐藏进度对话框,不可使用dismiss()、cancel(),否则再次调用show()时,显示的对话框小圆圈不会动。
                	break;
                }
              }
              super.handleMessage(msg);
            }
        };
    }
    public void init(){//初始化
        wv=(WebView)findViewById(R.id.wv);
        wv.getSettings().setJavaScriptEnabled(true);//可用JS
        wv.setScrollBarStyle(0);//滚动条风格,为0就是不给滚动条留空间,滚动条覆盖在网页上
        wv.setWebViewClient(new WebViewClient(){   
            public boolean shouldOverrideUrlLoading(final WebView view, final String url) {
                loadurl(view,url);//载入网页
                return true;   
            }//重写点击动作,用webview载入

        });
        wv.setWebChromeClient(new WebChromeClient(){
            public void onProgressChanged(WebView view,int progress){//载入进度改变而触发 
                 if(progress==100){
                    handler.sendEmptyMessage(1);//如果全部载入,隐藏进度对话框
                }   
                super.onProgressChanged(view, progress);   
            }   
        });

        pd=new ProgressDialog(main.this);
        pd.setProgressStyle(ProgressDialog.STYLE_SPINNER);
        pd.setMessage("数据载入中,请稍候!");
    }
    public boolean onKeyDown(int keyCode, KeyEvent event) {//捕捉返回键
        if ((keyCode == KeyEvent.KEYCODE_BACK) && wv.canGoBack()) {   
            wv.goBack();   
            return true;   
        }else if(keyCode == KeyEvent.KEYCODE_BACK){
            ConfirmExit();//按了返回键,但已经不能返回,则执行退出确认
            return true; 
        }   
        return super.onKeyDown(keyCode, event);   
    }
    public void ConfirmExit(){//退出确认
        AlertDialog.Builder ad=new AlertDialog.Builder(main.this);
        ad.setTitle("退出");
        ad.setMessage("是否退出软件?");
        ad.setPositiveButton("是", new DialogInterface.OnClickListener() {//退出按钮
            @Override
            public void onClick(DialogInterface dialog, int i) {
                // TODO Auto-generated method stub
                main.this.finish();//关闭activity
 
            }
        });
        ad.setNegativeButton("否",new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int i) {
                //不退出不用执行任何操作
            }
        });
        ad.show();//显示对话框
    }
    public void loadurl(final WebView view,final String url){
        new Thread(){
            public void run(){
                handler.sendEmptyMessage(0);
                view.loadUrl(url);//载入网页
            }
        }.start();
    }
    
    
}

因为插了一条4G内在存,为了能充分利用资源,装上了64bit的win7。在64位win7和64位JDK环境下,普通的32位eclipse是不能正常运行的,必须装64位版的eclipse,但是官方网站没有3.5版的windows 64位版本,Linux的倒是有,最新版的3.6也有64位版,但是因为前几天用32位版的时候发现代码提示会卡,所是还是选择3.5版。找了很久,总算找到一个链接,是Eclipse官方网站的,在这里跟大家分享。http://www.eclipse.org/downloads/download.php?file=/eclipse/downloads/drops/R-3.5.1-200909170800/eclipse-SDK-3.5.1-win32-x86_64.zip,如果不能下载,就用迅雷,这软件会自己找资源。下载下来是英文版,汉化包与32位版通用,如果需要,请搜索本站。