Android开发简易版强制学习程序

  • 倒计时界面布局文件

  • 倒计时界面效果

前言

=============================================================

本学期学习了移动软件开发课程,并且自己也一直在准备考研,现在手机的诱惑过大,很多人在学习时会不自觉拿起手机,于是我便想开发一个简易版强制学习app。

代码结构

===============================================================

三个java文件和三个布局文件

在这里插入图片描述

主界面


使用intent实现界面跳转

Button Time1_btn = (Button)findViewById(R.id.time1_btn);

Time1_btn.setOnClickListener(new View.OnClickListener() {

@Override

public void onClick(View view) {

Intent intent = new Intent(MainActivity.this, time1Activity.class);

startActivity(intent);

}

});

MainActivity.java

package com.example.myapplication;

import android.app.Activity;

import android.content.Intent;

import android.os.Bundle;

import android.view.View;

import android.widget.Button;

public class MainActivity extends Activity {

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

Button Time1_btn = (Button)findViewById(R.id.time1_btn);

Time1_btn.setOnClickListener(new View.OnClickListener() {

@Override

public void onClick(View view) {

Intent intent = new Intent(MainActivity.this, time1Activity.class);

startActivity(intent);

}

});

Button Time2_btn = (Button)findViewById(R.id.time2_btn);

Time2_btn.setOnClickListener(new View.OnClickListener() {

@Override

public void onClick(View view) {

Intent intent = new Intent(MainActivity.this, time2Activity.class);

startActivity(intent);

}

});

}

}

主界面布局文件


定义了两个Buttonn和两个TextView,采用线性布局

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout

xmlns:android=“http://schemas.android.com/apk/res/android”

android:orientation=“vertical”

android:layout_width=“match_parent”

android:layout_height=“match_parent”

android:gravity=“center_horizontal”

android:padding=“15dp”>

<Button

android:layout_width=“match_parent”

android:layout_height=“wrap_content”

android:id=“@+id/time1_btn”

android:textSize=“15pt”

android:text=“@string/time1”/>

<Button

android:layout_width=“match_parent”

android:layout_height=“wrap_content”

android:id=“@+id/time2_btn”

android:textSize=“15pt”

android:text=“@string/time2”/>

<TextView

android:id=“@+id/word”

android:layout_width=“wrap_content”

android:layout_height=“wrap_content”

android:gravity=“center”

android:textSize=“15pt”

android:text=“Less interests”

/>

<TextView

android:id=“@+id/word2”

android:layout_width=“wrap_content”

android:layout_height=“wrap_content”

android:gravity=“center”

android:textSize=“15pt”

android:text=“More interest”

/>

主界面效果


在这里插入图片描述

普通计时界面


采用安卓组件Chronometer

定义Chronometer 和三个Button,开始,暂停,重新开始

Chronometer ch ;

Button start ;

Button pause ;

Button restart ;

获取

//获取计时器组件

ch = (Chronometer) findViewById(R.id.test);

//获取开始按钮

start = (Button) findViewById(R.id.start) ;

//暂停计时按钮

pause = (Button) findViewById(R.id.pause);

//继续计时按钮

restart = (Button) findViewById(R.id.go_on);

ch.setBase设置开始计时时间,ch.start启动计时器

start.setOnClickListener(new View.OnClickListener() {

@Override

public void onClick(View v) {

//设置开始计时时间

ch.setBase(SystemClock.elapsedRealtime());

//启动计时器

ch.start();

pause.setEnabled(true);

restart.setEnabled(false);

start.setEnabled(false);

}

});

ch.stop暂停按钮监听器

//暂停按钮监听器

pause.setOnClickListener(new View.OnClickListener() {

@Override

public void onClick(View v) {

start.setText(“重新开始”);

ch.stop();

start.setEnabled(true);

restart.setEnabled(true);

pause.setEnabled(false);

}

});

//暂停按钮监听器

