Android常见问题

1.问题描述:

Listview中adapter的刷新(notifyDataSetChanged())数据突然消失问题.

解决方法:

我们的adapter中的一个List<T>参数,而在调用adapter的一层(即adapter的上一层)对List<T>进行赋值操作,而不是t.add(T)或是t.remove(T)这样的操作时,我们在adapter.notifyDataSetChanged();的时候就会出现数据全部清空了。这是因为我们对传入adapter的参数进行了一个全体赋值,而List<T>参数中那些未被修改的数据也一样被重新修改(即使数据是一样的,可实际上对象已经发生了变化)。


2.问题描述:

Listview中adapter的刷新(notifyDataSetChanged())ListView还是没有任何变化问题.

解决方法:

这种情况一般出现在我们对List<T>的数据要进行一个批量的操作的时候。例如:

[java]  view plain  copy
 print ? 在CODE上查看代码片 派生到我的代码片
  1. for (int i = mPositions.size() - 1; i >= 0; i--) {  
  2.             mPackageInfos.remove((int)mPositions.get(i));  
  3.             mAdapter.notifyDataSetChanged();  
  4.         }  

大家可以看到我这边是从后往前进行remove的,这是为了防止先remove了前面的,整个List<T>向前推了一个单位,这样势必会出现错位。倒序删除是一种比较普遍的删除算法。

还有一件事情需要注意:t.remove(positicaion)这样的操作中的positication是int型的,不能是Integer这种类型的。


3.问题描述:

EditText获得焦点时,挤压屏幕问题.

当我们点击某一Activity中的EditText时,我们的某些控件会被挤压。如果你不是使用比例来控制布局,那么你的运气很好,可能是看不到控件被挤压。一般来说如果你的一些控件是用的百分比来控制,那么你的控件很有可能就会出现被挤压得很扁。

解决方法:

你的Manifest.xml文件可以这样来写:

[html]  view plain  copy
 print ? 在CODE上查看代码片 派生到我的代码片
  1. <activity android:name="com.xxxx.xxxActivity"  
  2.             android:windowSoftInputMode="adjustPan" />  


4.问题描述:

对Eclipse中使用4个空格来替换一个Tab键的设置方法.

解决方法:

第一步:

点击 window->preference,依次选择 General->Editors->Text Editors,选中右侧的 insert space for tabs。保存

第二步:

1. Window --> Java --> Code Style --> Formatter --> 选择右侧的Edit --> 

2. 输入自定义的Profile name

3. 在下方的Tab policy的右侧的下拉列表中选择Spaces only

4. 输入Indentation size和Tab size的大小均为4

5. 点击OK

6. 重启Eclipse


5.问题描述:

在控制台启动和关闭ADB服务.

解决方法:

开启:adb start-server

关闭:adb kill-server

一般来说,我们必须先在控制台输入关闭服务再输入开启服务。是为了避免之前内存中残留的adb服务干扰。


6.问题描述:

将两个一位或两位数显示成00:00格式.

解决方法:

[java]  view plain  copy
 print ? 在CODE上查看代码片 派生到我的代码片
  1. String.format("%02d", hour) + ":" + String.format("%02d", minute);  


7. 问题描述:

如何控制横竖屏切换

通过在AndroidManifest.xml中设置activity中的Android:screenOrientation属性值来实现.
android:screenOrientation属性,有以下参数可选:
"unspecified":默认值 由系统来判断显示方向.判定的策略是和设备相关的,所以不同的设备会有不同的显示方向.
"landscape":横屏显示
"portrait":竖屏显示
"user":用户当前首选的方向
"behind":和该Activity下面的那个Activity的方向一致(在Activity堆栈中的)
"sensor":由物理的感应器来决定。如果用户旋转设备这屏幕会横竖屏切换。
"nosensor":忽略物理感应器,这样就不会随着用户旋转设备而更改了("unspecified"设置除外).


示例 — AndroidManifest.xml中实现:

[html]  view plain  copy
 print ? 在CODE上查看代码片 派生到我的代码片
  1. android:screenOrientation="portrait"  
示例 — Java代码实现:
[html]  view plain  copy
 print ? 在CODE上查看代码片 派生到我的代码片
  1. setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);  


8.问题描述:

Java/Android中截取从a到b的子字符串

[java]  view plain  copy
 print ? 在CODE上查看代码片 派生到我的代码片
  1. String subString = str.substring(a, b);  


9.问题描述:

SQLite中多级ORDER BY的使用.

