Android开发小工具以及小错误总结

本篇文章是之前自己做一个练手项目的一个总结,第一次做一个项目,有点笨,但是项目的基本功能都实现了。如有需要看项目如何实现的可以移步GitHub地址:乐呵,或者用魅族手机的朋友可以上魅族应用市场搜索乐呵下载,或者点击我下载

list数据不拼接

在项目中使用的是XRecyclerView,但是有时候数据的拼接,也就是数据的分页显示会不能添加到List集合中,我在项目使用的办法如下:

 @Override
 public void onResponse(Call<NewsResult>    call,Response<NewsResult> response) {
            mNewsInfos.addAll(response.body().
                 getResult().getData());//直接将数据添加到list集合中 
            mNewsAdapter.notifyDataSetChanged();//记得刷新数据
    }

首先先创建一个集合,然后将每次请求网络返回的数据直接添加进入list集合中,这就OK了。项目中用的网络请求框架为Retrofit2.1

Adapter中的holder中的控件不能做全局变量

也许这不算个问题,但是有时候使用AS的时候使用快捷键 Ctrl + Alt + V 后 顺手Ctrl + Alt + F,然后变量就设置到全局变量中了,这样就会导致你程序运行到这里就会崩溃。所以写代码还是非常小心的,否则就是自己给自己挖坑。

解决WebView有时候显示不出来

不同的导火线就会导致不同的结果,我这里是因为WebView中要加载的URL有时候是http,有时候是https,so我的解决办法如下:

webView.setWebViewClient(new WebViewClient(){

public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error){     
 //handler.cancel(); 默认的处理方式,WebView变成空白页     
   handler.proceed();  //接受证书,重要
 //handleMessage(Message msg); 其他处理     
               }  
});  

this.webView.loadUrl("你的url");  
}

WebView实例的setWebViewClient方法中重写onReceivedSslError方法。然后添加接受证书即可。

ViewPager + fragment使用的小问题

在切换页面时你是否会只加载出第一个页面,而其它页面加载不上了。那么不妨看一下我的方法。

  • ViewPager + fragment使用中的getFragmentManager(),不妨改成getChildFragmentManager()

  • 我在项目中使用

private void setupViewPager() {
        mFragments = new ArrayList<>();
        for (int i = 0; i < mTitles.length; i++) {
            NewsListFragment mNewsListFragment = new    NewsListFragment();
            Bundle bundle = new Bundle();
            bundle.putInt("index", i);//多个页面
            mNewsListFragment.setArguments(bundle);
            mFragments.add(mNewsListFragment);
        }
        // 第二步:为ViewPager设置适配器
        BaseFragmentAdapter adapter =
                new BaseFragmentAdapter(getChildFragmentManager(), mFragments, mTitles);

        mViewPager.setAdapter(adapter);
        mViewPager.setOffscreenPageLimit(1);// 设置缓存页面,当前页面的相邻N各页面都会被缓存

        //  第三步:将ViewPager与TableLayout 绑定在一起
        mTabLayout.setupWithViewPager(mViewPager);
    }

引用Bmob后端云后打包导致包冲突

引用Bmob后端云后打包导致包(Gson,retrofit:2.1.0,OkHttp)冲突的的解决办法

compile ('com.squareup.retrofit2:converter-gson:2.1.0'){
                exclude group: 'com.google.code.gson'//去除这个jar包的引用,以下同理
                exclude group: 'com.squareup.okhttp3' }

compile ('com.squareup.retrofit2:retrofit:2.1.0'){
                exclude group: 'com.squareup.okhttp3' }

解释:
exclude group: 'com.google.code.gson'//去除这个jar包的引用,以下同理;

'com.google.code.gson',可以去冲突的jar包下的META-IN下的仓库文件夹下打开找到 pom.xml 文件,然后打开该文件找到<dependecy>节点下的<groupId>节点中的内容就是咱们需要的内容

推荐2个小工具


  • 时间转换工具