restart.setOnClickListener(new View.OnClickListener() {

@Override

public void onClick(View v) {

start.setText(“重新开始”);

ch.start();

start.setEnabled(true);

pause.setEnabled(true);

restart.setEnabled(false);

}

});

AlertDialog退出提示框设置

//退出提示框设置

public void onDialogClick(View v){

new AlertDialog.Builder(time1Activity.this)

.setIcon(android.R.drawable.ic_dialog_alert)

.setTitle(“注意”)

.setMessage(“确定要退出本次学习吗?”)

.setPositiveButton(“确定”, new DialogInterface.OnClickListener() {

public void onClick(DialogInterface dialog, int whichButton) {

finish();//Exit Activity

}

})

.setNegativeButton(“取消”, new DialogInterface.OnClickListener() {

public void onClick(DialogInterface dialog, int whichButton) {

}

}).create().show();

}

time1Activity.java

package com.example.myapplication;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;

import android.os.SystemClock;

import android.view.View;

import android.widget.Button;

import android.widget.Chronometer;

import android.content.DialogInterface;

import androidx.appcompat.app.AlertDialog;

public class time1Activity extends AppCompatActivity {

Chronometer ch ;

Button start ;

Button pause ;

Button restart ;

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_time1);

//获取计时器组件

ch = (Chronometer) findViewById(R.id.test);

//获取开始按钮

start = (Button) findViewById(R.id.start) ;

//暂停计时按钮

pause = (Button) findViewById(R.id.pause);

//继续计时按钮

restart = (Button) findViewById(R.id.go_on);

start.setOnClickListener(new View.OnClickListener() {

@Override

public void onClick(View v) {

//设置开始计时时间

ch.setBase(SystemClock.elapsedRealtime());

//启动计时器

ch.start();

pause.setEnabled(true);

restart.setEnabled(false);

start.setEnabled(false);

}

});

//暂停按钮监听器

pause.setOnClickListener(new View.OnClickListener() {

@Override

public void onClick(View v) {

start.setText(“重新开始”);

ch.stop();

start.setEnabled(true);

restart.setEnabled(true);

pause.setEnabled(false);

}

});

//暂停按钮监听器

restart.setOnClickListener(new View.OnClickListener() {

@Override

public void onClick(View v) {

start.setText(“重新开始”);

ch.start();

start.setEnabled(true);

pause.setEnabled(true);

restart.setEnabled(false);

}

});

//为Chronomter绑定事件监听器

ch.setOnChronometerTickListener(new Chronometer.OnChronometerTickListener() {

@Override

public void onChronometerTick(Chronometer chronometer) {

//如果计时到现在超过了一小时秒

if ( SystemClock.elapsedRealtime() - ch.getBase() > 3600 * 1000) {

ch.stop();

start.setEnabled(true);

restart.setEnabled(false);

pause.setEnabled(false);

}

}

});

}

//退出提示框设置

public void onDialogClick(View v){

new AlertDialog.Builder(time1Activity.this)

.setIcon(android.R.drawable.ic_dialog_alert)

.setTitle(“注意”)

.setMessage(“确定要退出本次学习吗?”)

.setPositiveButton(“确定”, new DialogInterface.OnClickListener() {

public void onClick(DialogInterface dialog, int whichButton) {

finish();//Exit Activity

}

})

.setNegativeButton(“取消”, new DialogInterface.OnClickListener() {

public void onClick(DialogInterface dialog, int whichButton) {

}

}).create().show();

}

}

普通计时界面布局文件


采用线性布局

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout xmlns:android=“http://schemas.android.com/apk/res/android”

xmlns:app=“http://schemas.android.com/apk/res-auto”

xmlns:tools=“http://schemas.android.com/tools”

android:layout_width=“match_parent”

android:layout_height=“match_parent”

tools:context=“.time1Activity”

android:orientation=“vertical”

android:gravity=“center_horizontal”>

