Android-Panda-FAQ

1、问题描述:
在存在多屏数据的时候,频繁滑动ListView会出现部分item黑屏的现象?

问题原因:
ListView的显示Adapter中的Item布局过于复杂,频繁滑动ListView时Android底层渲染不及时导致。

问题解决:
在AndroidMainnifest.xml中设置硬件加速,加速对界面渲染即可。(android:hardwareAccelerated=”true”)

2、问题描述:
webView在调用removeAllViews()的时候出现空指针异常:
java.lang.NullPointerException
android.webkit.WebViewClassic.sendViewSizeZoom(WebViewClassic.java:3573)

问题原因:
在AndroidMainifest.xml中的WebView的Activity设置了硬件加速。

问题解决:
针对当前Activity取消硬件加速即可。(android:hardwareAccelerated=”false”)
3、问题描述:
在更新新版本后,数据库报没有列名的异常?

问题原因:
用户升级版本夸大过大,而在判断的时候在onUpgrade方法中是根据oldVersion、newVersion来比较判断的,例如:用户从版本号为7直接升级到了版本号为9,此时为版本号为8的版本的字段则没有添加到数据库中。

问题解决:
在onUpgrade方法中对全部字段进行判断,判断方法为如果在数据库中不存在字段,则创建字段,例如:

// 直接在zg_message表中增加my_id列
private String ADD_MY_ID_CLUMN_TO_ZG_MESSAGE = "ALTER TABLE zg_message ADD my_id integer";

if (!DBHelperMethod.checkColumnExist(db,
                PandaDBConst.ZG_MESSAGE, "my_id")) {
            db.execSQL(ADD_MY_ID_CLUMN_TO_ZG_MESSAGE);
}

/** * 检查某表列是否存在 * * @param db * @param tableName * 表名 * @param columnName * 列名 * @return */
    public static synchronized boolean checkColumnExist(SQLiteDatabase db,
            String tableName, String columnName) {
        boolean result = false;
        Cursor cursor = null;
        try {
            // 查询一行
            cursor = db.rawQuery("SELECT * FROM " + tableName + " LIMIT 0",
                    null);
            result = cursor != null &&  cursor.getColumnIndex(columnName) != -1;
        } catch (Exception e) {
            Log.e(TAG, "checkColumnExists1..." + e.getMessage());
        } finally {
            if (null != cursor && !cursor.isClosed()) {
                cursor.close();
            }
        }

        return result;
    }
注意:我们再onCreate中创建表的时候也要判断表是否存在,然后再创建,例如:
// 频道动态表
db.execSQL("create table IF NOT EXISTS channel_dynamic(_id integer primary key,channelids varchar,content varchar)");

4、问题描述:
新闻类数据缓存有什么方案?

问题解决:
①当第一次进入界面首先读取缓存中的新闻数据(db或者sp中的数据),如果不存在则显示加载界面,如果存在则显示具体新闻。
②在显示的同时请求服务器获取最新的第一页数据,返回结果后然后更新界面,同时保存新闻数据到缓存中。
③当用户下拉刷新的是传入一个page字段,然后请求服务器,获取下一页的数据,page为你想要获取的数据的页数。
这样做如果有缓存数据,则用户每次进来都能看到数据的。

5、问题描述:
广告缓存有什么方案?

问题解决:
每次进入需要显示广告的界面,首先去缓存图片,如果图片缓存成功并且当前Activity没有销毁,则显示广告,反之不显示广告。

6、问题描述:
为什么从服务器上获取的图片已变形?

问题原因:
因为在xml中设置的是图片的background,因该设置图片的src(在代码中设置方法:setImageResouce(Bitmap bmp)),然后再设置图片的ScaleType为CenterCrop。

问题解决:
xml设置:android:scaleType=”centerCrop”;
代码设置:iv.setScaleType(ScaleType.CENTER_CROP);

7、问题描述:
耗时请求后(AsyncTask)更新界面异常:is your activity running?

问题原因:
因为Activity已经销毁,但是没有取消AsyncTask,当异步执行完毕后,更新界面发现界面以及销毁,如果在这个时候弹出Dialog则会出现这个错误。

问题解决:
在弹出Dialog前面判断:

if(mContext != null && !((Activity)mContext).isFinishing()){
                  MyAlertDialog();
                     .........
}

8、问题描述:
Android中EditText获取焦点键盘弹出来后将整个布局都顶了上去,怎么设置只顶EditText,不顶整个布局?

问题解决:
把不需要顶上去的布局最外层包裹一层ScrollView。

9、问题描述:
Android属性动画不重复执行问题?

问题解决:
ObjectAnimator oa ;
… …
oa.setRepeatCount(ObjectAnimator.INFINITE);

10、问题描述:
Android中点击Back键盘退出APP报错:IllegalStateException: Can not perform this action after onSaveInstanceState。(从日志中可以看出是在fragment.commit()方法中出的错)。

