记录平时Android开发中的一些不容易记忆的bug解决方法

这里记录着我在开发中学习中遇到的一些问题,和如何去解决这些问题的方法。

1、ListView、GridView和ScrollView嵌套使用导致界面不是显示在顶部,而是往下滑动了一段距离。

解决:ListView.setFocusable(false)或GridView.setFocusable(false) 有多少个ListView、GridView就写多少个setFocusable(false)方法

2、点击ListView、GridView时获取被点击的那一项的item,实现局部刷新。

int currentPos = ListView.getFirstVisiblePosition;获取ListView第一个显示的item的位置,然后用点击的位置(这个容易获得)减去currentPos,得到的位置就是当前界面点击的位置,之后使用ListView.getChildAt(相减后的位置值),返回一个View对象,这个view对象就是点击的那个item,然后可以进行其他操作了。

3、Activity A跳到Activity B中,A中的onPause方法先执行,然后执行B中的onCreate、onStart、onResume,最后执行A中的onStop方法,所以在onPause方法中不能执行耗时操作,以便B能立马被创建。

4、Activity里面使用Fragment,然后Fragment中有ViewPager ,ViewPager 里面用的是Fragment,当app放在后台后,手机内存不够,一旦重新回到app内,就会出现空白的情况,这种情况在之前的开发中经常出现,头疼,后来才发现在Fragment中嵌套Fragment时getFragmentManager()应该替换成getChildFragmentManager(),例:mViewPager.setAdapter(new ViewPagerAdapter(getChildFragmentManager(), mFragemnts));这样就算APP崩溃了,也会重新回复有数据的界面。

5、在配合Scrollview做背景透明度渐变的时候,使用getBackground().setAlpha()导致其他布局的背景透明度也发生变化,是因为它们都是公用同一个状态。使用getBackground().mutate().setAlpha()后让控件不共享状态,这样就能单独控制一个控件的背景透明度了。

6、在安卓的xml文件中,TextView控件中直接给Android:text="你好\n世界" 那么运行起来就会换行,如果用代码设置textView.setText("你好\\n世界");,那么就直接输出/n,达不到换行的效果,所以要用textView.setText("你好\\n世界".replace("\\n","\n"));做处理,这样就会换行。

7、Activity和Fragment结合使用的时候会出现一些异常,如:Can not perform this action after onSaveInstanceState这个时候就不能直接使用FragmentTransaction.commint方法了,应该使用FragmentTransaction.commitAllowingStateLoss()方法代替。

8、在ViewPager中想要删除某一个item,需要在适配器中重写一个方法:getItemPosition(Object object) return POSITION_NONE;返回的是个常量,并且在instantiateItem()和destoryItem中的返回的potiosn值不能直接使用,需要和item集合的大小求余所得的值才是正确的,最后调用集合的remove()方法删掉指定位置的item,调用下适配器的刷新方法,这样就成功删掉某一个item。(有个问题,实际删除测试中,有个大图会和其他图片重叠,不知道是不是图片太大还是什么原因)

9、使用getIdentifier()方法获取应用报下的资源ID。例:getResources().getDrawable(getResources().getIdentifier("image","drawable",getPackageName()));

获取当前应用下的图片“image”的资源id。

10、XML 属性anroid:clipToPadding 默认为true,表示当ViewPager或ListView里面使用android:padding 属性时裁减掉padding部分;false:不裁减掉padding部分,依然能看到item项,类似ViewPager的画廊效果。

11、View中的两个方法,getGlobalVisibleRect(Rect)和getLocalVisibleRect(Rect),getGlobalVisibleRect:获取视图在屏幕中的可视区域(左,上,右,下);getLocalVisibleRect:获取视图本身可见的坐标区域,坐标以自己的左上角为原点(0,0),只要视图没有被遮挡,坐标总是等于(0,0,view.getwidth(),view.getHeight())。

12、在代码中设置EditText的输入类型是小数类型,EditText.setInputType(InputType.TYPE_CLASS_NUMBER|InputType.TYPE_NUMBER_FLAG_DECIMAL|InputType.TYPE_NUMBER_FLAG_SIGNED);。

13、onRequestPermissionsResult在Fragment中不回调。如果Fragment是android.support.v4.app.Fragment,在Fragment中请求权限时,直接用requestPermissions(@NonNull String[] permissions, int requestCode)如果Fragment所在的Activity是AppCompatActivity,用ActivityCompat.requestPermissions。

14、解决git bash 每次操作需要输入账号密码的问题 在git bash 中执行 git config --global credential.helper store 然后执行其他操作时会提示输入账号密码,输完后下次操作就不会出现输入账号密码的情况

15、App运行中,当按home键到桌面,然后点击App的icon进入App,会再次进入App的 启动页,然后进入MainActivity中,应该进入回到桌面之前的界面。解决:在App最先启动的Activity的onCreate方法中加入如下代码

 if (!isTaskRoot()) {//是否是任务栈中的根Activity,是的话启动,否的话说明栈中存在了activity,不需要重新启动
            finish();
            return;
        }

16、AlertDialog设置宽占满全屏 ,AlertDialog设置如下style,但是会导致输入法弹出时,dialog不会被顶上去的问题

还有一种解决方法是,给window设置一个背景,这样就能宽度撑满全屏,也会被输入法顶上去

dialog.getWindow().setBackgroundDrawable(new ColorDrawable(0));

17、Dialog中可以输入内容的时候,输入法弹出来后,当点击弹窗外部时,弹窗消失,而输入法没有消失的问题。在AndroidManifest.xml中的相应的activity加入android:windowSoftInputMode="adjustPan"熟悉,解决输入法不隐藏的问题。

你可能感兴趣的:(Android,Java)