• 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>的数据要进行一个批量的操作的时候。例如:

    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这种类型的。


    3.问题描述:

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

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

    解决方法:

    你的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上显示的文本信息,而是在向文本文件中写数据时的换行。这里使用的是" ",如下:

    String str = "ABC";  
    str += "
    ";

    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

  • 相关阅读:
    CF1386C Joker
    P7486 「StOI2031」彩虹
    CF1516E Baby Ehab Plays with Permutations
    重拾莫比乌斯反演
    联合省选 2020 补题记录
    拉格朗日插值如何插出系数
    NOI Online 2021 补题
    Re:从0开始的多项式生活
    LOJ #6485. LJJ 学二项式定理
    P5591 小猪佩奇学数学
  • 原文地址:https://www.cnblogs.com/fengju/p/6336130.html
Copyright © 2020-2023  润新知