Android开发-Android常用组件-Date & Time组件

Posted 临易

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android开发-Android常用组件-Date & Time组件相关的知识,希望对你有一定的参考价值。

4.11    Date & Time组件

1.TextClock(文本时钟)

TextClock是在Android 4.2(API 17)后推出的用来替代DigitalClock的一个控件!

TextClock可以以字符串格式显示当前的日期和时间,因此推荐在Android 4.2以后使用TextClock。

这个控件推荐在24进制的android系统中使用,TextClock提供了两种不同的格式, 一种是在24 进制中显示时间和日期,另一种是在12进制中显示时间和日期。大部分人喜欢默认的设置。

另外他给我们提供了下面这些方法,对应的还有get方法:

Attribute Name

Related Method

Description

android:format12Hour

setFormat12Hour(CharSequence)

设置12时制的格式

android:format24Hour

setFormat24Hour(CharSequence)

设置24时制的格式

android:timeZone

setTimeZone(String)

设置时区

例:text_clock.xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">
    <TextClock
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:format12Hour="MM/dd/yy h:mmaa"
        tools:targetApi="jelly_bean_mr1"/>
    <TextClock
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:format12Hour="MMM dd,yyyy h:mmaa"
        tools:targetApi="jelly_bean_mr1"/>
    <TextClock
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:format12Hour="MMMM dd,yyyy h:mmaa"
        tools:targetApi="jelly_bean_mr1"/>
    <TextClock
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:format12Hour="E, MMMM dd,yyyy h:mmaa"
        tools:targetApi="jelly_bean_mr1"/>
    <TextClock
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:format12Hour="EEEE, MMMM dd,yyyy h:mmaa"
        tools:targetApi="jelly_bean_mr1"/>

    <TextClock
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:format12Hour="Noteworthy day: \'M/d/yy"
        tools:targetApi="jelly_bean_mr1"/>
    <AnalogClock
        android:layout_width="100dp"
        android:layout_height="100dp"/>

</LinearLayout>

 

MainActivity.java:

package com.example.myapplication;

import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
public class MainActivity extends AppCompatActivity  
    @Override
    protected void onCreate(Bundle savedInstanceState) 
        super.onCreate(savedInstanceState);
        setContentView(R.layout.text_clock);
    

启动测试:

 

 

 

2.AnalogClock(模拟时钟)

android:dial

表背景图片

android:hand_hour

表时针图片

android:hand_minute

分时针图片

例:

analog_clock.xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">
    <AnalogClock
        android:layout_width="100dp"
        android:layout_height="100dp"/>
    <AnalogClock
        android:layout_width="100dp"
        android:layout_height="100dp"
        android:dial="@mipmap/biao"
        android:hand_hour="@mipmap/zhizhen2"
        android:hand_minute="@mipmap/zhizhen1"/>

</LinearLayout>

 

MainActivity.java:

import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;

public class MainActivity extends AppCompatActivity 

    @Override
    protected void onCreate(Bundle savedInstanceState) 
        super.onCreate(savedInstanceState);
        setContentView(R.layout.analog_clock);

    

 

3.Chronometer(计时器)

就是一个简单的计时器

chronometer.xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".MainActivity">
<Chronometer
android:id="@+id/chronometer"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:textColor="@color/purple_500"
android:textSize="60sp"/>
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_margin="10dp"
android:orientation="horizontal">
<Button
android:id="@+id/btnStart"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="开始计时"/>

<Button
android:id="@+id/btnStop"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="停止计时"/>

<Button
android:id="@+id/btnReset"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="重置"/>

<Button
android:id="@+id/btn_format"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="格式化"/>

</LinearLayout>

</LinearLayout>

 

ChronometerActivity.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.widget.Toast;