SELECT * FROM COMPANY ORDER BY NAME, SALARY ASC;


10.问题描述:

判断当前是否为Wi-Fi状态

解决方案:

[java]  view plain  copy
 print ? 在CODE上查看代码片 派生到我的代码片
  1. public static boolean isWifiNetwork(Context context) {  
  2.         boolean isWifi = false;  
  3.         Context getContext = context.getApplicationContext();    
  4.         ConnectivityManager connectivity = (ConnectivityManager) getContext  
  5.                 .getSystemService(Context.CONNECTIVITY_SERVICE);  
  6.         NetworkInfo[] info = null;  
  7.         if (connectivity != null) {  
  8.             info = connectivity.getAllNetworkInfo();  
  9.             if (info != null) {  
  10.                 for (int i = 0; i < info.length; i++) {  
  11.                     if (info[i].getTypeName().equals("WIFI") && info[i].isConnected()) {  
  12.                         isWifi = true;  
  13.                         break;  
  14.                     }  
  15.                 }  
  16.             }  
  17.         }  
  18.         getContext = null;  
  19.         connectivity = null;  
  20.         info = null;  
  21.           
  22.         return isWifi;  
  23.     }  

11.问题描述:

JNI开发时,Unresolved inclusion

我在.c和.h文件中使用#include <jni.h>时,出现了Unresolved inclusion: <jni.h>的报错信息。
解决方案:
原因是在eclipse编辑环境中没有找到对应的include中的文件。解决方法是将包含该文件的include目录作为新的linked folder加入工程中。具体方法如下:
1. 右击工程->New->Folder
2. 对话框中点击Advanced
3. 选择Link to alternate location (Linked Folder),选择需要的include目录
4. Finish后刷新工程,问题解决。


12.问题描述:

Android写文件,换行

注意,这里说的不是在TextView上显示的文本信息,而是在向文本文件中写数据时的换行。这里使用的是"\r\n",如下:

[java]  view plain  copy
 print ? 在CODE上查看代码片 派生到我的代码片
  1. String str = "ABC";    
  2. str += "\r\n";  

13.问题描述:

动态保持当前屏幕的横竖屏状态

    这里不同设置横竖的地方就在于保持的前提,前提是我们要知道当前屏幕是处于哪种状态。这种需求一般出现在我们在一个没有限制横竖屏的Activity中进行弹框。在弹框的过程中如果我们进行横竖屏切换,那问题就来了。你可以写一个小的Demo来观察一下横竖屏切换的时候,当前Activity的生命周期,那么答案就不言而喻了。所以我们要先捕获屏幕状态,再去设置当前屏幕的相应状态。关键代码如下:

[java]  view plain  copy
 print ? 在CODE上查看代码片 派生到我的代码片
  1. int screenState = MainActivity.this.getResources().getConfiguration().orientation;  
  2.                 if (screenState == Configuration.ORIENTATION_LANDSCAPE){  
  3.                     MainActivity.this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);  
  4.                 } else if (screenState ==Configuration.ORIENTATION_PORTRAIT) {  
  5.                     MainActivity.this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);  
  6.                 }  

14. 问题描述:

获得键盘高度

    当我们要去获知键盘是否被打开,有时不是直接去用一个方法获得键盘是否被打开。例如我们可以获得当前键盘的高度,如果超过一定值就认为被打开了。说到这里,可能你又会说,那如果键盘没有被打开那还怎么获得键盘的高度呢?这里就要再做一次迂回,计算键盘以上控件的高度。因为我们知道当键盘打开后,如果我们设置了当前Activity为挤压屏幕属性,键盘就会把Activity的根Layout进行挤压,高度会变小,不过屏幕的高度不会变。说到这儿,相信大家也都知道该怎么做了吧。下面时关键代码:

[java]  view plain  copy
 print ? 在CODE上查看代码片 派生到我的代码片
  1. /** 
  2.  * 用于获得键盘的高度 
  3.  */  
  4. rootView.getViewTreeObserver().addOnGlobalLayoutListener(  
  5.     new ViewTreeObserver.OnGlobalLayoutListener() {  
  6.       
  7.     @Override  
  8.     public void onGlobalLayout() {  
  9.                         
  10.         Rect r = new Rect();  
  11.         rootView.getWindowVisibleDisplayFrame(r);  
  12.   
  13.         int screenHeight = rootView.getRootView().getHeight();  
  14.         int KeyboardHeigth = screenHeight - (r.bottom - r.top);  
  15.     }  
  16. });  


