android 日历开发附源码(附源码)

2023-11-01

这里主要记录一下在编写日历apk过程中一些主要的点:先看下效果图

一、主要功能

  • 1、支持农历、节气、常用节假日
  • 2、使用数据库,设置计划

二、基本结构

我们要实现的日历控件采用GestureDetector构造器,使用OnGestureListener监听滑动。目前我们设定日历左右滑动为月份切换的操作,每一个月份显示通过GridView实现,里面的数据是通过构造CalendarView,将其绑定到GridView。每次左右滑动,都会刷新CalendarView。布局上,会在GridView上显示当前日期农历时间。

三、主要代码及解析

CalendarActivity.java


/**
 * 日历显示activity
 *
 * @author 孔乙己大叔
 */
public class CalendarActivity extends Activity implements OnGestureListener {


    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        gestureDetector = new GestureDetector(this, this);
        flipper = (ViewFlipper) findViewById(R.id.flipper);
        flipper.removeAllViews();
        calV = new CalendarView(this, getResources(), jumpMonth, jumpYear, year_c, month_c, day_c);
        addGridView();
        gridView.setAdapter(calV);
        flipper.addView(gridView, 0);
        topText = (BorderText) findViewById(R.id.toptext);
        addTextToTopTextView(topText);
    }

    @Override
    public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
        int gvFlag = 0;         //每次添加gridview到viewflipper中时给的标记
        if (e1.getX() - e2.getX() > 120) {
            //像左滑动
            addGridView();   //添加一个gridView
            jumpMonth++;     //下一个月
            calV = new CalendarView(this, getResources(), jumpMonth, jumpYear, year_c, month_c, day_c);
            gridView.setAdapter(calV);
            addTextToTopTextView(topText);
            gvFlag++;
            flipper.addView(gridView, gvFlag);
            this.flipper.setInAnimation(AnimationUtils.loadAnimation(this, R.anim.push_left_in));
            this.flipper.setOutAnimation(AnimationUtils.loadAnimation(this, R.anim.push_left_out));
            this.flipper.showNext();
            flipper.removeViewAt(0);
            return true;
        } else if (e1.getX() - e2.getX() < -120) {
            //向右滑动
            addGridView();   //添加一个gridView
            jumpMonth--;     //上一个月

            calV = new CalendarView(this, getResources(), jumpMonth, jumpYear, year_c, month_c, day_c);
            gridView.setAdapter(calV);
            gvFlag++;
            addTextToTopTextView(topText);
            //flipper.addView(gridView);
            flipper.addView(gridView, gvFlag);
            this.flipper.setInAnimation(AnimationUtils.loadAnimation(this, R.anim.push_right_in));
            this.flipper.setOutAnimation(AnimationUtils.loadAnimation(this, R.anim.push_right_out));
            this.flipper.showPrevious();
            flipper.removeViewAt(0);
            return true;
        }
        return false;
    }

    /**
     * 创建菜单
     */
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        menu.add(0, menu.FIRST, menu.FIRST, "今天");
        menu.add(0, menu.FIRST + 1, menu.FIRST + 1, "跳转");
        menu.add(0, menu.FIRST + 2, menu.FIRST + 2, "日程");
        menu.add(0, menu.FIRST + 3, menu.FIRST + 3, "日期转换");
        return super.onCreateOptionsMenu(menu);
    }

    /**
     * 选择菜单
     */
    @Override
    public boolean onMenuItemSelected(int featureId, MenuItem item) {
        switch (item.getItemId()) {
            case Menu.FIRST:
                //跳转到今天
                int xMonth = jumpMonth;
                int xYear = jumpYear;
                int gvFlag = 0;
                jumpMonth = 0;
                jumpYear = 0;
                addGridView();   //添加一个gridView
                year_c = Integer.parseInt(currentDate.split("-")[0]);
                month_c = Integer.parseInt(currentDate.split("-")[1]);
                day_c = Integer.parseInt(currentDate.split("-")[2]);
                calV = new CalendarView(this, getResources(), jumpMonth, jumpYear, year_c, month_c, day_c);
                gridView.setAdapter(calV);
                addTextToTopTextView(topText);
                gvFlag++;
                flipper.addView(gridView, gvFlag);
                if (xMonth == 0 && xYear == 0) {
                    //nothing to do
                } else if ((xYear == 0 && xMonth > 0) || xYear > 0) {
                    this.flipper.setInAnimation(AnimationUtils.loadAnimation(this, R.anim.push_left_in));
                    this.flipper.setOutAnimation(AnimationUtils.loadAnimation(this, R.anim.push_left_out));
                    this.flipper.showNext();
                } else {
                    this.flipper.setInAnimation(AnimationUtils.loadAnimation(this, R.anim.push_right_in));
                    this.flipper.setOutAnimation(AnimationUtils.loadAnimation(this, R.anim.push_right_out));
                    this.flipper.showPrevious();
                }
                flipper.removeViewAt(0);
                break;
            case Menu.FIRST + 1:

                new DatePickerDialog(this, new OnDateSetListener() {

                    @Override
                    public void onDateSet(DatePicker view, int year, int monthOfYear,
                                          int dayOfMonth) {
                        //1901-1-1 ----> 2049-12-31
                        if (year < 1901 || year > 2049) {
                            //不在查询范围内
                            new AlertDialog.Builder(CalendarActivity.this).setTitle("错误日期").setMessage("跳转日期范围(1901/1/1-2049/12/31)").setPositiveButton("确认", null).show();
                        } else {
                            int gvFlag = 0;
                            addGridView();   //添加一个gridView
                            calV = new CalendarView(CalendarActivity.this, CalendarActivity.this.getResources(), year, monthOfYear + 1, dayOfMonth);
                            gridView.setAdapter(calV);
                            addTextToTopTextView(topText);
                            gvFlag++;
                            flipper.addView(gridView, gvFlag);
                            if (year == year_c && monthOfYear + 1 == month_c) {
                                //nothing to do
                            }
                            if ((year == year_c && monthOfYear + 1 > month_c) || year > year_c) {
                                CalendarActivity.this.flipper.setInAnimation(AnimationUtils.loadAnimation(CalendarActivity.this, R.anim.push_left_in));
                                CalendarActivity.this.flipper.setOutAnimation(AnimationUtils.loadAnimation(CalendarActivity.this, R.anim.push_left_out));
                                CalendarActivity.this.flipper.showNext();
                            } else {
                                CalendarActivity.this.flipper.setInAnimation(AnimationUtils.loadAnimation(CalendarActivity.this, R.anim.push_right_in));
                                CalendarActivity.this.flipper.setOutAnimation(AnimationUtils.loadAnimation(CalendarActivity.this, R.anim.push_right_out));
                                CalendarActivity.this.flipper.showPrevious();
                            }
                            flipper.removeViewAt(0);
                            //跳转之后将跳转之后的日期设置为当期日期
                            year_c = year;
                            month_c = monthOfYear + 1;
                            day_c = dayOfMonth;
                            jumpMonth = 0;
                            jumpYear = 0;
                        }
                    }
                }, year_c, month_c - 1, day_c).show();
                break;
            case Menu.FIRST + 2:
                Intent intent = new Intent();
                intent.setClass(CalendarActivity.this, ScheduleAll.class);
                startActivity(intent);
                break;
            case Menu.FIRST + 3:
                Intent intent1 = new Intent();
                intent1.setClass(CalendarActivity.this, CalendarConvert.class);
                intent1.putExtra("date", new int[]{year_c, month_c, day_c});
                startActivity(intent1);
                break;
        }
        return super.onMenuItemSelected(featureId, item);
    }

    

    //添加头部的年份 闰哪月等信息
    public void addTextToTopTextView(TextView view) {
        StringBuffer textDate = new StringBuffer();
        view.setBackgroundResource(R.drawable.top_day);
        view.setBackground(getResources().getDrawable(R.drawable.top_day));
        textDate.append(calV.getShowYear()).append("年").append(calV.getShowMonth()).append("月").append("\t");
        if (!calV.getLeapMonth().equals("") && calV.getLeapMonth() != null) {
            textDate.append("闰").append(calV.getLeapMonth()).append("月").append("\t");
        }
        textDate.append(calV.getAnimalsYear()).append("年").append("(").append(calV.getCyclical()).append("年)");
        view.setText(textDate);
        view.setTextColor(Color.BLACK);
        view.setTypeface(Typeface.DEFAULT_BOLD);
    }

    //添加gridview
    private void addGridView() {
        LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(
                LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT);

        DisplayMetrics displayMetrics = new DisplayMetrics();
        getWindowManager().getDefaultDisplay().getMetrics(displayMetrics);
        int Width = displayMetrics.widthPixels;
        int Height = displayMetrics.heightPixels;
        gridView = new GridView(this);
        gridView.setNumColumns(7);
        gridView.setColumnWidth(46);

        if (Width == 480 && Height == 800) {
            gridView.setColumnWidth(69);
        }
        gridView.setGravity(Gravity.CENTER_VERTICAL);
        gridView.setSelector(new ColorDrawable(Color.TRANSPARENT)); // 去除gridView边框
        gridView.setVerticalSpacing(1);
        gridView.setHorizontalSpacing(1);
        gridView.setBackgroundResource(R.drawable.gridview_bk);
        gridView.setOnTouchListener(new OnTouchListener() {
            //将gridview中的触摸事件回传给gestureDetector
            @Override
            public boolean onTouch(View v, MotionEvent event) {
                // TODO Auto-generated method stub
                return CalendarActivity.this.gestureDetector
                        .onTouchEvent(event);
            }
        });

        gridView.setOnItemClickListener(new OnItemClickListener() {
            //gridView中的每一个item的点击事件
            @Override
            public void onItemClick(AdapterView<?> arg0, View arg1, int position,
                                    long arg3) {
                //点击任何一个item,得到这个item的日期(排除点击的是周日到周六(点击不响应))
                int startPosition = calV.getStartPositon();
                int endPosition = calV.getEndPosition();
                if (startPosition <= position && position <= endPosition) {
                    String scheduleDay = calV.getDateByClickItem(position).split("\\.")[0];  //这一天的阳历
                    String scheduleYear = calV.getShowYear();
                    String scheduleMonth = calV.getShowMonth();
                    String week = "";

                    //通过日期查询这一天是否被标记,如果标记了日程就查询出这天的所有日程信息
                    String[] scheduleIDs = dao.getScheduleByTagDate(Integer.parseInt(scheduleYear), Integer.parseInt(scheduleMonth), Integer.parseInt(scheduleDay));
                    if (scheduleIDs != null && scheduleIDs.length > 0) {
                        //跳转到显示这一天的所有日程信息界面
                        Intent intent = new Intent();
                        intent.setClass(CalendarActivity.this, ScheduleInfoView.class);
                        intent.putExtra("scheduleID", scheduleIDs);
                        startActivity(intent);
                    } else {
                        //直接跳转到需要添加日程的界面

                        //得到这一天是星期几
                        switch (position % 7) {
                            case 0:
                                week = "星期日";
                                break;
                            case 1:
                                week = "星期一";
                                break;
                            case 2:
                                week = "星期二";
                                break;
                            case 3:
                                week = "星期三";
                                break;
                            case 4:
                                week = "星期四";
                                break;
                            case 5:
                                week = "星期五";
                                break;
                            case 6:
                                week = "星期六";
                                break;
                        }

                        ArrayList<String> scheduleDate = new ArrayList<String>();
                        scheduleDate.add(scheduleYear);
                        scheduleDate.add(scheduleMonth);
                        scheduleDate.add(scheduleDay);
                        scheduleDate.add(week);
                        //scheduleDate.add(scheduleLunarDay);

                        Intent intent = new Intent();
                        intent.putStringArrayListExtra("scheduleDate", scheduleDate);
                        intent.setClass(CalendarActivity.this, ScheduleView.class);
                        startActivity(intent);
                    }
                }
            }
        });
        gridView.setLayoutParams(params);
    }
}

