显示标签为“Android”的博文。显示所有博文
显示标签为“Android”的博文。显示所有博文

2012年10月23日星期二

Android中正确使用自定义style及Theme

【零】
如果你仅仅是对默认的主题进行很少的修改,可以查看Android本身提供的一些主题模式,比如将背景变成透明,可以在AndroidManifest.xml中你想改的activity的tag中加入:
android:theme="@android:style/Theme.Translucent"
然后直接运行就可以了。可以参考官方说明

【一】
如果需要将一个Activity的主题改成自定义形式:

1.先在AndroidManifest.xml中你想改的activity的tag中加入:
android:theme="@style/MyTheme"
如果需要将该主题模式运用于所有Activity,可以在AndroidManifest.xml中写上这样一句:
<activity android:theme="@style/MyTheme">

2.然后在res/values文件夹下创建一个styles.xml的文件,在文件中写入:
<?xml version="1.0" encoding="utf-8"?>
<resources>
    <style name="MyTheme" parent="android:Theme.Light" >
          <!--需要定义的内容-->
    </style>
</resources>

3.需要定义的内容一般以item形式定义,例如:
<item name="android:textColor">#00FF00</item>
这样可以应用自定义的主题模式了。

【二】
需要注意的还有Android版本问题,如果开发的应用面向Android3.0以下的用户,那么最好采取以下步骤:

