Android开发中的实际问题记录

2020-01-22  本文已影响0人  zhangwenhao

问题记录

问题一(CirclerImageView 设置 selector 不成功)

问题二(Default Activity Not Found,app出现红叉,build.gradle、values下的文件出现乱码)

问题三(findViewByPosition() 方法返回值为 null)

public class FragmentRoute extends Fragment {

    ···
    //判断是否是第一次滑动
    private static boolean mIsFirstSmooth;
    //一个临时变量,用于记录上一次的位置
    private static int temp;
    ···
    private static final String TAG = "FragmentRoute";

    ···

    private void init(View view) {
        ···
        //因为我一开始是要指定 Item 为中间的一个,所以一开始初始化这个 temp 为 中间位置
        temp = recyclerView.getWidth() / 2;
        ···
    }

    /**
     * 计算 RecyclerView 的滑动距离
     * @return 滑动距离
     */
    public int getSmoothDistance() {
        int now = recyclerView.computeHorizontalScrollOffset();
        //先对第一次滑动作单独处理
        if (mIsFirstSmooth) {
            int ret = Math.abs(now - temp);
            temp = now;
            mIsFirstSmooth = false;
            return ret;
        } else {
        //第一次滑动结束后,后面的都在这块代码中
            int ret = Math.abs(now - temp);
            temp = now;
            return ret;
        }
    }

}
    recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
        @SuppressLint("ResourceType")
        @Override
        public void onScrollStateChanged(@NonNull RecyclerView recyclerView, int newState) {
            super.onScrollStateChanged(recyclerView, newState);
                ···
            //下面的三个实例会时不时的出现 null 的情况
            apply = manager.findViewByPosition(0);
            my = manager.findViewByPosition(1);
            all = manager.findViewByPosition(2)
                ···
         }
    }

}

问题四(计算 recyclerView 滑动距离的方法)

public class FragmentRoute extends Fragment {

    ···
    //判断是否是第一次滑动
    private static boolean mIsFirstSmooth;
    //一个临时变量,用于记录上一次的位置
    private static int temp;
    ···
    private static final String TAG = "FragmentRoute";

    ···

    private void init(View view) {
        ···
        //因为我一开始是要指定 Item 为中间的一个,所以一开始初始化这个 temp 为 中间位置
        temp = recyclerView.getWidth() / 2;
        ···
    }

    /**
     * 计算 RecyclerView 的滑动距离
     * @return 滑动距离
     */
    public int getSmoothDistance() {
        int now = recyclerView.computeHorizontalScrollOffset();
        //先对第一次滑动作单独处理
        if (mIsFirstSmooth) {
            int ret = Math.abs(now - temp);
            temp = now;
            mIsFirstSmooth = false;
            return ret;
        } else {
        //第一次滑动结束后,后面的都在这块代码中
            int ret = Math.abs(now - temp);
            temp = now;
            return ret;
        }
    }

}

问题四(SurfaceView 加载黑屏的情况)

太麻烦了,先这样写, 后续修改