自定义view实现:



/**
 * 日历gridview中的每一个item显示的textview
 *
 * @author 孔乙己大叔
 */
public class CalendarView extends BaseAdapter {


    public CalendarView(Context context, Resources rs, int jumpMonth, int jumpYear, int year_c, int month_c, int day_c) {
        this();
        this.context = context;
        sc = new SpecialCalendar();
        lc = new LunarCalendar();
        this.res = rs;

        int stepYear = year_c + jumpYear;
        int stepMonth = month_c + jumpMonth;
        if (stepMonth > 0) {
            //往下一个月滑动
            if (stepMonth % 12 == 0) {
                stepYear = year_c + stepMonth / 12 - 1;
                stepMonth = 12;
            } else {
                stepYear = year_c + stepMonth / 12;
                stepMonth = stepMonth % 12;
            }
        } else {
            //往上一个月滑动
            stepYear = year_c - 1 + stepMonth / 12;
            stepMonth = stepMonth % 12 + 12;
            if (stepMonth % 12 == 0) {

            }
        }
        currentYear = String.valueOf(stepYear);;  //得到当前的年份
        currentMonth = String.valueOf(stepMonth);  //得到本月 (jumpMonth为滑动的次数,每滑动一次就增加一月或减一月)
        currentDay = String.valueOf(day_c);  //得到当前日期是哪天
        getCalendar(Integer.parseInt(currentYear), Integer.parseInt(currentMonth));
    }