1.在res文件夹下创建values-v11(面向Android 3.0+)和values-v14(面向Android 4.0+两个文件夹。

2.在这两个文件夹中分别写入
<?xml version="1.0" encoding="utf-8"?>
<resources>
    <style name="MyTheme" parent="android:Theme.Holo.Light" >
          <!--需要定义的内容-->
    </style>
</resources>

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <style name="MyTheme" parent="android:Theme.DeviceDefault.Light" >
          <!--需要定义的内容-->
    </style>
</resources>
以上Holo是对于Android 3.0+的,DeviceDefault是对于Android 4.0+的。

或者其他你需要引用的parent,比如
    <style name="MyTheme" parent="android:Theme.Holo.Light.NoActionBar" >
          <!--需要定义的内容-->

【三】
最后一个问题是在自定义的主题中定义不同插件的模式,这里以Tab插件为例,我们可以用这样的形式
<?xml version="1.0" encoding="utf-8"?>
<resources>
    <style name="MyTheme" parent="android:Theme.Holo.Light.NoActionBar" >
          <item name="android:tabWidgetStyle">@style/LightTabWidget</item>
    </style>
    <style name="LightTabWidget" parent="@android:style/Widget.TabWidget">
       <!-- 需要定义的内容 -->
    </style>
</resources>
来单独定义插件的一些属性。

这里可以参考themes_device_defaults.xml的源码。

使用Android新版theme改变插件的主题

写好一个Project之后发现它的Spinner,TimePicker之类的Widgets不知何时都变成了旧版的主题。这个问题看似非常之弱却毫无解决的头绪。于是从头写过,一步一步Run,终于发现问题根源。

原因原来是在res/AndroidManifest.xml中误加入一条:
android:theme="@android:style/Theme.NoTitleBar" 

须知这是一条旧版Android的主题的命令,同一个Activity中的所有插件自然就统统变成了旧版的形式。

要用新版(API Level 13 up)的主题来起到上述命令去掉TitleBar的作用,可以使用如下语句:
android:theme="@android:style/Theme.Holo.Light.NoActionBar"
或者
android:theme="@android:style/Theme.Holo.Light.NoActionBar.Fullscreen"
官方说明见此处

以后要注意碰到类似主题形式变化的问题,检查一下AndroidManifest.xml这个文件哦。

2012年10月18日星期四

解决错误:/gen already exists but is not a source folder. Convert to a source folder or rename it.

这个错误一般是由对函数库的改动或是路径的重置引起的,显示为
/myProject/gen already exists but is not a source folder. Convert to a source folder or rename it.

解决这个错误的方法如下:

1.右键点击Package Exploreer下的myProject,选择Properties.

2.选择Java Build Path,再选择Source.

3.点击右边的Add Folder, 选中gen文件夹,点击OK,之后Yes.

4.在Properties的主面板中点击OK确定。

5.右键点击Package Exploreer下的myProject,选择Android Tools, 点击Fix Project Properties .

这样我们就把gen文件夹转变为一个source folder了。

现在我们再Project->Clean,就发现错误已经不再出现了。

值得注意的是,如果这个错误是由路径的重置引起的,那么一定要按照上述方法再将src文件夹转变为一个真正的source folder(出现一个方块形package标志)。

2012年10月15日星期一

发布Android应用时如何给apk自行签署金钥


发布Android应用时,它会提醒你提交自行签署金钥版的apk压缩包。因为之前一直Eclipse中调试模式下用的unbug版的签署,现在要换成自己签署了。在Linux下自行签署金钥步骤如下:

1.在装Java JDK时会同时装keytool,这个东东一般装在/usr/bin下。现在我们要调用它,先打开cd /usr/bin,同时为了让我们有调用权限,之后的步骤需要在root下操作su.

2.调用keytook来建立一个私人密钥,不同参数的含义请参见说明。这里要注意的是,因为上传到android市场时它会提示你有效密钥应超过50年,所以我用了20000天,不知道用少了是否有影响。建立密钥命令如下:
keytool -genkey -v -keystore my-release-key.keystore -alias alias_name -keyalg RSA -keysize 2048 -validity 20000
这时候命令行中会出现如下问题,依次回答:
输入keystore密码:  
再次输入新密码: 
您的名字与姓氏是什么?
  [Unknown]:  XXXX
您的组织单位名称是什么?
  [Unknown]:  XX
您的组织名称是什么?
  [Unknown]:  XX
您所在的城市或区域名称是什么?
  [Unknown]:  HK
您所在的州或省份名称是什么?
  [Unknown]:  HK
该单位的两字母国家代码是什么
  [Unknown]:  HK
CN=XXXX, OU=XX, O=XX, L=HK, ST=HK, C=HK 正确吗?
  [否]:  y

正在为以下对象生成 2,048 位 RSA 密钥对和自签名证书 (SHA1withRSA)(有效期为 20,000 天):
CN=XXXX, OU=XX, O=XX, L=HK, ST=HK, C=HK
输入<alias_name>的主密码
(如果和 keystore 密码相同,按回车):  
再次输入新密码: 
[正在存储 my-release-key.keystore]
这样,就私人密钥就创建成功了。

3.在发布模式下编译应用。在Eclipse里Package Explorer下右键单击你所要加密的项目,选择Android Tool,再选择Export Unsigned Application Package,将这个apk在某一路径下保存,默认保存在Eclipse文件夹下。


4.其实放在那里没什么用,我们需要把这个apk转移到建立私人密钥的地方
mv /home/xxxx/eclipse/myActivity.apk /usr/bin
其中myActivity是你刚刚编译的应用的名字。


5.好了,现在可以用自己的私人密钥给自己开发的应用签署了,命令是
jarsigner -verbose -sigalg MD5withRSA -digestalg SHA1 -keystore my-release-key.keystore myActivity.apk alias_name
相关参数可以参考说明
这时候命令行中会出现如下问题,依次回答:
输入密钥库的口令短语: 
输入 alias_name 的密钥口令:
答对之后出现:
   正在添加: META-INF/MANIFEST.MF
   正在添加: META-INF/ALIAS_NA.SF
   正在添加: META-INF/ALIAS_NA.RSA
  .
  .
  .
后面还有一大长串就不详细列出了

6.最后,我们要确定加密完成。
jarsigner -verify -verbose myActivity.apk 
会显示你加密的package的具体信息,最后面是说明:
 s = 已验证签名 
  m = 在清单中列出条目
  k = 在密钥库中至少找到了一个证书
  i = 在身份作用域内至少找到了一个证书

jar 已验证。

7.现在就可以在Android市场上发布你的应用了,要注意的是:
apk 套件名稱不能以下列值為開頭:[com.android, com.google, android, com.example]

8.为了优化你将要发布的应用,可以使用zipalign工具,这个工具在android-sdks->tools文件夹下,是一个.exe文件。用它来进行优化,需要使用命令

./zipalign -v 4 myActivity.apk zimyActivity.apk
其中myActivity.apk是zipalign之前的压缩档案,zimyActivity.apk是优化之后输出的压缩档案。如果希望直接覆盖原档案,则可以用
./zipalign -f -v 4 myActivity.apk
最后出现
Verification successful
就OK了。

2012年10月14日星期日

解决error: Found text " " where item tag is expected

这是一个Android开发中.xml文件里一个奇怪的编译错误,具体报错如下:
[2012-10-15 13:38:07 - com.example.xxx.MainActivity] /home/xxx/workspace/com.example.xxx.MainActivity/res/values-zh-rTW/strings.xml:12: error: Found text "
[2012-10-15 13:38:07 - com.example.xxx.MainActivity]     " where item tag is expected

其实这是空格的格式不正确造成的。如果是原始的手工编辑文档,是不会出现这个问题的。但是如果在不同的文档格式中复制粘帖,就会导致上述错误。

所以为了解决这个问题,建议:

1.检查是否存在不必要的空格,如有即删。如果不行,那么2;

2.重新进行复制粘帖,尽量不要使用不同的文档格式。如果不行,那么3;

3.Replace所有xml文档中whitespace with你手工敲出的space. 如果不行,那么4;

4.自己手工重新编辑一遍。

这类错误可以试试用MS word or excel调用一下文档,看是否空格格式错误。

补充说明一下:类似的错误(xml文档中空格格式错误)还会gen文件夹中R.java出现
Syntax error on tokens, delete these  tokens
的报错。同样通过以上的方法可以解决这个错误。

2012年7月14日星期六

Draw 9-patch的用法——入门级教学

Draw 9-patch是一个在android开发中非常好用的图像处理工具,它的想法很简单,将一张图片用四条线分成九个格子,就可以简单地控制它的大小和覆盖内容的位置。

这里有个android官方版的教程,写得简单明了,不过有些细节不够清楚。所以这里我把我的使用方法记下来。

1.在文件夹中打开android-sdks -> tools,找到文件夹中的一个叫做draw9patch的shell脚本文件,点击运行它。

2.你会发现这个程序的界面实在太简单了,所有的菜单里面的选项只有:打开一个9patch类型的图像,保存一个9patch类型的图像,退出。那么,要创建新的图像,你只能把你待处理的图片拖曳到这个程序的窗口里去。

3.为了方便操作,把下面的三个选项里“是否显示xxx”都给勾上,调整zoom到一个合适的视角。结果如下:

4.下面开始画线。在你拖进去的图片的边缘处,你会发现一些灰白相间的小格子,这就是画线的地方,鼠标单击就可以画黑线了。注意,这时候最好放大很多倍,可以看得比较清楚,细节如下:

5.按照步骤4在四周分别画上四条黑线,这样就把图片分成九份了。就是下图这个样子:


6.点击File -> Save 9-patch,然后就可以把这个图像保存成名为aaa.9.png的格式了。

7.将这个图像放在你的App project的res -> drawable的文件夹里,注意,在xml的文件中引用这个图像时id应为drawable/aaa,而不是aaa.9,所以,drawable文件夹里也不可以同时放aaa.9.png 和 aaa.png!

8.完成上述步骤后,你就可以把这个图像设为某个模块的背景,这个模块的内容就会显示在九部份中正中的那一个部分中了(如上图灰色部分)~

有趣得很吧~

2012年5月23日星期三

如何让你开发的Android应用在手机上运行(适用Ubuntu)

开发了一个应用后,总要想在自己的手机上跑跑的,下面就说说怎么在实机上运行开发好的应用:

1.确认你手机的Android版本不低于你开发的平台所用的Android版本。如果没达到,就升级吧,官方的没有,小心刷机啊。

2.在你的手机里选择“设置->应用程序->开发”,把开发里的两个选项“USB调试”和“允许模拟地点”打上勾勾。

3.通过USB接口将手机连在电脑上。

4.确认已经连上后,在终端里敲入如下命令:
    sudo gedit /etc/udev/rules.d/51-android.rules
来创建一个51-android.rules文件,在这里我是用gedit文档的。

5.在这个空的51-android.rules文件添加
   SUBSYSTEM=="usb", ATTR{idVendor}=="04e8", MODE="0666", GROUP="plugdev" 
这样一句,保存。注意Vendor ID 注意对于不同品牌的手机是不一样的,见本文结尾处表。

6.在终端里敲入如下命令:
   sudo chmod a+r /etc/udev/rules.d/51-android.rules
来运行这个文件。

7.运行/android-sdks/platform-tools中的可执行文件adb,查看以确认你的设备已连接并可用。

8.在Eclipse中选择你所要运行的Package,点击运行,(如果之前已经在虚拟机上运行过,如果没有需要选择Android Application)跳出一个框框,选择Choosing a running Android device中你的手机,点击OK。完成。


CompanyUSB Vendor ID
Acer0502
ASUS0b05
Dell413c
Foxconn0489
Fujitsu04c5
Fujitsu Toshiba04c5
Garmin-Asus091e
Google18d1
Hisense109b
HTC0bb4
Huawei12d1
K-Touch24e3
KT Tech2116
Kyocera0482
Lenovo17ef
LG1004
Motorola22b8
NEC0409
Nook2080
Nvidia0955
OTGV2257
Pantech10a9
Pegatron1d4d
Philips0471
PMC-Sierra04da
Qualcomm05c6
SK Telesys1f53
Samsung04e8
Sharp04dd
Sony054c
Sony Ericsson0fce
Teleepoch2340
Toshiba0930
ZTE19d2
 

2012年5月17日星期四

解决WARNING: Application does not specify an API level requirement!

这是个不太能注意到又很常见的问题:

WARNING: Application does not specify an API level requirement!
Device API version is xx  (Android x.x)

解决方法:

在AndroidManifest.xml中

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.android.xxx">

下方加入一行:

<uses-sdk android:minSdkVersion="xx"/>

其中xx是API version的版本号,在上述WARNING的第二行的下划线处。

2012年5月8日星期二

出现xxx cannot be resolved or is not a field问题的解决方案

这样的问题一般会在你的方法中引用resource中的场参数时出现,比如:

对于R.array有:array cannot be resolved or is not a field.
对于R.main有:main cannot be resolved or is not a field.
对于R.id有:id array cannot be resolved or is not a field.

要解决这个问题,首先看一下你的res文件夹中有没有这个场的定义,一般res中默认只有layout.main.xml, drawable.xxx和value.string.xml,需要自己添加一些你需要的xml文件。注意:一定要添加在恰当的位置比如说array.xml就应该在value这个文件夹下。

如果确认有,再检查一下res下面所有文件是否都无报错。如果res下某一个文件报错,比如main或者AndroidManifest,也会影响其他场不能正确被引用。

如果都没有错误,再检查一下在你的主程序中是否不小心引入了android.R如下:
import android.R
如果有,请删除。

如果还不行,可以尝试一下:Project ==> Clean ==> Check your project and press OK.

再不行的话,我也就没辙了。


2012年5月4日星期五

怎样解决Android类中TabActivity已经deprecated的问题

在Android官网中有一个做Tab的sample,使用了TabActivity这个类。但在实际操作过程中,你会发现这个类现在已经被官方弃用了,程序中会有如下提示:

This class is deprecated.
New applications should use Fragments instead of this class; to continue to run on older devices, you can use the v4 support library which provides a version of the Fragment API that is compatible down to DONUT.

再按照官网给出的代码运行这个本该含有几个Tab的项目时,几个Activity变成了几个独立的应用,而不是在一个应用的几个Tab里。

问题看上去是出在这个TabActivity上。(花了两天才发现不是这个问题,是在Android Manifest.xml中在每一个Activity中都加入了<intent-filter/>,修改了后只在主Activity中加这个tag就好了。)

  • 于是先按照程序中的提示加入@SuppressWarnings("deprecation"),以便漠视Warning。再运行——当然是没效果。       
                                                                                                     
  • 接着打算按照上面的建议,用Fragment来代替TabActivity,那就得先装上这个最近才更新的包android-support-v4.jar,步骤如下
     1.在Eclipse中选Windows->Android SDK Manager,选择Repository,找到最下面的Android    Support,点击安装这个package。
         2.装完之后,在你的project里面建立一个叫libs的文件夹,路径为XXXXX/libs,和src、res等文件夹并列的。
         3.在android-sdks/extras/android/support/v4中找到android-support-v4.jar,复制到步骤2中的libs里面去。
         4.在Eclipse的Package Explorer中找到XXXXX/libs/android-support-v4.jar,按右键点击Build path->Add to Build Path.

        好了,现在就可以用这个更新的包里面的东东了,比如我们需要的Fragment这个类。然后我们要来看看FragmentTab.java是怎么用的。

  • 除了这种方法呢,还可以直接让原本继承TabActivity的类来继承爷爷Activity,具体怎么做在下面两个帖子里有介绍:
           http://stackoverflow.com/questions/3163884/android-tabhost-without-tabactivity
           http://wazai.net/2109

2012年5月3日星期四

怎样在Android的项目中加入新的Activity Class

在开发Android的应用时,往往需要建立多个窗口,对于每个不同的界面,使用不同的Activity class会更加方便。如何在已经创造的项目中加入新的Activity Class呢?

有两种方法:第一种是用Manifest Editor,这里暂且不提;第二种是在Eclipse里创建,非常简单:

在Eclipse菜单栏里点击File->New->Class,出来一个框框,在Source Folder里选择你准备把这个class放的位置,一般是XXXX/src,package就是之前创建Project里面的package啦,比如com.example.helloworld, Name就是你要建的这个Activity,比如AlbumsActivity,然后点Finish。

接下来,就会在Eclipse的Package Explorer里找到你新建的这个Activity,打开这个java的文件写入代码。

最后,在AndroidManifest.xml里面加入新建的Activity如下:

        <activity
            android:name=".AlbumsActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

OK.

2012年4月24日星期二

如何在Ubuntu下安装Android SDK开发Android Apps

小小折腾了一会儿,装了开发谷歌应用程式的工具。

其实网上也有很多介绍这方面的,不过很多都是旧版本的不适用,又或是Windows或者Mac的和Ubuntu还有一些小区别。

这里就记录下在Ubuntu下是怎么装的:

1.装Java JDK。这个是必须的,谷歌的应用是用Java写的,不用我多说了。

2.下载Android SDK Tools, 解压不用装。下载Android SDK Tools

3.装Eclipse或者NetBeans,都是很常用的开发环境,这里以Eclipse为例介绍。下载Eclipse

4.打开Eclipse。在菜单栏里Help->Install New Software。出来一个框框,按Add,又出来一个框框,填Name:Android; URL:http://dl-ssl.google.com/android/eclipse/ ,按OK。出来一个Developer Tools, 打开,有四个选项,给头两个划勾勾,然后Next,一直下去到装好,装好后会重启Eclipse。

5.在terminal里面运行之前解压的android-sdk-linux文件夹中的Tools文件夹中的android文件。即输入命令cd XXXXX/android-sdk-linux/Tools 然后./android 。出来一个框框,这个就是Android SDK Manager了。选中最新一个版本下面的所有文件(我开始没有装ARM XXX,最后无法创建AVD,错误:Unable to find a 'userdata.imgfile for ABI armeabi to copy into the AVD folder),点Install X pac 。装这么多package需要消耗大量时间,请耐心等待。注:这一步也可以在Eclipse中的Windows->Android SDK Manager中完成。

6.装完之后打开Eclipse,在菜单栏里Windows->AVD Manager。出来一个框框,按New, 又出来一个框框,Name随便填,target是你新装的这个platform,Size可以随便填,比如10什么的。点Creat New AVD,然后你的AVD就出现在list里面了,再选中这个新创建的AVD点start,size可以自由选择,就可以看见一个虚拟的android出现在你电脑上了。(我在虚拟设配的过程中出现了种种问题,tools文件夹下的很多执行文件都不能用,比如出现错误:Failed to create the SD card,这都是Ubuntu位数不符配造成的,后来装了一个ia32-libs的包就好了,命令:sudo apt-get install ia32-libs)。

7.下一步就是写一个Android的Project。在Eclipse的菜单栏里File->New->Project,出来一个框框,选Android->Android Project,点下一步,接下来要填的是:Project Name: HelloAndroid ; Target: 选你装的那个 ;Application Name: Hello, Android ; Package Name: 可以填你自己的,也可以填比如com.example.helloandroid ; Activity : 默认的。最后点Finish。

8.这个时候你的Eclipse主界面中Package Explorer栏里出现了你刚建的Project,点这个,然后是src->com.example.helloandroid(就是刚刚建的包),出现了一个java程序,打开它,将默认的代码改成:

package com.example.hellowandroid;

import android.app.Activity;
import android.os.Bundle;
import android.widget.TextView;

public class HelloandroidActivity extends Activity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        TextView tv = new TextView(this);
        tv.setText("Anything you would like to add");
        setContentView(tv);
    }
}

9.在Eclipse的菜单栏里Run->Run, 大功告成~