已解决问题
    1. 小细节,场景:根据不同的packageId来创建对应的文件,并进行写入
        添加的分隔符“/”位置在路径后面,导致文件路径不符合预期

    2. 网络请求失败,写入文件byte size = 0
        下载失败,排查file为未创建、url地址错误、file.name错误
        原因:项目中下载库已经创建了file,不需要我们在手动创建

    3. module中我的修改push不到远端,且文件呈黄色,并且,add后通过status查看,没有我的修改
        as中,黄色文件表示未加入git,被忽略了
        解决:在as的设置中,找到versino control,发现该module被unegiste了
            将该module加入到version control中,并从unregiste中移除

    4. 在fragment中使用kotlin-android-extensions代替findViewById,出现空指针
        原因:与 Activity 不同的是,Fragment 需要在 onViewCreated 中使用控件才行,否则会报空指针异常 
            反编译后,查看,内部会调用onCreateView()拿到View,如果是null,则返回null,而在onCreateView()中使用的话,拿到的这个View必然是null的

    5. 使用ViewPager + tabLayout时,在setupWithViewPager()之前手动调用setText()去设置title,是不会显示的
        原因:内部会重新调用view pager的getPageTitle()方法去设置title

    6. 在kotlin中,继承 RecyclerView的viewholder时,如果构造方法中设置一个 val itemView: View 属性,那么在使用的时候就会出错:Overload resolution ambiguity. All these functions match
        原因:kotlin代码中的val itemView: View,对应到java代码,就是:public final View itemView,而ViewHolder中本来就有一个一摸一样的itemView,就会导致:父类与子类直接的属性冲突

    7. 序列化时,所有对象都需要进行序列化(包括对象内部的属性)

    8. notifyDataSetChanged(),更新数据,必须保证是同一个数据源(如:同一个list,就意味着不能将另一个list的引用赋值给这个list)

    9. tablayout的tab默认没有添加颜色,就是主题色,而主题是白色就会显示为没有text的样子
            内部是通过TextView进行展示的,而Textview的布局没有设置textColor,所有就是主题色

    10. viewPager的滑动事件被activity拦截了,但是有个疑点:在version item list这边的滑动是没有被拦截的,只有ppe配置那边的滑动被拦截了
            猜测:从SlideActivity的onSlideFinish方法入手

    11. scrollView内部如果嵌套了一个relativelayout,则RelativeLayout的match_parent不起作用,不能把ScrollView 撑起来
            解决:设置ScrollView属性:android:fillViewport="true"填充内容

    12. scrollView滑动问题,先看看布局有没有超出屏幕,超出屏幕才能看出到底滑没化
            重申:并不是网上说的包装relativelayout不能滑动

    13. 如果item高度超过了屏幕高度,请使用wrap_content

    14. 实现吸顶效果,通过removeView()、addView()实现的效果,存在略微卡顿,闪烁现象
            原因:主布局是:title + list这种形式
                吸顶的实现是:通过remove tab,然后将tab add到title的父布局中,是一个LinearLayout
                就在于这个LinearLayout父布局,是wrap_content,然后当滑动到顶部时,加入一个tab到title中时,父布局LinearLayout变高了,将recyclerView顶下去了,但是又因为我手指还未移走,所以视图又回到了原来的item位置,就出现了闪烁的现象
            解决:在LinearLayout下面放了一个FramLayout,add View的时候就add到这个里面去

    15. 第一个put操作会报空指针,原因是put方法返回一个先前值,但是这里是第一次调用,所以返回的是一个null,而我们外面的接收类型是int,会执行自动拆箱操作,所以会为空
        git操作也是类似的
        HashMap<Integer, Integer> elementCountMap = new HashMap<Integer, Integer>();
        int oldCount = elementCountMap.put(nums[index++], 1);
        int index = 0;
        while (index <= nums.length - 1) {
            int oldCount = elementCountMap.put(nums[index++], 1);
            if (oldCount != 0)
                elementCountMap.put(nums[index++], ++oldCount);
        }



其他
    1. 使用Inten传递Bundle时,两个方法的区别
        putExtra(String name, @Nullable Bundle value) :将Bundle存入Intent内部的Bundle的map中
        putExtras(@NonNull Bundle extras) :将Bundle中的数据存到Intent内部的Bundle中

    2. 一般在recyclerView中,去拿item的某一个子View,是先去拿的ViewHolder,然后再去拿View
        findViewHolderForAdapterPosition(),或者其他的findViewHolder方法

    3. as 后面一搬写一个?,防止强转失败,程序崩溃
    4. 不想写安全调用?,可以在变量赋值时,后面加一个运算符 ?: 空值
    5. 关于一个view的实例,如果该实例是不会变的(即使它的parent View变了,但本身是没变的),则我们通过findViewById(),拿到的View,就可以存起来,下次直接用就行了,不用每次都去findViewById

    6. removeView:会先确定view的索引,然后再便利父View,找到该View,进行移除(置空它的parent引用、以及自己的引用)
        addView:会先对父View进行布局、绘制、然后再添加View,进行布局、绘制
        使用View.GONE、View.VISIBILITY来代替,这两个方法虽然也会重新进行布局、绘制,但不存在View移除/添加问题,只会更新一下View树
        使用ViewStub代替setVisibility(View.GONE的View是占内存的,只是不显示而已)

    7. modole.text?.isNotBlank() == true,这行判断语句,不能改为 != false
        原因:对于可空值的判断,是有三种情况的:null、false、true,一定要注意,想要什么条件的时候才继续往下执行(别忘了三个值中的null)
上一篇 下一篇

猜你喜欢

热点阅读