Android学习之——APP番茄工作法——小结(1)
今天,我的第一个APP:番茄工作法 1.0版本终于终于终于完成了,虽然还有很多很多的不足之处,但是,终归算是告一个段落了。
第一款小应用,其中的艰辛冷暖自知,各种摸爬滚打,各种度娘谷歌。
简单讲解下其中碰到的问题:
问题一:android.support.v4.app.Fragment 包下没有PreferenceFragment的问题。
起初做的设置界面太过难看,所以打算使用谷歌力推的碎片机制,但是发现v4包下面居然没有PreferenceFragment类。然后各种搞不定。
最后在谷歌的帮助下顺利找到实现方法(花了我将近一个礼拜的时间,泪奔,新手不解释...)
https://github.com/kolavar/android-support-v4-preferencefragment
进入上面的链接下载这个library。
实现方式和android.preference.PreferenceFragment 下的方式一样,具体代码如下:
public class fragment3 extends PreferenceFragment{public static fragment3 newInstance(Bundle bundle) {fragment3 frag = new fragment3();frag.setArguments(bundle);return frag;}@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);addPreferencesFromResource(R.xml.preferences); Log.v("huahua", "fragment3-->onCreate()");}
}
SharedPreferences mySharedPreferences = getActivity().getSharedPreferences("TomatoCount",Activity.MODE_PRIVATE);//获取SharedPreferences 中的值,TomatoCount表示保存的文件名称
String dateStr = mySharedPreferences.getString("date", "2001-01-01");//获取字符串
todayTomatoCount = mySharedPreferences.getInt("todayTomatoCount", 0);//获取存储的今日番茄时间,获取int型数据,如果不存在默认设置为0
allTomatoCount = mySharedPreferences.getInt("allTomatoCount", 0);//获取存储的合计番茄时间
String dateNowString = (new SimpleDateFormat("yyyy-MM-dd", Locale.getDefault())).format(new java.util.Date());
if (!dateStr.equals(dateNowString)) {//判断存储时间是否和当前时间在同一天todayTomatoCount=0;SharedPreferences.Editor editor = mySharedPreferences.edit();editor.putInt("todayTomatoCount", todayTomatoCount);//写入数据到Editor 其中第一个参数是字段的名称,第二个参数是字段的值,该写入的是int类型editor.commit();//提交,写入到xml文件中
}
//修改字体
Typeface fontFace = Typeface.createFromAsset(getActivity().getAssets(), "fonts/Roboto-Thin.ttf");
tomatoTxtView.setTypeface(fontFace);
public class SettingPreferenceFragment extends PreferenceFragment implements OnSharedPreferenceChangeListener {ListPreference lstPre_TomatoTime_value, lstPre_BreakTime_value;public SettingPreferenceFragment() {// TODO 自动生成的构造函数存根}@Overridepublic void onCreate(Bundle paramBundle) {// TODO 自动生成的方法存根super.onCreate(paramBundle);addPreferencesFromResource(R.xml.preferences);SharedPreferences prefs=PreferenceManager.getDefaultSharedPreferences(getActivity());prefs.registerOnSharedPreferenceChangeListener(this);lstPre_TomatoTime_value=(ListPreference)findPreference("TomatoTime_value");lstPre_BreakTime_value=(ListPreference)findPreference("BreakTime_value");lstPre_TomatoTime_value.setSummary(lstPre_TomatoTime_value.getEntry());lstPre_BreakTime_value.setSummary(lstPre_BreakTime_value.getEntry());}@Overridepublic void onSharedPreferenceChanged(SharedPreferences sharedPreferences,String key) {// TODO 自动生成的方法存根if (key.equals("TomatoTime_value")) {lstPre_TomatoTime_value.setSummary(lstPre_TomatoTime_value.getEntry());}if (key.equals("BreakTime_value")) {lstPre_BreakTime_value.setSummary(lstPre_BreakTime_value.getEntry());}}@Overridepublic boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen,Preference preference) {// TODO 自动生成的方法存根if (preference.getKey().equals("clearCount")) {alertDialogShow();}if (preference.getKey().equals("aboutTomatoTask")) {Uri uri = Uri.parse("http://baike.baidu.com/link?url=b7rlhS6YssFup2xqAjnw9__6VsQnyhtVT8Gx_-qwckUE4IZ-ns6i_jw9w_aKH-C_sjWheb9NFR_GZcfUII0bV_");startActivity(new Intent(Intent.ACTION_VIEW,uri));}return false;}/*** 显示AlertDialog*/private void alertDialogShow() {new AlertDialog.Builder(getActivity()).setTitle("清除?").setMessage("是否清除计数?\n注:该操作不可逆!").setPositiveButton("清除", new DialogInterface.OnClickListener() {@Overridepublic void onClick(DialogInterface dialog, int which) {// TODO 自动生成的方法存根SharedPreferences mySharedPreferences = getActivity().getSharedPreferences("TomatoCount",Activity.MODE_PRIVATE);SharedPreferences.Editor editor = mySharedPreferences.edit();editor.putInt("todayTomatoCount", 0);editor.putInt("allTomatoCount", 0);editor.commit();Toast.makeText(getActivity(), "清除成功!", Toast.LENGTH_SHORT).show();}}).setNegativeButton("取消", new DialogInterface.OnClickListener() {@Overridepublic void onClick(DialogInterface dialog, int which) {// TODO 自动生成的方法存根}}).create().show();}
}
问题五:如何实现倒计时
private TimeCount time;
2. new 一个TimeCount, timeSpan是需要倒计时的时间(毫秒),1000是倒计时间隔,这里是一秒
time = new TimeCount(timeSpan, 1000);// 构造CountDownTimer对象
time.start();
class TimeCount extends CountDownTimer {public TimeCount(long millisInFuture, long countDownInterval) {super(millisInFuture, countDownInterval);// 参数依次为总时长,和计时的时间间隔}/*** 计时过程显示*/@Overridepublic void onTick(long millisUntilFinished) {// TODO 自动生成的方法存根}/*** 计时完毕时触发*/@Overridepublic void onFinish() {// TODO 自动生成的方法存根}
}
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {if (flag == 2) {if (keyCode == KeyEvent.KEYCODE_BACK && event.getRepeatCount() == 0) {AlertDialog.Builder alertBuilder = new AlertDialog.Builder(MainActivity.this);alertBuilder.setTitle("放弃?").setMessage("是否放弃这个番茄并退出吗?").setPositiveButton("确定",new DialogInterface.OnClickListener() {@Overridepublic void onClick(DialogInterface dialog,int which) {// TODO 自动生成的方法存根time.cancel();MainActivity.this.finish();}}).setNegativeButton("取消",new DialogInterface.OnClickListener() {@Overridepublic void onClick(DialogInterface dialog,int which) {// TODO 自动生成的方法存根dialog.cancel();}}).create();alertBuilder.show();}} else {if (keyCode == KeyEvent.KEYCODE_BACK&& event.getAction() == KeyEvent.ACTION_DOWN) {if ((System.currentTimeMillis() - exitTime) > 2000) {Toast.makeText(getApplicationContext(), "再按一次退到主界面",Toast.LENGTH_SHORT).show();exitTime = System.currentTimeMillis();} else {time.cancel();finish();System.exit(0);}return true;}return super.onKeyDown(keyCode, event);}return true;
}
问题七:震动的实现
private Vibrator vibrator;
//开启震动
vibrator =(Vibrator)getSystemService(Context.VIBRATOR_SERVICE);
long [] pattern = {200,500,200,500,1200,500,200,500}; // 停止 开启 停止 开启
vibrator.vibrate(pattern,-1); //重复两次上面的pattern 如果只想震动一次,index设为-1
问题八:重写ProgressBar,设置为圆形进度条:
package com.android.tomatotask;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.RectF;
import android.util.AttributeSet;
import android.view.View;
public class CircleProgressBar extends View {private int maxProgress = 10;//最大进度private int progress = 0;//当前进度private int progressStrokeWidth = 6;//线宽// 画圆所在的矩形区域RectF oval;Paint paint;public CircleProgressBar(Context context) {super(context);// TODO 自动生成的构造函数存根}public CircleProgressBar(Context context, AttributeSet attrs) {super(context, attrs);// TODO 自动生成的构造函数存根oval = new RectF();paint = new Paint();}public CircleProgressBar(Context context, AttributeSet attrs, int defStyle) {super(context, attrs, defStyle);// TODO 自动生成的构造函数存根}@Overrideprotected void onDraw(Canvas canvas) {super.onDraw(canvas); /*** 画最外层的大圆环*/int centre = getWidth()/2; //获取圆心的x坐标int radius = (int) (centre - progressStrokeWidth/2); //圆环的半径paint.setColor(Color.WHITE);//(roundColor); //设置圆环的颜色paint.setStyle(Paint.Style.STROKE); //设置空心paint.setStrokeWidth(progressStrokeWidth); //设置圆环的宽度paint.setAntiAlias(true); //消除锯齿 canvas.drawCircle(centre, centre, radius, paint); //画出圆环 /*** 画圆弧 ,画圆环的进度*/ //设置进度是实心还是空心paint.setStrokeWidth(progressStrokeWidth); //设置圆环的宽度paint.setColor(Color.rgb(0x57, 0x87, 0xb6)); //设置进度的颜色 RectF oval = new RectF(centre - radius, centre - radius, centre+ radius, centre + radius); //用于定义的圆弧的形状和大小的界限paint.setStyle(Paint.Style.STROKE);canvas.drawArc(oval, -90, 360 * progress / maxProgress, false, paint); //根据进度画圆弧 绘制白色圆圈,即进度条背景} public int getMaxProgress(){return maxProgress;} public void setMaxProgress(int maxProgress){this.maxProgress = maxProgress;} public void setProgress(int progress){this.progress = progress;this.invalidate();} public void setProgressNotInUiThread(int progress){this.progress = progress;this.postInvalidate();}
}
<com.android.tomatotask.CircleProgressBarandroid:id="@+id/circleProgressbar" android:layout_width="300dp"android:layout_height="300dp" android:layout_centerInParent="true" />
<android.support.v4.view.ViewPagerandroid:id="@+id/viewpage" android:layout_width="match_parent"android:layout_height="match_parent" />
问题九:Animation动画效果的实现
protected Animation animation;
// 动画资源文件
ID = new int[] { R.anim.my_alpha_action, R.anim.my_scale_action,R.anim.my_rotate_action, R.anim.alpha_scale,R.anim.alpha_rotate, R.anim.scale_rotate,R.anim.alpha_scale_rotate, R.anim.myown_design };
animation = AnimationUtils.loadAnimation(MainActivity.this,ID[randow]);//randow为随机取到0~7的数的随机数
textView.startAnimation(animation);
问题十:针对只有几个确定的数,使用 SeekBar
private class SeekBarListener implements SeekBar.OnSeekBarChangeListener {private TextView textView;private int TickStep;private int StartTick;public SeekBarListener(TextView tv, int startTick, int tickStep) {textView = tv;TickStep = tickStep;StartTick = startTick;}@Overridepublic void onProgressChanged(SeekBar seekBar, int progress,boolean fromUser) {// TODO Auto-generated method stubif (fromUser) {// ..}// 时间=process*步长+初始值// int progress=seekBar.getProgress();int curTick = progress + StartTick;int remainder = curTick % TickStep;int halfStep = TickStep % 2 == 0 ? TickStep - TickStep % 2: TickStep - TickStep % 2 + 1;if (remainder < halfStep) {curTick -= remainder;} else {curTick += (TickStep - remainder);}// seekBar.setProgress(curTick - StartTick);textView.setText(curTick + "min");}@Overridepublic void onStartTrackingTouch(SeekBar seekBar) {// TODO Auto-generated method stub}@Overridepublic void onStopTrackingTouch(SeekBar seekBar) {// TODO Auto-generated method stub// 时间=process*步长+初始值int progress = seekBar.getProgress();int curTick = progress + StartTick;int remainder = curTick % TickStep;int halfStep = TickStep % 2 == 0 ? TickStep - TickStep % 2: TickStep - TickStep % 2 + 1;if (remainder < halfStep) {curTick -= remainder;} else {curTick += (TickStep - remainder);}seekBar.setProgress(curTick - StartTick);textView.setText(curTick + "min");}
}
Android学习之——APP番茄工作法——小结(1)相关推荐
- Android学习之——APP番茄工作法——小结(2)
上一篇连接: http://blog.csdn.net/fu222cs98/article/details/21053491 继续上一篇 问题十一:在Fragment实现类中中加载资源文件的方式: 在 ...
- Android学习系列--App调试的几个命令实践
2019独角兽企业重金招聘Python工程师标准>>> 在Android的应用开发中,我们会用到各种代码调试:其实在Android的开发之后,我们可能会碰到一些随机的问题,如cpu过 ...
- Android学习系列--App缓存管理
http://www.cnblogs.com/qianxudetianxia/archive/2012/02/20/2112128.html 无论大型或小型应用,灵活的缓存可以说不仅大大减轻了服务器的 ...
- Android学习笔记——APP页面转换与Intent学习
使用Intent保证多活动之间的切换,实现APP页面转换. 同时学习Intent其他诸多功能. 认知Intent Intent是Android程序中各组件之间进行交互的一种重要方式,不仅指明当前组件想 ...
- android学习的app,Android相见恨晚的6款学习APP,每天坚持学习,提升自我
学习对每个人来说都是非常重要的,因为不停的学习不停的进步才能让自己变得更好,要知道天才都是通过努力换来的,没有人生下来就是天才,所以我们也要努力去学习.今天就给大家分享6个实用学习类的APP. 1.中 ...
- 【android学习】记录应用内存优化
图片优化(效果最明显) 过度图片的回收 原因分析: 在做冷启动时候,很多人写一个如下 <style name="MainTheme" parent="@andro ...
- 说时间不够用,CTO怒了!让我学习:GTD时间管理,番茄工作法,三八理论
来源| 技术领导力(ID:jishulingdaoli) 01 "三八理论" 你的人生,由第三个8小时决定 时间对每个人来说是公平的,我们都同样拥有24小时.然而,有人取得辉煌成就 ...
- Android学习系列(15)--App列表之游标ListView(索引ListView)
游标ListView,提供索引标签,使用户能够快速定位列表项. 也可以叫索引ListView,有的人称也为Tweaked ListView,可能更形象些吧. 一看图啥都懂了: ...
- Android学习系列(34)--App应用之发布各广告平台版本
Android的广告平台是很多的,各市场对各平台的接受程度是不一样的,Android的开发者如果想集成广告基本要考虑下面两个问题: (1)集成什么广告,会赚钱? (2)集成什么广告,不会被市场拒绝? ...
最新文章
- 如何调用AngularJS指令中定义的方法?
- C++之Lambda表达式
- uwsgi+python+flask+nginx服务器部署
- 如何在黄瓜中进行后端测试
- Java i18n - Java中的国际化
- ubuntu中flash中文乱码的问题解决
- mysql 5.1.3_1.1.1 MySQL5.5默认存储引擎的调整(3)
- 怎么创建java项目?新建java项目的步骤
- qtp 连接mysql_QTP连接mysql数据库
- vs2015安装msdn_visual studio 2015离线版msdn下载和安装
- 机器学习实战(一)xgboost实战
- 一种改进CA-CFAR算法及其MATLAB编程实现,论文仿真——《基于LFMCW雷达多目标检测的CA-CFAR改进算法》
- 色环在线计算机,多功能电子计算软件(eTools)
- 计算机大作业的范本,计算机应用基础大作业.doc
- Topcoder EllysBottles 题解
- JAXB JavaBean与Xml之间转换
- html如何写图片路径?
- 友盟社会化分享+第三方登录 2022.03.28 最新版
- 华为机考108题(c++)(101-108)
- 精品展示案例(使用jQuery)
热门文章
- 苏格拉底与失恋者的对话(教你怎么安慰失恋的朋友)
- 07uec++多人游戏【瞄准镜效果】
- ctrl+alt+t 函数注释快捷键失效KoroFileHeader
- vc2010 std::tr1 bind库捉虫记
- Python 三种读文件方法read(), readline(), readlines()及去掉换行符\n
- 研报精选230215
- EBAZ4205 ZYNQ HDMI扩展板 显示Linux桌面播放视频
- Android 之注册Facebook开发者账号
- 一个能防止改名木马漏洞的无组件上传类
- MIT6.828学习之homework2:shell