Android开发遇到的细节问题(一)

来源:互联网 发布:vb command透明 编辑:程序博客网 时间:2024/05/22 15:01


1 为什么按钮XML绑定的点击事件出错,或者无效?

例如:

<?xml version="1.0" encoding="utf-8"?><Button xmlns:android="http://schemas.android.com/apk/res/android"    android:id="@+id/button_send"    android:layout_width="wrap_content"    android:layout_height="wrap_content"    android:text="@string/button_send"    android:onClick="sendMessage" />

绑定了一个名为 sendMessage的方法.

/** Called when the user touches the button */public void sendMessage(View view) {    // Do something in response to button click}

请仔细看以上代码,有三个地方需要注意:

public void sendMessage(View view)

1 公有的

2 返回值为void

3 唯一的参数为View


2 开发widget 时,遭遇警告:Unable to launch app ...

Unable to launch app abc/10036 for broadcast Intent { act=android.appwidget.action.APPWIDGET_ENABLED cmp=ABC/.ClockWidget }: process is bad

查阅了相关资料,其中一种解决方法是:

我遵循了开发向导并在manifest中写下了如下属性,android:label="@string/app_name" ...

但是,要解决上面的那个问题的话,你需要

  1. Uninstall your app 卸载你的程序
  2. Reboot phone/emulator  重启你的电话/仿真器
  3. Push new app without this attribute 去掉这个属性,然后重新安装

是的,这样就好了,很神奇。


3 无法启动邮件软件& 启动邮件后接收者丢失

在网上面,有人告诉你启动邮件是通过 Intent.ACTION_SEND 来进行的

例如:

Intent intent = new Intent();intent.setAction(Intent.ACTION_SEND);intent.putExtra(Intent.EXTRA_EMAIL, new String[]{emailAddress});intent.putExtra(Intent.EXTRA_SUBJECT, title);intent.putExtra(Intent.EXTRA_TEXT, email_content);

但如果要正确的打开,应该加上一行:

intent.setType("plain/text");

或者

intent.setType("text/plain");

其中,第一种只会打开电邮,而第二会打开各种程序(包括浏览器,微博,微信,短信,WIFI等等)


此外,要注意邮件地址可能存在多个,所以应该是字符串数组,即 String[]


4 代码移植可能存在的问题

(1)Activity 可能未正确设置:

比如从一个工程中拿出一小块来成立一个单独的项目,或者将一个单独的项目整合到工程中,下面这几行需要增加或者删除。

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

有些Activity为了防止被外部调用,增加了exported属性,如果成为了单独的程序,而它又是启动界面时,需要允许外部调用,即设为true。

<activity    ...    android:exported="false"    ...></activity>

(2)自定义View未更新

请检查XML布局文件,确保你的布局文件进行了更新。


(3)遗漏某些权限

移植时,一定要确保权限也随之移动过去,否则相应的代码得不到执行,会导致奇怪的错误。


5 Dialog错误: ExceptionMethod:setView ;

Unable to add window -- token null is not for an aplication
正如我们所知道的,Activity是Context的子类,很多时候传递Content总是使用 ThisActivity.this传递到需要使用Context作为参数的方法中去。
但其实更推荐使用 getAplicationContext,这样可以避免开启的Activity因为持有某些未被释放的资源而不可以被清除。
但是,在Dialog中,却推荐使用Activity,这是因为Dialog是依附于对应的Activity的,传递应用程序的Context将导致错误。

6 相机报错
java.lang.RuntimeException: Method called after release()

原因:
camera.stopPreview();
camera.release();前
沒有将setPreviewCallback 设置为null,

解決办法:

public void surfaceDestroyed(SurfaceHolder holder) {
     camera.setPreviewCallback(null) ;
     camera.stopPreview();
     camera.release();
     camera = null;
}

*此外,可能需要对camera.release();camera = null;两句做synchronized。


7.UnsatisfiedLinkError 

NDK开发程序过程中,请勿随意更改包名,否则会导致无法使用


8. [  .9.PNG出现问题

.9.PNG 点区域请使用2px及以上,使用1px的拉伸可能会出现问题

这个问题的根本原因是.9黑色拉伸指示区域(也就是四周的黑线)也会根据屏幕的dpi做缩放,

这就导致放在XHDPI下的只点一个点的.9.png可能在缩放到MDPI下时可能丢失信息


9. 动画Animation在4.x系统上没问题,但是在2.x系统上面就无法播放

可能是因为你的View不可见导致的问题

在2.x系统上,对于不可见的物体,是无法使用View动画的


10. android.content.res.Resources$NotFoundException

可能的原因:出现同名指定错误。

例如你有一个abc.xml的layout文件,然后里面的它包含一个View的id="@+id/abc"

然后你在代码中使用了R.id.abc 而不是R.layout.abc 就可能导致这个问题。



11. 2.x系统上面TextView没有Press效果, ImageView没有Press效果

这是因为这些View不是Button,某些系统认为其不具有获取点击事件的能力。


所以你需要

(1)设置Clickable

在Xml中  android:clickable="true"

在Java代码中 view.setClickable(true);


(2)将事件派发给父容器*  (这一步是可选的,如果你为父容器绑定了Onclicklistener)

OnClickListener listener = new OnClickListener() {


            @Override
            public void onClick(View v) {
                MyParentView.this.performClick();
            }
        };

childView.setOnclickListener(listener);



12 View.setText(Html.fromHtml(getString(...))) 获取字符串无多个空格

考虑方法一:

不使用getString(...) ,而是使用getResources().getText(id)

因为getText会保留其中的格式。

缺点是:不可以带参数。


考虑方法二:

在其中加入 &#160;  这是一个与   不同的空格字符,它不会被String.trim()方法给干掉,这就使得即使你通过getString(...)也能获得正确的格式。



13 低版本的安卓系统上 margin无效的问题

参考资料:http://blog.csdn.net/fengye810130/article/details/9147695

在要设置Margin的View中加入android:layout_gravity="top|left",则Margin失效问题可以顺利解决

但是,如果你不是marginTop 和marginLeft的话,请不要使用上面这种方式,而是直接在FrameLayout上面设置margin.




14 A fatal error has been detected by the Java Runtime Environment

这个是因为android 编译生成资源文件class出错造成的问题

检查并修复你的资源文件中的错误,然后点选clean,让其重新编译生成R.class



15 intentservice无法启动问题:Unable to instantiate service 的解决办法

由于通常采用的Intent 中带有的参数是MyService.class 所以它通过反射方式启动。

这就要求我们为其提供一个无参数构造方法。


16 Android布局文件中无法自动完成

   *2个原因

1>打开的编辑器不对,导致了无法自动完成android layout Editor

解决方法:在Eclipse选择特定的文件,右键,open with -> Android Common XML Editor (也有的版本是Android Layout Editor)


2>添加了自定义的布局

这就意味者你创建了新的scheme,它是这样的东西:

xmlns:app="http://schemas.android.com/apk/res/com.abc.xyz"

将该行删除,将相关控件注释起来,然后正确编译

然后再恢复,就可以用自动完成功能了。

0 0
原创粉丝点击