public class ChronometerActivity extends AppCompatActivity implements View.OnClickListener, Chronometer.OnChronometerTickListener 
    private Chronometer chronometer;
    private Button btn_start,btn_stop,btn_base,btn_format;

    @Override
    protected void onCreate(Bundle savedInstanceState) 
        super.onCreate(savedInstanceState);
        setContentView(R.layout.chronometer);
        initView();
    
    private void initView()
        chronometer = (Chronometer) findViewById(R.id.chronometer);
        btn_start = (Button) findViewById(R.id.btnStart);
        btn_stop = (Button) findViewById(R.id.btnStop);
        btn_base = (Button) findViewById(R.id.btnReset);
        btn_format = (Button) findViewById(R.id.btn_format);

        chronometer.setOnChronometerTickListener(this);
        btn_start.setOnClickListener(this);
        btn_stop.setOnClickListener(this);
        btn_base.setOnClickListener(this);
        btn_format.setOnClickListener(this);
    
    @Override
    public void onClick(View v)
        switch (v.getId())
            case R.id.btnStart:
                chronometer.start();
                break;
            case R.id.btnStop:
                chronometer.stop();
                break;
            case R.id.btnReset:
                chronometer.setBase(SystemClock.elapsedRealtime());//复位
                break;
            case R.id.btn_format:
                chronometer.setFormat("Time:%s");//更改时间格式
                break;
        
    
    @Override
    public void onChronometerTick(Chronometer chronometer)
        String time = chronometer.getText().toString();
        if(time.equals("00:00"))
            Toast.makeText(ChronometerActivity.this,"时间到了~",Toast.LENGTH_LONG).show();
        
    

启动测试:

 

 

4.DatePicker(日期选择器)

android:calendarTextColor

日历列表的文本的颜色

android:calendarViewShown

是否显示日历视图

android:datePickerMode

android:datePickerMode:组件外观,可选值:spinner,calendar.前者效果如下,默认效果是后者

android:dayOfWeekBackground

顶部星期几的背景颜色

android:dayOfWeekTextAppearance

顶部星期几的文字颜色

android:endYear

去年(内容)比如2010

android:firstDayOfWeek

设置日历列表以星期几开头

android:headerBackground

整个头部的背景颜色

android:headerDayOfMonthTextAppearance

头部日期字体的颜色

android:headerMonthTextAppearance

头部月份的字体颜色

android:headerYearTextAppearance

头部年的字体颜色

android:maxDate

最大日期显示在这个日历视图mm / dd / yyyy格式

android:minDate

最小日期显示在这个日历视图mm / dd / yyyy格式

android:spinnersShown

是否显示spinner

android:startYear

设置第一年(内容),比如19940年

android:yearListItemTextAppearance

列表的文本出现在列表中

android:yearListSelectorColor

年列表选择的颜色

 date_packer.xml:

<?xml version="1.0" encoding="utf-8"?>
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context=".DataPickerActivity">
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical">

        <DatePicker
            android:id="@+id/date_picker"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:calendarTextColor="@color/purple_500"
            android:datePickerMode="calendar"/>

    </LinearLayout>

</ScrollView>

 

DatePackerActivity.java:

package com.example.myapplication;

import android.content.Context;
import android.os.Bundle;
import android.widget.DatePicker;
import android.widget.Toast;

import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;

import java.util.Calendar;

public class DataPickerActivity extends AppCompatActivity implements DatePicker.OnDateChangedListener
    private Context mContext;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) 
        super.onCreate(savedInstanceState);
        setContentView(R.layout.data_picker);
        mContext = this;
        //日期选择器
        DatePicker datePicker = (DatePicker) findViewById(R.id.date_picker);
        Calendar calendar = Calendar.getInstance();
        int year = calendar.get(Calendar.YEAR);
        int monthOfYear = calendar.get(Calendar.MONTH);
        int dayOfMonth = calendar.get(Calendar.DAY_OF_MONTH);
        datePicker.init(year,monthOfYear,dayOfMonth,this);
    
    @Override
    public void onDateChanged(DatePicker view, int year, int monthOfYear, int dayOfMonth) 
        Toast.makeText(this,
                "您选择的日期是:"+year+"年"+(monthOfYear+1)+"月"+dayOfMonth+"日!",
                Toast.LENGTH_SHORT).show();
    

 
    

 

AndoridManifest.xml:

 

启动测试:

 

5.TimePicker(时间选择器)

 time_picker.xml:

<?xml version="1.0" encoding="utf-8"?>
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context=".TimePickerActivity">
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical">

                <TimePicker
                    android:id="@+id/time_picker"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_marginTop="10dp"/>

    </LinearLayout>
</ScrollView>

 

TimePickerActivity.java:

package com.example.myapplication;

import android.app.Activity;
import android.os.Bundle;
import android.widget.TimePicker;
import android.widget.Toast;