15.问题描述:

获得平板序列号

如果要用一串唯一标识设备的字符串,在手机上相信大家首先想到的可能就是IMEI。不过对于一般的手机来说,这一点恐怕就很难实现了。因为一般来说,平板中不安装SIM卡,所以平板中是没有分配IMEI号码的。当然,也有一些平板中就有,华为就是。

解决方案:

[java]  view plain  copy
 print ? 在CODE上查看代码片 派生到我的代码片
  1. public static String getSerialNumber() {  
  2.     returnandroid.os.Build.SERIAL;  
  3. }  


16.问题描述:

替换图标后运行程序图标没有被替换

解决方案:

遇到这种情况一般来说就是你没有替换掉所有分辨率下的图标,这时只需要重新替换掉所有图标即可。不过今天我也遇到了替换图标失效的问题,我项目中所有分辨率下的图标均已替换,可是还是不行。原来是因为我们的手机会有一个缓存机制,它保存了我们原来的那个图标,不管你怎么替换肯定都是不行的。现在你要么是等,要么是换一台机器试试。


17.问题描述:

动态限制EditText最长输入的字符长度

解决方案:

[java]  view plain  copy
 print ? 在CODE上查看代码片 派生到我的代码片
  1. imgSizeEditText.setFilters(new InputFilter[]{new InputFilter.LengthFilter(3)});  


18.问题描述:

动态设置EditText光标位置

解决方案:

[java]  view plain  copy
 print ? 在CODE上查看代码片 派生到我的代码片
  1. imgNameEditText.setSelection(32); // 设置光标的位置  


19.问题描述 :

动态获得控件的宽和高

解决方案:

就拿RelativeLayout来说明一下吧

[java]  view plain  copy
 print ? 在CODE上查看代码片 派生到我的代码片
  1. RelativeLayout mShowLayout = (RelativeLayout) findViewById(R.id.main_relative_layout);  
  2. mShowLayout.measure(00);  
  3. Toast.makeText(this"w = " + mShowLayout.getMeasuredWidth() + ", h = " + mShowLayout.getMeasuredHeight(),  0).show();  


20.问题描述:

格式化日期,出现未被格式化的内容(如:1997-01-01 HH:12:00)

出现上述问题的原因可能是因为我们使用下面这样的语句来格式化我们的日期文本
textView.setText(DateFormat.format("yyyy-MM-dd HH:mm:ss", System.currentTimeMillis()).toString());
解决方案:
SimpleDateFormat sDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

textView.setText(sDateFormat.format(new Date(System.currentTimeMillis())));



1.问题描述:

以某一触发唤醒屏幕

解决方案:

[java]  view plain  copy
 print ? 在CODE上查看代码片 派生到我的代码片
  1. public static void wakeUpAndUnlock(Context context){  
  2.         KeyguardManager km= (KeyguardManager) context.getSystemService(Context.KEYGUARD_SERVICE);  
  3.         KeyguardManager.KeyguardLock kl = km.newKeyguardLock("unLock");  
  4.           
  5.         // 解锁  
  6.         kl.disableKeyguard();  
  7.           
  8.         // 获取电源管理器对象  
  9.         PowerManager pm=(PowerManager) context.getSystemService(Context.POWER_SERVICE);  
  10.           
  11.         // 获取PowerManager.WakeLock对象,后面的参数|表示同时传入两个值,最后的是LogCat里用的Tag  
  12.         PowerManager.WakeLock wl = pm.newWakeLock(PowerManager.ACQUIRE_CAUSES_WAKEUP | PowerManager.SCREEN_DIM_WAKE_LOCK, "bright");  
  13.           
  14.         // 点亮屏幕  
  15.         wl.acquire();  
  16.           
  17.         // 释放  
  18.         wl.release();  
  19.     }  
注:其中,解锁步骤可以省略。这种情况下,就只是点亮你的屏幕而不会解锁了。


2.问题描述:

除掉Actionbar最左侧的箭头

注意,这个最左侧的的箭头可不是actionbar的icon。如果你去设置它的icon,这样就会导致既有icon也有箭头。

解决方案:

[java]  view plain  copy
 print ? 在CODE上查看代码片 派生到我的代码片
  1. getActionBar().setHomeAsUpIndicator(drawable);  
上面的这种方法是适用于API18,而对于API小于18的代码则是不适用的。需要做更多的逻辑。 如下:

