美文网首页
凤凰demo小节

凤凰demo小节

作者: qianxL | 来源:发表于2016-09-03 21:16 被阅读0次

    凤凰demo小节

    • 再做一个demo时呢,首先一定得确定需求,具体实现先放一边。

    • 再以需求为目的,扩展出需要的工具,与之涉及的实体类。

    • 也应确定大致需要用到那些控件,对每个控件的应用呢都应该有基本的认识。

    • 千万不能忘记在androidManifest 中添加应用需要的权限。

    新认识的控件

    • StaggeredGridLayoutManager类是RecyclerView的另一个布局管理类,其类构造函数接收两个参数,参数一为同一个水平(或同一个垂直)有几个子项布局,参数二为子项布局放置方向。

    • cardView 多用在RecyclerView中的子项布局,以卡片的形式包裹内容。容器类型的布局。

    • circleimageview 此控件呢会把bitmap的图片以圆形的形式显示。

    • glide是一个自带缓存的图片加载库。
      基本的使用方式如下所示:

        public static void  loadpicture(String url, ImageView view){
            Glide.with(MyApplicatioin.getContext()).
                load(url).
                error(R.drawable.ic_image_loadfail).
                into(view);
        }
      

      with方法参数要传入Context参数,以构建环境,

      load方法参数传入需要加载的图片url(即图片地址)。

      error方法参数传入在没有找到图片url的情况下(错误),显示的图片。

      into方法参数为需要显示图片的View 控件。

    保存图片的方法

    需注意的地方有:保存位图时呢,调用bitmap对象的compress方法()就可保存图片,此方法呢接收三个参数。参数一为保存bitmap的格式,一般有png与jpg
    ,参数二图片的压缩率,无论是那种格式千万不能传入100即意为100%的压缩率,程序会崩溃的。参数三保存位图的fileOutputStream对象。以png格式保存图片呢,多少的压缩率都无所谓。
    构建bitmap保存的路径时,并不需要文件的存在,有路径就好,compress方法会自动创建文件。在保存时最好开启子线程来做事,用java流写文件还是蛮费时的。当使用glide加载图片后呢,要获取imageView的bitmap一定把imageView对象getDrawable()获取的对象转型为GlideBitmapDrawable然后再用getBitmap()方法获取位图,这样才能保存进去。

    public static File file;
    
    public synchronized static Boolean saveBitmap(final Bitmap bitmap , String jpgMark) {
        try {
            file = new File(Environment.getExternalStoragePublicDirectory("Icon"),"zuimei"+jpgMark+".png");
            if(!file.exists()){
                new Thread(new Runnable() {
                    @Override
                    public void run() {
                        FileOutputStream outputStream = null;
                        try {
                            outputStream = new FileOutputStream(file);
                            bitmap.compress(Bitmap.CompressFormat.PNG,99, outputStream);
                        } catch (FileNotFoundException e) {
                            e.printStackTrace();
                        }finally {
                            try {
                                if(outputStream != null) {
                                    outputStream.close();
                                }
                            } catch (IOException e) {
                                e.printStackTrace();
                            }
                        }
                    }
                }).start();
                return true;
            }else {
                return false;
            }
        }catch (Exception e){
            e.printStackTrace();
            return false;
        }
    }
    

    问题小节

    • 编写RecyclerView的子项视图时呢,高度设置成wrap-content就好,或者显示图片的子项视图呢直接规定需要多少dp就好。

    • 在编写RecyclerView的每个项目的点击事件时,直接在viewHolder对象构造函数里注册,可以提高性能。

          private OnitemClickListener itemlistener;
      
           public void setOnitemClickListener(OnitemClickListener listener) {
            this.itemlistener = listener;
        }
      
        class ZmImageHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
        private ImageView imageView;
        private TextView mText;
        public ZmImageHolder(View itemView) {
            super(itemView);
            itemView.setOnClickListener(this);
            imageView = (ImageView) itemView.findViewById(R.id.image_content_main2);
            mText = (TextView) itemView.findViewById(R.id.image_content_text2);
        }
        @Override
        public void onClick(View view) {
            if (itemlistener != null)
                itemlistener.onitemClick(view,zmlist.get(this.getLayoutPosition()));
            }
          }
        }
      

    其中呢通过viewholder对象的getLayoutPosition()方法来获得当前position(子项布局位置)

    • 当两个碎片同时添加在同一个fragmelayout时,即时调用hide()了,也出现重叠时呢,一定要在fragment的根布局中设置背景为白色。

    • 在activity中用getSupportFragmentManager()方法呢可以获取到管理V4包里碎片的管理对象,但是如果需要在fragment中再使用碎片,就不能通过此方法获取FragmentManager对象,因可能出现白页情况。
      需使用getChildFragmentManager()方法来获取子碎片的fragmentManager对象,才能正确显示内容。

    • 某些情况下,一定要加对象为空的判断,不然极易出现空指针的情况。activity一般在调用finish()方法,那些view对象也就被回收了,因其主宿主都已经被销毁了。

    • 有些基本需要多次写的就应该创建一个父类,然后新类继承就好。比如activity 和 Fragment。


    • 当创建java流对象后,写完或读完后一定要调用close()方法关闭了。要得到最终的流对象,至少需要一个对象来装饰,第一个对象呢是最终写入或读取的目标,第二对象用来装饰流的行为。如果要操作的内容中含有中文时呢,还需要一个适配器对象把InputStream或OutputStream转换为Reader或Writer对象。

            inputStream = MyApplicatioin.getContext().openFileInput(filName);
            reader = new BufferedReader(new InputStreamReader(inputStream));
             outputStream = MyApplicatioin.getContext().openFileOutput(fileName, Context.MODE_PRIVATE);
             writer = new BufferedWriter(new OutputStreamWriter(outputStream));
      

    • 从服务器返回的json数据呢,有以下两种处理方式:

        private  String loadPhoenix(String response , int postion) throws JSONException {
        JSONArray jsonArray = new JSONArray(response);
        return jsonArray.getJSONObject(postion).getString("item");
        }
      
        private  String loadZm(String response) throws JSONException {
        JSONObject object = new JSONObject(response);
        return object.getJSONObject("data").getString("images");
        }
      

    因view视图需要的实体类呢,会被一层层的包裹起来,所以就需提出我们需要那部分内容。
    方法一对应的时,服务器直接返回的是数组形式,且属于item这个键名才能获取到。
    方法二对应的是,服务返回的为对象,对象套对象,然后获取images的json内容。
    json数据是通过键对值得形式保存的。{}表示对象,[]表示数组。


    • 透明状态栏和透明导航栏,在activity的onCreate方法中进行操作。(只有安卓5.0才支持)

        if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP){
            Window window = getWindow();
            window.getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
                    |View.SYSTEM_UI_FLAG_LAYOUT_STABLE |View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION);
            // window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
            window.setNavigationBarColor(Color.TRANSPARENT);
            window.setStatusBarColor(Color.parseColor("#cccc99"));
        }
      

    SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN和SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION表示让应用的UI布局延伸到状态栏和导航栏.
    一定不能少SYSTEM_UI_FLAG_LAYOUT_STABLE此flag。最后再把两者的颜色设置为透明色。

    SYSTEM_UI_FLAG_HIDE_NAVIGATION和
    SYSTEM_UI_FLAG_FULLSCREEN表示直接把状态栏和导航栏隐藏。
    SYSTEM_UI_FLAG_IMMERSIVE_STICKY表示让应用内容变为沉浸式的,不为因点击就显示状态栏和导航栏,就像安卓游戏那样。

    • RecyclerView要设置OnScrollListener呢,通过addOnScrollListener()方法,要解除呢通过clearOnScrollListener()方法。复写

          public void onScrollStateChanged(RecyclerView recyclerView, int newState) 与 public void onScrolled(RecyclerView recyclerView, int dx, int dy) 。
      

    参数newState为当前RecyclerView的状态值
    RecyclerView.SCROLL_STATE_IDLE 表示视图不在滚动。

    参数dx,dy为当前坐标,通过存储上次的值,两次再减就能得出滑动方向。
    

    通过布局管理器对象的findLastVisibleItemPosition()方法获取子项最后可见的position,

    • 当使用DialogFragment时,用onCreateView()创建视图不加载时呢,就要使用onCreateDialog()方法,创建一个AlertDialog对象,并调用setView()方法显示的view,最后再返回一个AlerDialog 对象。

    相关文章

      网友评论

          本文标题:凤凰demo小节

          本文链接:https://www.haomeiwen.com/subject/hmflettx.html