import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;

public class TimePickerActivity extends AppCompatActivity 
    //时间选择器
    @Override
    protected void onCreate( Bundle savedInstanceState) 
        super.onCreate(savedInstanceState);
        setContentView(R.layout.time_picker);
        TimePicker timePicker = (TimePicker) findViewById(R.id.time_picker);
        timePicker.setOnTimeChangedListener(new TimePicker.OnTimeChangedListener() 
            @Override
            public void onTimeChanged(TimePicker view, int hourOfDay, int minute) 
                Toast.makeText(TimePickerActivity.this,
                        "您选择的时间是:"+hourOfDay+"时"+minute+"分!",
                        Toast.LENGTH_SHORT).show();
            
        );

    

 

AndoridManifest.xml:

 启动测试:

 

6.CalendarView(日历视图)

android:firstDayOfWeek

设置一个星期的第一天

android:maxDate

最大的日期显示在这个日历视图mm / dd / yyyy格式

android:minDate

最小的日期显示在这个日历视图mm / dd / yyyy格式

android:weekDayTextAppearance

工作日的文本出现在日历标题缩写

 calendar_view.xml:

<?xml version="1.0" encoding="utf-8"?>
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context=".CalendarViewActivity">
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical">

        <CalendarView
            android:id="@+id/calendar_view"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"/>

    </LinearLayout>
</ScrollView>

 

CalendarViewActivity.java:

package com.example.myapplication;

import android.os.Bundle;
import android.view.View;
import android.widget.CalendarView;
import android.widget.Toast;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;

public class CalendarViewActivity extends AppCompatActivity 
    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) 
        super.onCreate(savedInstanceState);
        setContentView(R.layout.calendar_view);
        CalendarView calendarView = (CalendarView) findViewById(R.id.calendar_view);
        calendarView.setOnDateChangeListener(new CalendarView.OnDateChangeListener()
            @Override
            public void onSelectedDayChange(@NonNull CalendarView view, int year, int month, int dayOfMonth) 
                Toast.makeText(CalendarViewActivity.this,
                        "您选择的时间是:"+year+"年"+month+"月"+dayOfMonth+"日",
                        Toast.LENGTH_SHORT).show();
            
        );
    

 

 AndoridManifest.xml:

 启动测试:

 

Android-常用布局与数据存储

开篇语

Android发展至今,可谓日新月异,每一个版本都会有一些新的内容需要开发者学习。本类文章不讨论最新技术,只写哪些最基础的知识点笔记总结,给想从事Android事业的小伙伴们一个敲门砖,工具书。


常用布局

相对布局 (RelativeLayout)

  1. 内部组件默认左对齐、顶部对齐

  • 设置组件在指定组件的右边

     android:layout_toRightOf="@id/tv1"
    
  • 设置在指定组件的下边

    android:layout_below="@id/tv1"
    
  • 设置右对齐父元素

    android:layout_alignParentRight="true"
    
  • 设置与指定组件右对齐

     android:layout_alignRight="@id/tv1"
    

线性布局 (LinearLayout)

  1. 当竖直布局时,只能左右对齐和水平居中,顶部底部对齐竖直居中无效
  2. 当水平布局时,只能顶部底部对齐和竖直居中
  3. 使用match_parent时注意不要把其他组件顶出去
  4. 线性布局非常重要的一个属性:权重

  • 指定各个节点的排列方向

    android:orientation="horizontal"
    
  • 设置右对齐

    android:layout_gravity="right"
    
  • 权重设置的是按比例分配剩余的空间

    android:layout_weight="1"
    

帧布局 (FrameLayout)

  1. 默认组件都是左对齐和顶部对齐,每个组件相当于一个div
  2. 不能相对于其他组件布局

  • 更改对齐方式

    android:layout_gravity="bottom"
    

表格布局 (TableLayout) PS:不常用

  1. 每个节点是一行,它的每个子节点是一列
  2. 表格布局中的节点可以不设置宽高,因为设置了也无效

    • 根节点的子节点宽为匹配父元素,高为包裹内容
    • 节点的子节点宽为包裹内容,高为包裹内容
    • 以上默认属性无法修改
  3. 根节点中可以设置以下属性,表示让第1列拉伸填满屏幕宽度的剩余空间

    android:stretchColumns="1"
    