<Chronometer

android:id=“@+id/test”

android:textSize=“25pt”

android:layout_width=“wrap_content”

android:layout_height=“wrap_content” />

<LinearLayout

android:layout_width=“match_parent”

android:layout_height=“wrap_content”

android:orientation=“horizontal”>

<Button

android:id=“@+id/start”

android:layout_width=“wrap_content”

android:layout_height=“wrap_content”

android:textSize=“15pt”

android:text=“开始”

android:layout_weight=“1”/>

<Button

android:id=“@+id/pause”

android:layout_width=“wrap_content”

android:layout_height=“wrap_content”

android:textSize=“15pt”

android:text=“暂停”

android:layout_weight=“1”/>

<Button

android:id=“@+id/go_on”

android:layout_width=“wrap_content”

android:layout_height=“wrap_content”

android:textSize=“15pt”

android:text=“继续”

android:layout_weight=“1”/>

<Button

android:id=“@+id/btn1”

android:layout_width=“wrap_content”

android:layout_height=“wrap_content”

android:gravity=“center”

android:textSize=“15pt”

android:text=“退出学习”

android:onClick=“onDialogClick”/>

<TextView

android:id=“@+id/word”

android:layout_width=“wrap_content”

android:layout_height=“wrap_content”

android:gravity=“center”

android:textSize=“15pt”

android:text=“积跬步以至千里”

/>

<TextView

android:id=“@+id/word2”

android:layout_width=“wrap_content”

android:layout_height=“wrap_content”

android:gravity=“center”

android:textSize=“15pt”

android:text=“积怠情以致深渊”

/>

普通计时界面效果


在这里插入图片描述

开始

在这里插入图片描述

暂停

在这里插入图片描述

继续

在这里插入图片描述

退出学习

在这里插入图片描述

倒计时界面


方法解释见代码注释

time2Activity.java

package com.example.myapplication;

import androidx.appcompat.app.AlertDialog;

import androidx.appcompat.app.AppCompatActivity;

import android.content.DialogInterface;

import android.os.Bundle;

import java.util.Timer;

import java.util.TimerTask;

//import android.app.Activity;

import android.os.Bundle;

import android.os.Handler;

import android.os.Message;

import android.view.View;

import android.view.View.OnClickListener;

import android.widget.Button;

import android.widget.EditText;

import android.widget.TextView;

public class time2Activity extends AppCompatActivity implements OnClickListener{

private EditText inputet;//输入时间

private Button getTime;//得到输入的时间

private Button startTime;//点击开始自动减少时间的按钮

private Button stopTime;//点击开始停止自动减少时间的按钮

private TextView time;//当前时间

private int i = 0;

private Timer timer = null;//计时器

private TimerTask timerTask = null;

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_time2);

initviews();//初始化视图

setOnclick();//设置视图的点击监听

}

private void setOnclick() {

getTime.setOnClickListener(this);

startTime.setOnClickListener(this);

stopTime.setOnClickListener(this);

}

private void initviews() {

inputet = (EditText) findViewById(R.id.inputtime);

getTime = (Button) findViewById(R.id.gettime);

startTime = (Button) findViewById(R.id.starttime);

stopTime = (Button) findViewById(R.id.stoptime);

time = (TextView) findViewById(R.id.time);

}

@Override

public void onClick(View v) {

switch (v.getId()) {

case R.id.gettime:

time.setText(inputet.getText().toString());//当前时间

i = Integer.parseInt(inputet.getText().toString());//当前输入时间

break;

case R.id.starttime://开始自动减时

startTime();

break;

case R.id.stoptime://停止自动减时

stopTime();

break;

}

}

private Handler mHandler = new Handler(){

public void handleMessage(android.os.Message msg) {

time.setText(msg.arg1+“”);

startTime();

};

};

/**

  • 开始自动减时

*/