[java]  view plain  copy
 print ? 在CODE上查看代码片 派生到我的代码片
  1. public static void changeActionBarHomeUpDrawable(Activity activity, int rid) {  
  2.         Drawable homeUp = activity.getResources().getDrawable(rid);  
  3.         final View home = activity.findViewById(android.R.id.home);  
  4.         if (home == null) {  
  5.             // Action bar doesn't have a known configuration, an OEM messed with things.  
  6.             return;  
  7.         }  
  8.   
  9.         final ViewGroup parent = (ViewGroup) home.getParent();  
  10.         final int childCount = parent.getChildCount();  
  11.         if (childCount != 2) {  
  12.             // No idea which one will be the right one, an OEM messed with things.  
  13.             return;  
  14.         }  
  15.   
  16.         final View first = parent.getChildAt(0);  
  17.         final View second = parent.getChildAt(1);  
  18.         final View up = first.getId() == android.R.id.home ? second : first;  
  19.   
  20.         if (up instanceof ImageView) {  
  21.             ImageView upIndicatorView = (ImageView) up;  
  22.             upIndicatorView.setImageDrawable(homeUp);  
  23.         }  
  24.     }  


3.问题描述:

Android Private Libraries缺失

如果你的Android Private Libraries是你误删除的话,你可以通过下面的方法1恢复。如果你的项目无原无故的缺失了Android Private Libraries,那么你可以使用下面的方法2修复。

1. 在项目上点击右键,点击Android Tools -> Fix Project Properties 即可
2. android-support-v4重复,删除一个即可


4.问题描述:

Arrays.copyOfRange在低版本的Android中出现NoSuchMethodError异常

对于这个问题的解释,可能要归结于API版本之间的兼容性了。

解决方案:

我的解决方法就是直接重写了这个方法。非常简单粗暴的一个方法,而且很有效。下面是对于Array的一些常用方法的示例源码:

http://commons.apache.org/proper/commons-lang/apidocs/src-html/org/apache/commons/lang3/ArrayUtils.html


5.问题描述:

ListView与动态显示的底部操作栏

你是否遇到过这样的一个问题:你有一个始终位于屏幕底部的Layout,还有一个ListView,它是始终位于屏幕的顶部。当ListView的item过多时,下面的部分item就会被拦住,或是把底部的Layout拦住。

解决方案(一):

对于上面的问题,可能你已经尝试过,使用让Listview位于Layout上方,或是ListView同时位于屏幕顶部和Layout上方。可是尝试过后就会是沮丧的。下面我就分享一个我的技巧:在Layout的外部再套一层Layout,高度为wrap_content。如下:

[java]  view plain  copy
 print ? 在CODE上查看代码片 派生到我的代码片
  1. <pre name="code" class="html"><?xml version="1.0" encoding="utf-8"?>  
  2. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  3.     android:layout_width="match_parent"  
  4.     android:layout_height="match_parent" >  
  5.   
  6.     <ListView  
  7.         android:id="@+id/listView1"  
  8.         android:layout_width="match_parent"  
  9.         android:layout_height="wrap_content"  
  10.         android:layout_above="@+id/container_relativeLayout"  
  11.         android:layout_alignParentTop="true"  
  12.         android:layout_centerHorizontal="true" >  
  13.     </ListView>  
  14.   
  15.     <RelativeLayout  
  16.         android:id="@+id/container_relativeLayout"  
  17.         android:layout_width="wrap_content"  
  18.         android:layout_height="wrap_content"  
  19.         android:layout_alignParentBottom="true" >  
  20.   
  21.         <LinearLayout  
  22.             android:layout_width="match_parent"  
  23.             android:layout_height="wrap_content"  
  24.             android:gravity="center_horizontal" >  
  25.   
  26.             <TextView  
  27.                 android:id="@+id/textView1"  
  28.                 android:layout_width="wrap_content"  
  29.                 android:layout_height="wrap_content"  
  30.                 android:text="Bottom Layout" />  
  31.         </LinearLayout>  
  32.     </RelativeLayout>  
  33.   
  34. </RelativeLayout>  

 

注:可能你会觉得这样是多此一举。因为我可以把ListView的高度设置成match_parent或是fill_parent,再位于Layout之上。这种方式只是适合于,Layout不会被Gone的情况。这里是一个值得注意的地方。

解决方案(二):

可能你会觉得方案一太过繁琐了,那么你可以使用Relayout的另一个属性:layout_alignWithParentIfMissing