绝对布局 (AbsoluteLayout) PS:不常用

  1. 直接指定组件的x、y坐标。写死的。

android:layout_x="148dp"
android:layout_y="96dp"

数据存储

内部存储空间

实际存储路径为data/data/包名/文件夹内,手机未root不可查看,只能程序自己访问。
系统管理应用界面的清除缓存,会清除cache文件夹下的东西,清除数据,会清除整个包名目录下的东西

  • files文件夹:存放在这个路径下的文件,只要你不删,它就一直存在。

  • cache文件夹:存放在这个路径下的文件,当内存不足时,有可能被删除,程序清理内存的时候会被清理。

  • database文件夹:默认是作为SQLite数据库存放的路径。

  • shared_prefs文件夹:默认是作为SharedPreferences(xml格式)存放的路径。

外部存储空间

sd卡的路径
  • sdcard:2.3之前的sd卡路径
  • mnt/sdcard:4.3之前的sd卡路径
  • storage/sdcard:4.3之后的sd卡路径
  • 目前国内各个厂家对于外部sd卡路径会有所不同,以上仅供参考。

  • 最简单的打开sd卡的方式

    File file = new File("sdcard/info.txt");
    
  • 写sd卡需要权限

    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
    
  • 读sd卡,在4.0之前不需要权限,4.0之后可以设置为需要

    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
    
  • 使用api获得sd卡的真实路径,部分手机品牌会更改sd卡的路径

    Environment.getExternalStorageDirectory()
    
  • 判断sd卡是否准备就绪

    if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED))
    

常用存储方式

  • io流读写文件方式
File file = new File("data/data/com.dudu0118.test/info.txt");
        //常用的api方式获取路径:File file = new File(getCacheDir(), "info.txt");
        if(file.exists())
            try 
                FileInputStream fis = new FileInputStream(file);
                //把字节流转换成字符流
                BufferedReader br = new BufferedReader(new InputStreamReader(fis));
                //读取txt文件里的用户名和密码
                String text = br.readLine();
             catch (Exception e) 
            
        
* getFilesDir()得到的file对象的路径是data/data/包名/files
    * 存放在这个路径下的文件,只要你不删,它就一直在
* getCacheDir()得到的file对象的路径是data/data/包名/cache
    * 存放在这个路径下的文件,当内存不足时,有可能被删除
* Environment.getExternalStorageDirectory()得到的file对象的路径是SDcard路径如:/sdcard/
  • SharedPreference存储方式

    • SharedPreference其实是一个xml文件,数据以键值对形式存储,如果数据如该类型,不妨用SharedPreference存储。(PS:如果多线程同时读写会出现数据异常,这时候需要改用别的存储方式。)

    用SharedPreference存储账号密码

    • 往SharedPreference里写数据

      //拿到一个SharedPreference对象
      SharedPreferences sp = getSharedPreferences("config", MODE_PRIVATE);
      //拿到编辑器
      Editor ed = sp.edit();
      //写数据
      ed.putBoolean("name", name);
      ed.commit();
      
    • 从SharedPreference里取数据

      SharedPreferences sp = getSharedPreferences("config", MODE_PRIVATE);
      //从SharedPreference里取数据
      String name = sp.getBoolean("name", "");
      
  • SQLite数据库方式

    • 创建数据库需要使用的api:继承自SQLiteOpenHelper。
    • 数据库被创建时会调用:onCreate方法
    • 数据库升级时会调用:onUpgrade方法

      //创建OpenHelper对象
      MyOpenHelper oh = new MyOpenHelper(getContext(), "person.db", null, 1);
      //获得数据库对象,如果数据库不存在,先创建数据库,后获得,如果存在,则直接获得
      SQLiteDatabase db = oh.getWritableDatabase();
      
    • getWritableDatabase():打开可读写的数据库
    • getReadableDatabase():在磁盘空间不足时打开只读数据库,否则打开可读写数据库

以上是关于Android开发-Android常用组件-Date & Time组件的主要内容,如果未能解决你的问题,请参考以下文章

Android开发-Android常用组件-Button按钮

进阶篇-用户界面:4.Android中常用组件

android app用啥开发好

Android-常用布局与数据存储

Android-常用布局与数据存储

Android开发学习笔记之一5大布局方式详解