凤凰demo小节

凤凰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 对象。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,911评论 5 460
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 82,014评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 142,129评论 0 320
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,283评论 1 264
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,159评论 4 357
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,161评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,565评论 3 382
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,251评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,531评论 1 292
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,619评论 2 310
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,383评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,255评论 3 313
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,624评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,916评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,199评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,553评论 2 342
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,756评论 2 335

推荐阅读更多精彩内容