问题原因:
在使用commit方法是在Activity的onSaveInstanceState()之后调用的,这样会出错,因为onSaveInstanceState方法是在该Activity即将被销毁前调用,来保存Activity数据的,如果在保存玩状态后再给它添加Fragment就会出错。

问题解决:
把commit()方法替换成commitAllowingStateLoss()就行了,其效果是一样的。

11、问题描述:
通过ImageSpan设置ImageView大小失效问题(通过TextView高度设置图片高度,从而使得图片随着文字大小改变而改变).

问题原因:
在构造ImageSpan时候使用了默认的一个参数的构造方法造成的。(使用的是默认mTargetDensity密度,所以我们即使设置了大小但是还是不管用的)

问题解决:
使用ImageSpan带两个参数(带有Context)的构造方法即可。

12、问题描述:
在Android中如何设置TextView上下文字滚动?

问题解决:
布局中和代码中分别设置相应
①布局属性设置:

android:scrollbarFadeDuration="5000"
android:scrollbarStyle="outsideOverlay"
android:scrollbars="vertical"
android:singleLine="false"

例如:

 <TextView  android:id="@+id/id_msg_tv" android:layout_width="fill_parent" android:layout_height="wrap_content" android:maxHeight="100dip" android:minHeight="40dip" android:layout_margin="10dp" android:background="#FFF" android:padding="10dp" android:scrollbarFadeDuration="5000" android:scrollbarStyle="outsideOverlay" android:scrollbars="vertical" android:singleLine="false" android:textColor="#000"/>

②代码属性设置:

TextView id_msg_tv = (TextView) contentView.findViewById(R.id.id_msg_tv);
id_msg_tv.setMovementMethod(ScrollingMovementMethod.getInstance()); 

12、问题描述:
在Android中Activity背景默认为啥是黑色的?

问题原因:
在代码中或者Androidmainfest.xml中设置了主题样式为黑色的导致的。

问题解决:

二、在java文件里设置:

LinearLayout myLayout = () findViewById(R.id.linearLayout1);
myLayout.setBackgroundColor(Color.WHITE);
三、在AndroidManifest.xml里利用android:theme来设置,这个命令还是很强大的,如下所示:
theme的设置 可以设置为系统自带的格式,也可以自定义格式。

A: 系统自带格式

   @android:style/Theme.Black  //背景黑色-有标题-非全屏
   @android:style/Theme.Black.NoTitleBar //背景黑色-无标题-非全屏
   @android:style/Theme.Black.NoTitleBar.Fullscreen //背景黑色-无标题-全屏显示
   @android:style/Theme.Dialog //对话框显示
   @android:style/Theme.InputMethod

   @android:style/Theme.Light    //背景白色-有标题-非全屏
   @android:style/Theme.Light.NoTitleBar //背景白色-无标题-非全屏
   @android:style/Theme.Light.NoTitleBar.Fullscreen //背景白色-无标题-全屏显示

   @android:style/Theme.Light.Panel
   @android:style/Theme.Light.WallpaperSettings //背景透明
   @android:style/Theme.NoDisplay

   @android:style/Theme.Translucent.NoTitleBar.Fullscreen //半透明、无标题栏、全屏

   @android:style/Theme.Wallpaper.NoTitleBar.Fullscreen

可以在单个Activity里设置,也可以在applicaiton里全局设置。比如:

<activity android:screenOrientation="portrait" android:name=".ui.RegisterActivity" android:theme="@android:style/Theme.NoTitleBar"></activity>

13、问题描述:
ava.util.ConcurrentModificationException
java.util.ArrayList ArrayListIterator.next(ArrayList.java:573)com.diipo.traffic.punish.BindDrivingLicenceActivity 5.onClick(BindDrivingLicenceActivity.java:319)
问题原因:
对Vector、ArrayList在迭代的时候如果同时对其进行修改就会抛出java.util.ConcurrentModificationException异常

for(CarInfo info : phoneSelectList){                                
    if(!info.getCar_phone().equals(driver_phone)){
        CarInfo ifo = new CarInfo(); 
        ifo.setCar_phone(driver_phone); 
        phoneSelectList.add(ifo);
    }
}

问题解决:

ArrayList<CarInfo> phoneSelectListBack = new ArrayList<CarInfo>();
for(CarInfo info : phoneSelectList){                                
    if(!info.getCar_phone().equals(driver_phone)){
        CarInfo ifo = new CarInfo();    
        ifo.setCar_phone(driver_phone);                                   
        //phoneSelectList.add(ifo);
        phoneSelectList.add(infoBack);
    }
}

for(CarInfo infoBack : phoneSelectListBack){
    phoneSelectList.add(infoBack);
}

你可能感兴趣的:(FAQ)