将时间转换为时间戳,比如新闻几小时前发布; 原文地址
public class DateUtils {
        /**
         * 掉此方法输入所要转换的时间输入例如("2014年06月14日16时09分00秒")返回时间戳
         *
         * @param time
         * @return
         */
        public static String data(String time) {
            SimpleDateFormat sdr = new SimpleDateFormat("yyyy年MM月dd日HH时mm分ss秒",
                    Locale.CHINA);
            Date date;
            String times = null;
            try {
                date = sdr.parse(time);
                long l = date.getTime();
                String stf = String.valueOf(l);
                times = stf.substring(0, 10);
                Log.d("--444444---", times);
            } catch (ParseException e) {
                e.printStackTrace();
            }
            return times;
        }

        /**
         * 掉此方法输入所要转换的时间输入例如("2014-06-14 17:19")返回时间戳
         *
         * @param time
         * @return
         */
        public static String dataOne(String time) {
            SimpleDateFormat sdr = new SimpleDateFormat("yyyy-MM-dd HH:mm",
                    Locale.CHINA);
            Date date;
            String times = null;
            try {
                date = sdr.parse(time);
                long l = date.getTime();
                String stf = String.valueOf(l);
                times = stf.substring(0, 10);
                Log.d("--444444---", times);
            } catch (ParseException e) {
                e.printStackTrace();
            }
            return times;
        }
    /**
     * 掉此方法输入所要转换的时间输入例如("2014-06-14-16-09-00")返回时间戳
     *
     * @param time
     * @return
     */
    public static String dataTwo(String time) {
        SimpleDateFormat sdr = new SimpleDateFormat("yyyy-MM-dd",
                Locale.CHINA);
        Date date;
        String times = null;
        try {
            date = sdr.parse(time);
            long l = date.getTime();
            String stf = String.valueOf(l);
            times = stf.substring(0, 10);
            Log.d("--444444---", times);
        } catch (ParseException e) {
            e.printStackTrace();
        }
        return times;
    }

        /**
         * 调用此方法输入所要转换的时间戳输入例如(1402733340)输出("2014年06月14日16时09分00秒")
         *
         * @param time
         * @return
         */
        public static String times(String time) {
            SimpleDateFormat sdr = new SimpleDateFormat("yyyy年MM月dd日");
            @SuppressWarnings("unused")
            long lcc = Long.valueOf(time);
            int i = Integer.parseInt(time);
            String times = sdr.format(new Date(i * 1000L));
            return times;

        }

        /**
         * 调用此方法输入所要转换的时间戳输入例如(1402733340)输出("2014年06月14日16时09分")
         *
         * @param time
         * @return
         */
        public String timet(String time) {
            SimpleDateFormat sdr = new SimpleDateFormat("yyyy年MM月dd日HH时mm分");
            @SuppressWarnings("unused")
            long lcc = Long.valueOf(time);
            int i = Integer.parseInt(time);
            String times = sdr.format(new Date(i * 1000L));
            return times;

        }


        // 并用分割符把时间分成时间数组

        /**
         * 调用此方法输入所要转换的时间戳输入例如(1402733340)输出("2014-06-14-16-09-00")
         *
         * @param time
         * @return
         */
        public String timesOne(String time) {
            SimpleDateFormat sdr = new SimpleDateFormat("yyyy-MM-dd-HH-mm-ss");
            @SuppressWarnings("unused")
            long lcc = Long.valueOf(time);
            int i = Integer.parseInt(time);
            String times = sdr.format(new Date(i * 1000L));
            return times;

        }