private void startTime() {

if(timer==null){

timer = new Timer();

}

timerTask = new TimerTask() {

@Override

public void run() {

i–;//自动减1

Message message = Message.obtain();

message.arg1=i;

mHandler.sendMessage(message);//发送消息

}

};

timer.schedule(timerTask, 1000);//1000ms执行一次

}

/**

  • 停止自动减时

*/

private void stopTime() {

if(timer!=null)

timer.cancel();

}

//退出提示框设置

public void onDialogClick(View v){

new AlertDialog.Builder(time2Activity.this)

.setIcon(android.R.drawable.ic_dialog_alert)

.setTitle(“注意”)

.setMessage(“确定要退出本次学习吗?”)

.setPositiveButton(“确定”, new DialogInterface.OnClickListener() {

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
一位练习时长两年半的安卓练习生根据鸿神提供的WanAndroid开放Api来制作的产品级App,基本实现了所有的功能,采用Kotlin语言,基于Material Design AndroidX MVP RxJava Retrofit等优秀的开源框架开发,注释超详细,方便大家练手如果你觉得做的还可以对你有帮助,容我卑微地向你要个star,有任何问题或建议,欢迎提交issues前言前段时间学习了 Kotlin ,就打算写一个项目来练练手刷刷熟练度,因为经常逛鸿神的WanAndroid网站,觉得很不错,Api也很丰富健全, 虽然根据WanAndroidAPi开发出的app多如牛毛,有诸多优秀的app,但是每个人的喜好与审美不一样,所以都没有做到我心目中的最完美,于是我就想做一个自己觉得最满意的app。界面的话参考了很多的app风格,根据自己的搭配实现,感觉还不错吧实现的功能首页五大模块:首页 / 项目 / 体系/ 公众号 / 我的登录注册功能导航功能搜索功能 热门搜索推荐 搜索历史记录积分功能 积分排行 积分获取记录收藏功能 收藏文章 收藏网址待办清单 添加清单 编辑清单 删除清单文章网址详情 详情中收藏 分享 浏览器打开全局修改应用主题色全局修改列表的加载动画侧滑返回 可打开与关闭文章在任何地方收藏与取消,其他界面相对应的数据也会变化布局优化,大量使用ConstraintLayout集成Bugly收集bug并实现App更新APP下载GitHub下载fir.im下载扫码应用截图    主要开源框架一个在 Java VM 上使用可观测的序列来组成异步的、基于事件的程序的框架-RxJava2一个依赖注入框架-Dagger2处理网络请求的框架-Okhttp一个基于OKHttp封装的网络加载框架-Retrofit转换json数据的官方框架-GsonAndroid的事件发布-Eventbus项目核心库MVP框架-MVPArms屏幕适配AndroidAutoSize一个美丽的、流体和可扩展的对话框-Material-dialogs一个强大的Fragment管理库-Fragmentation一个增强BottomNavigationView的安卓库-BottomNavigationViewEx强大、可定制、易扩展的 ViewPager 指示器框架-MagicIndicator一个强大的轮播库-BGABanner-Android一个强大并且灵活的RecyclerViewAdapter-BaseRecyclerViewAdapterHelperRecyclerView侧滑菜单,Item拖拽,滑动删除Item,自动加载更多,HeaderView,FooterView,Item分组黏贴-SwipeRecyclerView揭示效果布局-RevealLayout优雅地处理加载中,重试,无数据-Loadsir基于Android WebView的一个强大的库-AgentwebAndroid流式布局-FlowLayout基于mmap内存映射的移动端通用 key-value 组件-MMKV侧滑返回-SmartSwipe全局捕捉异常防止崩溃-CustomActivityOnCrash素材来源阿里巴巴矢量图标库借鉴了花瓣的登录页goweii项目中的App图标特别感谢感谢鸿神的WanAndroid网站提供的开放API,我在issues提了一些自己的需求,鸿神也耐心的帮忙添加了,谢谢

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值