    public CalendarView(Context context, Resources rs, int year, int month, int day) {
        this();
        this.context = context;
        sc = new SpecialCalendar();
        lc = new LunarCalendar();
        this.res = rs;
        currentYear = String.valueOf(year);
        ;  //得到跳转到的年份
        currentMonth = String.valueOf(month);  //得到跳转到的月份
        currentDay = String.valueOf(day);  //得到跳转到的天

        getCalendar(Integer.parseInt(currentYear), Integer.parseInt(currentMonth));

    }

    @Override
    public int getCount() {
        // TODO Auto-generated method stub
        return dayNumber.length;
    }

    @Override
    public Object getItem(int position) {
        // TODO Auto-generated method stub
        return position;
    }

    @Override
    public long getItemId(int position) {
        // TODO Auto-generated method stub
        return position;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {

        if (convertView == null) {
            convertView = LayoutInflater.from(context).inflate(R.layout.calendar, null);
        }
        TextView textView = (TextView) convertView.findViewById(R.id.tvtext);
        String d = dayNumber[position].split("\\.")[0];
        String dv = dayNumber[position].split("\\.")[1];
        //Typeface typeface = Typeface.createFromAsset(context.getAssets(), "fonts/Helvetica.ttf");
        //textView.setTypeface(typeface);
        SpannableString sp = new SpannableString(d + "\n" + dv);
        sp.setSpan(new StyleSpan(android.graphics.Typeface.BOLD), 0, d.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
        sp.setSpan(new RelativeSizeSpan(1.2f), 0, d.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
        if (dv != null || dv != "") {
            sp.setSpan(new RelativeSizeSpan(0.75f), d.length() + 1, dayNumber[position].length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
        }
        //sp.setSpan(new ForegroundColorSpan(Color.MAGENTA), 14, 16, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE)
        textView.setText(sp);
        textView.setTextColor(Color.GRAY);
        if (position < 7) {
            //设置周
            textView.setTextColor(Color.BLACK);
            textView.setBackgroundResource(R.drawable.week_top);
        }

        if (position < daysOfMonth + dayOfWeek + 7 && position >= dayOfWeek + 7) {
            // 当前月信息显示
            textView.setTextColor(Color.BLACK);// 当月字体设黑
            drawable = res.getDrawable(R.drawable.item);
            //textView.setBackgroundDrawable(drawable);
            //textView.setBackgroundColor(Color.WHITE);

        }
        if (schDateTagFlag != null && schDateTagFlag.length > 0) {
            for (int i = 0; i < schDateTagFlag.length; i++) {
                if (schDateTagFlag[i] == position) {
                    //设置日程标记背景
                    textView.setBackgroundResource(R.drawable.mark);
                }
            }
        }
        if (currentFlag == position) {
            //设置当天的背景
            textView.setBackgroundResource(R.drawable.current_day_bgc);
            textView.setTextColor(Color.WHITE);
        }
        return convertView;
    }

    //得到某年的某月的天数且这月的第一天是星期几
    public void getCalendar(int year, int month) {
        isLeapyear = sc.isLeapYear(year);              //是否为闰年
        daysOfMonth = sc.getDaysOfMonth(isLeapyear, month);  //某月的总天数
        dayOfWeek = sc.getWeekdayOfMonth(year, month);      //某月第一天为星期几
        lastDaysOfMonth = sc.getDaysOfMonth(isLeapyear, month - 1);  //上一个月的总天数
        Log.d("DAY", isLeapyear + " ======  " + daysOfMonth + "  ============  " + dayOfWeek + "  =========   " + lastDaysOfMonth);
        getweek(year, month);
    }

    //将一个月中的每一天的值添加入数组dayNuber中
    private void getweek(int year, int month) {
        int j = 1;
        int flag = 0;
        String lunarDay = "";
        //得到当前月的所有日程日期(这些日期需要标记)
        dao = new ScheduleDAO(context);
        ArrayList<ScheduleDateTag> dateTagList = dao.getTagDate(year, month);
        if (dateTagList != null && dateTagList.size() > 0) {
            schDateTagFlag = new int[dateTagList.size()];
        }
        for (int i = 0; i < dayNumber.length; i++) {
            // 周一
            if (i < 7) {
                dayNumber[i] = week[i] + "." + " ";
            } else if (i < dayOfWeek + 7) {  //前一个月
                int temp = lastDaysOfMonth - dayOfWeek + 1 - 7;
                lunarDay = lc.getLunarDate(year, month - 1, temp + i, false);
                dayNumber[i] = (temp + i) + "." + lunarDay;
            } else if (i < daysOfMonth + dayOfWeek + 7) {   //本月
                String day = String.valueOf(i - dayOfWeek + 1 - 7);   //得到的日期
                lunarDay = lc.getLunarDate(year, month, i - dayOfWeek + 1 - 7, false);
                dayNumber[i] = i - dayOfWeek + 1 - 7 + "." + lunarDay;
                //对于当前月才去标记当前日期
                if (sys_year.equals(String.valueOf(year)) && sys_month.equals(String.valueOf(month)) && sys_day.equals(day)) {
                    //笔记当前日期
                    currentFlag = i;
                }
                //标记日程日期
                if (dateTagList != null && dateTagList.size() > 0) {
                    for (int m = 0; m < dateTagList.size(); m++) {
                        ScheduleDateTag dateTag = dateTagList.get(m);
                        int matchYear = dateTag.getYear();
                        int matchMonth = dateTag.getMonth();
                        int matchDay = dateTag.getDay();
                        if (matchYear == year && matchMonth == month && matchDay == Integer.parseInt(day)) {
                            schDateTagFlag[flag] = i;
                            flag++;
                        }
                    }
                }
                setShowYear(String.valueOf(year));
                setShowMonth(String.valueOf(month));
                setAnimalsYear(lc.animalsYear(year));
                setLeapMonth(lc.leapMonth == 0 ? "" : String.valueOf(lc.leapMonth));
                setCyclical(lc.cyclical(year));
            } else {   //下一个月
                lunarDay = lc.getLunarDate(year, month + 1, j, false);
                dayNumber[i] = j + "." + lunarDay;
                j++;
            }
        }
        String abc = "";
        for (int i = 0; i < dayNumber.length; i++) {
            abc = abc + dayNumber[i] + ":";
        }
        Log.d("DAYNUMBER", abc);
    }
  
}

判断是否为闰年,当月多少天数,当天是星期几代码实现:

// 判断是否为闰年
    public boolean isLeapYear(int year) {
        if (year % 100 == 0 && year % 400 == 0) {
            return true;
        } else if (year % 100 != 0 && year % 4 == 0) {
            return true;
        }
        return false;
    }

    //得到某月有多少天数
    public int getDaysOfMonth(boolean isLeapyear, int month) {
        switch (month) {
            case 1:
            case 3:
            case 5:
            case 7:
            case 8:
            case 10:
            case 12:
                daysOfMonth = 31;
                break;
            case 4:
            case 6:
            case 9:
            case 11:
                daysOfMonth = 30;
                break;
            case 2:
                if (isLeapyear) {
                    daysOfMonth = 29;
                } else {
                    daysOfMonth = 28;
                }
        }
        return daysOfMonth;
    }

    //指定某年中的某月的第一天是星期几
    public int getWeekdayOfMonth(int year, int month) {
        Calendar cal = Calendar.getInstance();
        cal.set(year, month - 1, 1);
        dayOfWeek = cal.get(Calendar.DAY_OF_WEEK) - 1;
        return dayOfWeek;
    }

四、小结

这里我们只介绍了日历的基本实现原理,和一些关键的点,其实这种实现方式相对还是比较简单的,容易理解,当然难免有不足的地方,后边根据需要再逐步完善和扩展吧。数据库操作暂时没进行解析,后面会单独用demo说明。

源码下载地址:https://download.csdn.net/download/Ctrl_qun/12436629

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

android 日历开发附源码(附源码) 的相关文章

  • 在phonegap中播放本地声音

    我有一个 wav文件在我的www文件夹 我正在使用 jQuery 和以下代码 警报响起 但声音不播放 难道我做错了什么
  • APK META-INF/library_release.kotlin_module 中复制的重复文件

    我最近通过 JitPack 添加了两个 Android 库 但出现以下错误 Duplicate files copied in APK META INF library release kotlin module 我已经清除了缓存 并尝试使
  • 更改首选项的背景颜色

    我有一个PreferenceCategory xml 文件 我已经在其中定义了所有首选项 我从扩展的类中调用它PreferenceActivity 我无法设置设置屏幕的背景 该屏幕是在如下所示的 xml 文件的帮助下显示的 请看我已经定义了
  • 更改操作栏标题文本颜色

    我正在尝试更改 ActionBar 中标题文本的颜色 但我似乎无法让它工作 这是我尝试使用的风格 在我的应用程序主题中我使用titleTextStyle
  • 任务“:app:checkReleaseDuplicateClasses”执行失败

    我的 React Native Android 构建中突然出现构建问题 令人惊讶的是 它是早上建好的 没有做任何改变 但突然就失败了 这就是我得到的错误 知道为什么会发生这种情况吗 在 stack 和 GitHub 中也看到了一些类似的问题
  • 从Asynctask返回结果

    如果我的 Android 应用程序中有这个后台工作文件 并且它从我的数据库获取数据 我如何将字符串 结果 传递给另一个类 后台工作人员连接到我的服务器 然后使用 php 连接到数据库 public class BackgroundWorke
  • 用于代码生成的 ANTLR 工具版本 4.7.1 与当前运行时版本 4.5.3 不匹配

    我正在开发一个 Android 应用程序 当前使用 DSL 和一些库 突然构建给了我这个错误 任务 app kaptDebugKotlin 失败 用于代码生成的 ANTLR 工具版本 4 7 1 与当前运行时版本 4 5 3 不匹配 用于解
  • 如何知道点击的widget id?

    我已经实施了一个widget与ImageButton and a TextView That ImageButton启动一个activity当它被点击时 这activity使用用户在活动上写入的内容更新小部件文本EditText 现在的问题
  • 如何从debug.keystore文件获取MD5?

    我使用一些命令来获取 MD5 私钥debug keystore文件 但实际上我得到的是 SHA1 私钥而不是 MD5 我不知道如何获得MD5 这是我使用的命令 keytool list alias androiddebugkey keyst
  • 如何在不改变的情况下将字符串转换为字节?

    我需要一个解决方案将字符串转换为字节数组而不需要像这样进行更改 Input String s Test Output String s Test byte b Test 当我使用 s getBytes 那么回复是 B 428b76b8 但我
  • MAT(Eclipse 内存分析器)- 如何从内存转储中查看位图

    I m analyzing memory usage of my Android app with help of Eclipse Memory Analyzer http www eclipse org mat also known as
  • Android 依赖项:apklib 与 aar 文件

    据我了解 apklib包含代码 共享资源Maven aar文件由以下人员分发Gradle The aar与 apklib 的主要区别在于 类被编译并包含在 aar 根目录下的classes jar 中 然而apklib不能包含已编译的类文件
  • 使用startActivityForResult,如何获取子活动中的requestCode?

    我有四项活动 即 A B C 和 D 我的情况是A将通过startActivityForResult启动活动B startActivityForResult new Intent this B class ONE 在另一种情况下 我将使用不
  • NoClassDefFoundError:com.google.firebase.FirebaseOptions

    我继续得到NoClassDefFoundError在我正在使用的其他测试设备 4 4 2 上 但在我的测试设备 Android 5 1 上运行良好 我尝试了用谷歌搜索的解决方案 但似乎没有任何效果 我正在使用 Firebase 实时数据库
  • Android 将菜单项在操作栏中向左对齐

    我的应用程序中有一个操作栏 它显示我定义的菜单项res menu activity main xml 我的菜单项在操作栏上向右对齐 我希望它们左对齐 我为此找到的唯一解决方案使用了自定义操作栏 如下所示 将菜单项放置在 Honeycomb
  • Android 视图和视图组

    在安卓中ViewGroup继承自View A ViewGroup是一个容器 里面装有Views ViewGroup LinearLayout View TextView 为什么 Android 的人们将这种关系定义为Inheritance而
  • Exif 方向标签返回 0

    我正在开发一个自定义相机应用程序 我面临以下问题 当我尝试使用检索方向时ExifInterface 它总是返回 0 ORIENTATION UNDEFINED 这使我无法将图像旋转到正确的状态 从而无法正确显示 我使用示例代码来设置相机旋转
  • 如何用 XML 制作双渐变(类似 iphone)

    如何使用 XML 制作这种可绘制渐变 我可以做一个从颜色 A 到颜色 B 的简单渐变 但我不知道如何在同一个可绘制对象中组合两个渐变 我终于找到了一个带有图层列表的解决方案 这对我来说已经足够好了
  • 如何手动添加Android Studio依赖

    我多次尝试向我的项目添加依赖项 但每次都会出现错误 我想添加它们的依赖项是 de hdodenhof circleimageview 1 3 0 and com github bumptech glide glide 3 6 1 所以我想下
  • TYPE_ACCELEROMETER 和 TYPE_LINEAR_ACCELERATION 传感器有什么区别?

    I think TYPE ACCELEROMETER显示设备加速 但是 我不明白什么时候应该使用TYPE LINEAR ACCELERATION 我需要计算移动设备的速度 哪种传感器适合此应用 另外 我读到TYPE LINEAR ACCEL

随机推荐

  • 【猿人学WEB题目专解】猿人学第20题

    据说 看我文章时 关注 点赞 收藏 的 帅哥美女们 心情都会不自觉的好起来 前言 作者简介 大家好我是 user from future 意思是 来自未来的用户 寓意着未来的自己一定很棒 个人主页 点我直达 在这里肯定能找到你想要的 专栏介
  • 如何排查工程中的死代码(devops为例)

    前言 死代码 Dead Code 指的是在程序中没有被执行过或者已经不会被执行到的代码 它们可能会导致程序体积变大 影响程序的性能和可维护性 为了减少死代码的存在 我们需要在工程中进行死代码的排查和清理 本文将介绍一些排查工程中死代码的方法
  • Linux中glob()、globfree()、getcwd()函数

    Linux中glob 与globfree 函数 文章目录 一 glob 函数 二 globfree 函数 三 getcwd 函数 四 代码演示 总结 一 glob 函数 glob 函数作用 glob 函数用于文件系统中路径名称的模式匹配 函
  • 一些个人经验

    如果是运行时动态随机生成 dataset splitting training val test 而不是事先生成静态 splitting 就保存一下 splitting indices 后面可能 case study 的时候会用到 数据集足
  • 静态代码块、动态代码块、构造方法

    类与对象 类 描述事物属性和行为 属性 私有化 行为 公开化 对象 就是类的一个具体实例 代码块 静态代码块 发生在创建对象之前 时机 随着类的加载而加载 构造代码块 发生在创建对象之前 类加载之后 构造方法 创建对象 发生在构造代码块之前
  • 6.21.4upload第4关

    trim去空 deldot去点 strrchr strtolower str ireplace 上传htaccess文件再上传webshell jpg文件 更换phpstudy5 2 17版本
  • Docker 容器重命名

    命令 docker rename oldName newName 例子
  • 云计算基础——云存储技术简介

    云存储的种类及其合适的应用 可以把云存储分成块存储与文件存储两类 块存储 快速更改的单一文件系统 针对单一文件大量写的高性能计算 HPC 文件存储 文件及内容搜寻 Tier 2 NAS 多文件大量写入的应用 数据大量读写的应用 多个使用端都
  • GA遗传优化算法(附MATLAB源码)

    优化算法之遗传算法GA 遗传算法 Genetic Algorithm GA 最早是由美国的 John holland提出 主要模拟生物进化论的自然选择和遗传学机理生成计算模型 是一种通过模拟自然进化过程搜索最优解的方法 将问题的求解过程转换
  • 帆软图表下钻后,设置为数据分析模式

    在图表的特效 gt 网络报表中 添加一个op参数 值设置为 公式 view 因为参数会在URL后添加 op view
  • Javaweb开发基本项目结构

    学校里老师都没讲这个 所以浅讲一下 web项目尽量要照这种格式 方便扩展和阅读 比方说这个项目 api层 controller servlet logic层 接口层 此层可以说是最外层 也是与前端直接接触的层 它会直接使用其他层的代码处理数
  • 【Java】算术工具类,精确数学计算

    由于代码较长 可以通过 ctrl F 搜索需要的方法 package com ectit utils import java math BigDecimal author daishixing titile ArithmeticUtils
  • 项目/商务、客户与需求[ZHUAN]

    你得完全了解你所在公司的软硬件实力 明白有那些弱点和特 长 在谈判的时候你得敏锐的分析出客户的想法有那些可能会很难搞又没有多大意义 你得引导客户往本公司擅长的技术上去思考 你得引导客户 而不是只听客户 怎么说你就怎么做
  • How to Relate an SLA Directly to a Case in CRM 2016

    SLAs Service Level Agreements were introduced in Microsoft Dynamics 2013 SP1 6 1 This robust feature lets you manage res
  • Nginx学习研究-Nginx配置详解

    一 Nginx简介 Nginx 是一款轻量级的 Web 服务器 反向代理服务器 及电子邮件 IMAP POP3 代理服务器 它主要有三个作用 分别是Web服务器 反向代理 配置SSL证书 http转发到https 和负载均衡 二 Nginx
  • Qt6 添加 QOpenGLWidget 报错

    添加 QOpenGLWidget 控件后编译报错 undefined reference to imp ZN13QOpenGLWidgetC1EP7QWidget6QFlagsIN2Qt10WindowTypeEE collect2 exe
  • Qt绘图控件QCustomPlot: (一)安装及使用

    一 目录 一 介绍 二 下载及配置环境 三 建立工程 四 基础画图 一 介绍 QCustomPlot是一个Qt c 小控件 用于绘图和数据可视化 它没有其它的依赖关系 并且有很好的帮助文档 这个绘图库专注于制作好看的 高质量的2D绘图 图形
  • vue(五)组件、自定义属性props

    一 组件化开发 组件化开发指的是 根据封装的思想 把页面上可重用的 UI 结构封装为组件 从而方便项目 的开发和维护 vue 是一个支持组件化开发的前端框架 vue 中规定 组件的后缀名是 vue App vue 文件 本质上就是一个 vu
  • 竞速榜实时离线对数方案演进介绍

    一 背景 竞速榜是大促期间各采销群提供的基于京东实时销售数据的排行榜 同样应对大促流量洪峰场景 通过榜单撬动品牌在京东增加资源投入 竞速榜基于用户配置规则进行实时数据计算 榜单排名在大促期间实时变化 相关排名数据在微博 朋友圈广泛传播 相关
  • android 日历开发附源码(附源码)

    这里主要记录一下在编写日历apk过程中一些主要的点 先看下效果图 一 主要功能 1 支持农历 节气 常用节假日 2 使用数据库 设置计划 二 基本结构 我们要实现的日历控件采用GestureDetector构造器 使用OnGestureLi