[html]  view plain  copy
 print ? 在CODE上查看代码片 派生到我的代码片
  1. android:layout_alignWithParentIfMissing="true"  


6.问题描述:

has leaked window com.android.internal.policy.impl.PhoneWindow$ that was originally added here

大致的意思是存在窗口句柄泄露,即未能及时销毁某个PhoneWindow。其实存在这么一种情况,即因我们在非主线程中的某些操作不当而产生了一个严重的异常,从而强制当前Activity被关闭。而在关闭的同时,却没能及时的调用dismiss来解除对ProgressDialog等的引用,从而系统抛出了标题中的错误,而掩盖了真正导致这个错误的异常信息。

解决方案:

重写Activity/Fragment的onDestroy方法,在方法中调用dismiss来解除对ProgressDialog等的引用。


7.问题描述:

Android判断是否能真正上网

普通方法不能判断外网的网络是否连接,比如连接上局域网

解决方案:

[java]  view plain  copy
 print ? 在CODE上查看代码片 派生到我的代码片
  1. public static final boolean ping() {  
  2.   
  3.         String result = null;  
  4.         try {  
  5.             String ip = "www.baidu.com"// ping 的地址,可以换成任何一种可靠的外网  
  6.             Process p = Runtime.getRuntime().exec("ping -c 3 -w 100 " + ip); // ping网址3次  
  7.               
  8.             // 读取ping的内容,可以不加  
  9.             InputStream input = p.getInputStream();  
  10.             BufferedReader in = new BufferedReader(new InputStreamReader(input));  
  11.             StringBuffer stringBuffer = new StringBuffer();  
  12.             String content = "";  
  13.             while ((content = in.readLine()) != null) {  
  14.                 stringBuffer.append(content);  
  15.             }  
  16.   
  17.             // ping的状态  
  18.             int status = p.waitFor();  
  19.             if (status == 0) {  
  20.                 result = "success";  
  21.                 return true;  
  22.             } else {  
  23.                 result = "failed";  
  24.             }  
  25.         } catch (IOException e) {  
  26.             result = "IOException";  
  27.         } catch (InterruptedException e) {  
  28.             result = "InterruptedException";  
  29.         } finally {  
  30.             Log.d("----result---""result = " + result);  
  31.         }  
  32.         return false;  
  33.     }  


8.问题描述:

获取手机号码

解决方案:

[java]  view plain  copy
 print ? 在CODE上查看代码片 派生到我的代码片
  1. private String getPhoneNumber() {  
  2.         TelephonyManager telephonyMgr = (TelephonyManager)getSystemService(Context.TELEPHONY_SERVICE);   
  3.         return telephonyMgr.getLine1Number();   
  4.     }  
添加权限:

[html]  view plain  copy
 print ? 在CODE上查看代码片 派生到我的代码片
  1. <uses-permission android:name="android.permission.READ_PHONE_STATE" />  


9.问题描述:

lost serialVersionUID

在开发过程中,有时我们会遇到“The serializable class CommonException does not declare a static final serialVersionUID field of type long”这样的一个报警异常。类似下面这样的:


我们需要这个值的原因是我们要把这个值永久地保存在一个磁盘上,通常是一个文件中。还有一点是我们要把这个对象在网络中传输。

解决方案:

add上面的3 quick fixes available中的一个。通常是去add第二个。


10.问题描述:

如何隐藏底部状态栏(System Bar)

底部导航栏如下:


隐藏方式:

在onCreate中添加如下代码:

[java]  view plain  copy
 print ? 在CODE上查看代码片 派生到我的代码片
  1. getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_HIDE_NAVIGATION);  

11.问题描述:

获得屏幕在旋转过程中的旋转角度

这里我们获得的不只是横屏还是竖屏的问题。而是更细一点的区分,比如横屏中的是和左旋转了90度,还是向右旋转了90.解决方案如下:

[java]  view plain  copy
 print ? 在CODE上查看代码片 派生到我的代码片
  1. WindowManager manager = (WindowManager) getSystemService(Context.WINDOW_SERVICE);  
  2. mRotation = manager.getDefaultDisplay().getRotation();  

12.问题描述:

Installation error: INSTALL_FAILED_VERSION_DOWNGRADE


  安装新的Apk时,出现以上报错信息。这是是因为Manifest中的android:versionCode属性,手机里APP的versionCode高于将要安装的APP。

解决方案:

  1.卸载原来的Apk

  2.将当前的Apk的versionCode属性值修改到比手机中Apk的versionCode属性值大即可。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值