记录平时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不会被顶上去的问题

<style name="dialog_full_screen"> 
        <item name="android:windowFullscreen">true</item>  
    </style>

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

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

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

19、让dialog全屏在xml布局文件里面需要使用match_parent,然后

WindowManager.LayoutParams attributes = getWindow().getAttributes();
attributes.height = ScreenUtils.getScreenHeight();
attributes.width = ScreenUtils.getScreenWidth();
getWindow().setAttributes(attributes);

20、NestedScrollView嵌套RecyclerView导致滑动不流畅问题的解决办法

LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this);
linearLayoutManager.setSmoothScrollbarEnabled(true);
linearLayoutManager.setAutoMeasureEnabled(true);
rcvImage.setLayoutManager(linearLayoutManager);
rcvImage.setHasFixedSize(true);
rcvImage.setNestedScrollingEnabled(false);

21、平板中全屏弹出dialog,有些平板上底部会空出虚拟键的空间,但虚拟键不显示,而底部的视图会显示出来,在dialog开启和关闭的时候,隐藏虚拟键

private void hideVirtualKey(){
    getDialog().getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_HIDE_NAVIGATION);
    getDialog().getWindow().getDecorView().setOnSystemUiVisibilityChangeListener(new View.OnSystemUiVisibilityChangeListener() {
        @Override
        public void onSystemUiVisibilityChange(int visibility) {
            int uiOptions = View.SYSTEM_UI_FLAG_LAYOUT_STABLE |
                    //布局位于状态栏下方
                    View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION |
                    //全屏
                    View.SYSTEM_UI_FLAG_FULLSCREEN |
                    //隐藏导航栏
                    View.SYSTEM_UI_FLAG_HIDE_NAVIGATION |
                    View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN;
            if (Build.VERSION.SDK_INT >= 19) {
                uiOptions |= 0x00001000;
            } else {
                uiOptions |= View.SYSTEM_UI_FLAG_LOW_PROFILE;
            }
            getDialog().getWindow().getDecorView().setSystemUiVisibility(uiOptions);
        }
    });
}

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值