        /**
         * 根据传递的类型格式化时间
         *
         * @param str
         * @param type 例如:yy-MM-dd
         * @return
         */
        public String getDateTimeByMillisecond(String str, String type) {

            Date date = new Date(Long.valueOf(str));

            SimpleDateFormat format = new SimpleDateFormat(type);

            String time = format.format(date);

            return time;
        }
    /**
     * 将时间戳转为代表"距现在多久之前"的字符串
     * @param timeStr   时间戳
     * @return
     */
    public static String getStandardDate(String timeStr) {

        StringBuffer sb = new StringBuffer();

        long t = Long.parseLong(timeStr);
        long time = System.currentTimeMillis() - (t*1000);
        long mill = (long) Math.ceil(time /1000);//秒前

        long minute = (long) Math.ceil(time/60/1000.0f);// 分钟前

        long hour = (long) Math.ceil(time/60/60/1000.0f);// 小时

        long day = (long) Math.ceil(time/24/60/60/1000.0f);// 天前

        if (day - 1 > 0) {
            sb.append(day + "天");
        } else if (hour - 1 > 0) {
            if (hour >= 24) {
                sb.append("1天");
            } else {
                sb.append(hour + "小时");
            }
        } else if (minute - 1 > 0) {
            if (minute == 60) {
                sb.append("1小时");
            } else {
                sb.append(minute + "分钟");
            }
        } else if (mill - 1 > 0) {
            if (mill == 60) {
                sb.append("1分钟");
            } else {
                sb.append(mill + "秒");
            }
        } else {
            sb.append("刚刚");
        }
        if (!sb.toString().equals("刚刚")) {
            sb.append("前");
        }
        return sb.toString();
    }


    /**
         * 获取当前时间
         *
         * @return
         */
        public static String getCurrentTime() {
//            SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日  HH时mm分");
            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm");
            return sdf.format(new java.util.Date());
        }
}


  • 应用推广工具

这是 吴小龙同学大神写的,挺不错的。
public class InviteCommentUtil {
    private String mDateFormat = "yyyy-MM-dd";
    private String mInviteCommentTime;

    /**
     * 选择哪天弹邀请评论框
     */
    public void startComment(final Activity activity) {
        mInviteCommentTime = PreferenceUtils.getPreferenceString(activity, "inviteCommentTime", TimeUtil.getCurrentTime(mDateFormat));
        String saveCommentTime = PreferenceUtils.getPreferenceString(activity, "saveCommentTime", TimeUtil.getCurrentTime(mDateFormat));
          int compareDateValue = TimeUtil.compareDate(mInviteCommentTime, saveCommentTime, mDateFormat);
        if (compareDateValue == 1) {
            AlertDialog.Builder builder = new AlertDialog.Builder(
                    activity);
            int nowReadingTotal = ReadUtil.getReadedTotal();
            builder.setMessage(Html.fromHtml("您已经累计阅读<font color=#FF0000>" + nowReadingTotal + "</font>字,再接再厉哦!如果喜欢我,希望您能在应用市场给予<font color=#FF0000>五星</font>好评!"));
            builder.setTitle("求好评");
            builder.setPositiveButton("好评鼓励",
                    new android.content.DialogInterface.OnClickListener() {
                        @Override
                        public void onClick(DialogInterface dialog, int which) {
                            setComment(activity);
                            try {
                                Intent intent = new Intent(
                                        "android.intent.action.VIEW");
                                intent.setData(Uri
                                        .parse("market://details?id=com.android.xiaomolongstudio.weiyan"));
                                activity.startActivity(intent);
                                activity.overridePendingTransition(
                                        R.anim.enter_right_to_left, R.anim.exit);
                            } catch (Exception e) {
                                e.printStackTrace();
                            }

                            dialog.dismiss();
                        }
                    });
            builder.setNegativeButton("下次再说",
                    new android.content.DialogInterface.OnClickListener() {

                        @Override
                        public void onClick(DialogInterface dialog, int which) {
                            setComment(activity);
                            dialog.dismiss();
                        }
                    });
            builder.create().show();
        }
    }

    /**
     * 保存,直到下周再提示
     */
    private void setComment(Activity activity) {
        PreferenceUtils.setPreferenceString(activity, "saveCommentTime", mInviteCommentTime);
    }
}

安利一下我的项目

有能力的朋友帮忙点个star,多谢了!

魅族应用市场下载
GitHub地址

学点英语

Life is a maze and love is a riddle.
生活是座迷宫,爱情是个谜。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

_龙衣

赏杯快乐水喝喝

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值