Android细节问题总结(一)

这篇博客是用来记录本身在写代码的过程当中遇到的一些问题,以及解决方法,作一个总结,算是笔记吧。html


1.问题描述:java

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

解决方法:android

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


2.问题描述:缓存

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

解决方法:app

这种状况通常出如今咱们对List<T>的数据要进行一个批量的操做的时候。例如:eclipse

for (int i = mPositions.size() - 1; i >= 0; i--) {
			mPackageInfos.remove((int)mPositions.get(i));
			mAdapter.notifyDataSetChanged();
		}

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

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


3.问题描述:布局

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

当咱们点击某一Activity中的EditText时,咱们的某些控件会被挤压。若是你不是使用比例来控制布局,那么你的运气很好,多是看不到控件被挤压。通常来讲若是你的一些控件是用的百分比来控制,那么你的控件颇有可能就会出现被挤压得很扁。ui

解决方法:

你的Manifest.xml文件能够这样来写:

<activity android:name="com.xxxx.xxxActivity"
            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格式.

解决方法:

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中实现:

android:screenOrientation="portrait"
示例 — Java代码实现:
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);


8.问题描述:

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

String subString = str.substring(a, b);


9.问题描述:

SQLite中多级ORDER BY的使用.

SELECT * FROM COMPANY ORDER BY NAME, SALARY ASC;


10.问题描述:

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

解决方案:

public static boolean isWifiNetwork(Context context) {
	    boolean isWifi = false;
	    Context getContext = context.getApplicationContext();  
	    ConnectivityManager connectivity = (ConnectivityManager) getContext
	            .getSystemService(Context.CONNECTIVITY_SERVICE);
	    NetworkInfo[] info = null;
	    if (connectivity != null) {
	        info = connectivity.getAllNetworkInfo();
	        if (info != null) {
	            for (int i = 0; i < info.length; i++) {
	                if (info[i].getTypeName().equals("WIFI") && info[i].isConnected()) {
	                    isWifi = true;
	                    break;
	                }
	            }
	        }
	    }
	    getContext = null;
        connectivity = null;
        info = null;
        
	    return isWifi;
	}

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",以下:

String str = "ABC";  
str += "\r\n";

13.问题描述:

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

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

int screenState = MainActivity.this.getResources().getConfiguration().orientation;
				if (screenState == Configuration.ORIENTATION_LANDSCAPE){
					MainActivity.this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
				} else if (screenState ==Configuration.ORIENTATION_PORTRAIT) {
					MainActivity.this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
				}

14. 问题描述:

得到键盘高度

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

/**
 * 用于得到键盘的高度
 */
rootView.getViewTreeObserver().addOnGlobalLayoutListener(
	new ViewTreeObserver.OnGlobalLayoutListener() {
	
	@Override
	public void onGlobalLayout() {
                      
		Rect r = new Rect();
		rootView.getWindowVisibleDisplayFrame(r);

		int screenHeight = rootView.getRootView().getHeight();
		int KeyboardHeigth = screenHeight - (r.bottom - r.top);
	}
});


15.问题描述:

得到平板序列号

若是要用一串惟一标识设备的字符串,在手机上相信你们首先想到的可能就是IMEI。不过对于通常的手机来讲,这一点恐怕就很难实现了。由于通常来讲,平板中不安装SIM卡,因此平板中是没有分配IMEI号码的。固然,也有一些平板中就有,华为就是。

解决方案:

public static String getSerialNumber() {
    returnandroid.os.Build.SERIAL;
}


16.问题描述:

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

解决方案:

遇到这种状况通常来讲就是你没有替换掉全部分辨率下的图标,这时只须要从新替换掉全部图标便可。不过今天我也遇到了替换图标失效的问题,我项目中全部分辨率下的图标均已替换,但是仍是不行。原来是由于咱们的手机会有一个缓存机制,它保存了咱们原来的那个图标,无论你怎么替换确定都是不行的。如今你要么是等,要么是换一台机器试试。


17.问题描述:

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

解决方案:

imgSizeEditText.setFilters(new InputFilter[]{new InputFilter.LengthFilter(3)});


18.问题描述:

动态设置EditText光标位置

解决方案:

imgNameEditText.setSelection(32); // 设置光标的位置


19.问题描述 :

动态得到控件的宽和高

解决方案:

就拿RelativeLayout来讲明一下吧

RelativeLayout mShowLayout = (RelativeLayout) findViewById(R.id.main_relative_layout);
mShowLayout.measure(0, 0);
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())));


笔者最新开发的应用链接

http://zhushou.360.cn/detail/index/soft_id/2419729?recrefer=SE_D_%E6%A3%B1%E9%95%9C

http://www.wandoujia.com/apps/com.mastershield.personalstat

相关文章
相关标签/搜索