Android——基本控件(下)(十八)

1. 时钟组件:AnalogClock与DigitalClock

1.1 知识点

(1)掌握AnalogClock与DigitalClock的使用;

1.2 具体内容

package com.example.clockproject;import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;public class ClockActivity extends Activity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_clock);}@Overridepublic boolean onCreateOptionsMenu(Menu menu) {// Inflate the menu; this adds items to the action bar if it is present.getMenuInflater().inflate(R.menu.clock, menu);return true;}}

 时钟组件没有什么太复杂的操作,不过在后面讲解线程操作的时候,会用的此种组件。

1.3 小结

(1)AnalogClock可以完成指针时钟的显示;

(2)DigitalClock可以完成数字时钟的显示。

2. 计时器:Chronometer

2.1 知识点

(1)掌握Chronometer组件的使用及操作;

(2)可以在手机开发中使用震动服务;

2.2 具体内容

 

<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:paddingBottom="@dimen/activity_vertical_margin"android:paddingLeft="@dimen/activity_horizontal_margin"android:paddingRight="@dimen/activity_horizontal_margin"android:paddingTop="@dimen/activity_vertical_margin"android:orientation="vertical"tools:context=".ChronometerActivity" ><Chronometerandroid:id="@+id/myChronometer"android:layout_width="match_parent"android:layout_height="wrap_content"/><LinearLayout android:layout_width="match_parent"android:layout_height="wrap_content"android:orientation="horizontal"><Button android:id="@+id/butStart"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="开始计时"/><Button android:id="@+id/butStop"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="停止计时"/><Button android:id="@+id/butReset"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="复位"/><Button android:id="@+id/butFormat"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="格式化显示"/></LinearLayout></LinearLayout>

 

package com.example.chronometerproject;import android.app.Activity;
import android.os.Bundle;
import android.os.SystemClock;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.Chronometer;public class ChronometerActivity extends Activity {Button butStart,butStop,butReset,butFormat = null;Chronometer  myChronometer = null;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_chronometer);butStart = (Button) super.findViewById(R.id.butStart);butStop = (Button) super.findViewById(R.id.butStop);butReset = (Button) super.findViewById(R.id.butReset);butFormat = (Button) super.findViewById(R.id.butFormat);myChronometer = (Chronometer) super.findViewById(R.id.myChronometer);butStart.setOnClickListener(new OnClickListenerImpl());butStop.setOnClickListener(new OnClickListenerImpl());butReset.setOnClickListener(new OnClickListenerImpl());butFormat.setOnClickListener(new OnClickListenerImpl());}private class OnClickListenerImpl implements OnClickListener{@Overridepublic void onClick(View v) {switch(v.getId()){case R.id.butStart:ChronometerActivity.this.myChronometer.start();break;case R.id.butStop:ChronometerActivity.this.myChronometer.stop();break;case R.id.butReset:ChronometerActivity.this.myChronometer.setBase(SystemClock.elapsedRealtime());//设置基准时间break;case R.id.butFormat:ChronometerActivity.this.myChronometer.setFormat("新的格式:%s");//格式化}}}}

计时器的功能并不复杂,但是可以结合一些系统服务,实现一些有意思的操作。

震动必须用真机进行测试。

package com.example.chronometerproject;import android.app.Activity;
import android.app.Service;
import android.os.Bundle;
import android.os.SystemClock;
import android.os.Vibrator;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.Chronometer;
import android.widget.Chronometer.OnChronometerTickListener;public class ChronometerActivity extends Activity {Button butStart,butStop,butReset,butFormat = null;Chronometer  myChronometer = null;Vibrator vb = null;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_chronometer);butStart = (Button) super.findViewById(R.id.butStart);butStop = (Button) super.findViewById(R.id.butStop);butReset = (Button) super.findViewById(R.id.butReset);butFormat = (Button) super.findViewById(R.id.butFormat);myChronometer = (Chronometer) super.findViewById(R.id.myChronometer);butStart.setOnClickListener(new OnClickListenerImpl());butStop.setOnClickListener(new OnClickListenerImpl());butReset.setOnClickListener(new OnClickListenerImpl());butFormat.setOnClickListener(new OnClickListenerImpl());myChronometer.setOnChronometerTickListener(new OnChronometerTickListener() {@Overridepublic void onChronometerTick(Chronometer chronometer) {String time = chronometer.getText().toString();if("0:30".equals(time)){ChronometerActivity.this.vb.vibrate(new long[]{1000,10,1000,100}, 0);//设置震动周期震动的形式}}});vb = (Vibrator) super.getApplication().getSystemService(Service.VIBRATOR_SERVICE);}private class OnClickListenerImpl implements OnClickListener{@Overridepublic void onClick(View v) {switch(v.getId()){case R.id.butStart:ChronometerActivity.this.myChronometer.start();break;case R.id.butStop:ChronometerActivity.this.myChronometer.stop();ChronometerActivity.this.vb.cancel();break;case R.id.butReset:ChronometerActivity.this.myChronometer.setBase(SystemClock.elapsedRealtime());//设置基准时间break;case R.id.butFormat:ChronometerActivity.this.myChronometer.setFormat("新的格式:%s");//格式化}}}}

 手机震动为系统服务,需要获取权限

<uses-permission android:name="android.permission.VIBRATE"/>

2.3 小结

(1)Chronometer可以完成计时器的操作;

(2)如果手机要想完成震动的操作,则可以使用“Service.VIBRATOR_SERVICE ”服务。

3. 标签:TabHost

3.1 知识点

(1)掌握标签组件的使用,并可以使用标签组件进行程序界面分割;

(2)可以通过配置文件完成标签组件的显示;

(3)可以通过程序完成标签组件的显示。

3.2 具体内容

有了标签之后,在一定的屏幕空间就可以显示更多的内容,在这样的界面中,有多个Tab,多个Tab就组成了一个TabHost。

 

 

我们先使用第一种方式来完成,注意观察操作形式。

 

 要继TabActivity的原因在于这种Activity提供两个关键的方法可以让我们完成标签页的创建。

<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:paddingBottom="@dimen/activity_vertical_margin"android:paddingLeft="@dimen/activity_horizontal_margin"android:paddingRight="@dimen/activity_horizontal_margin"android:paddingTop="@dimen/activity_vertical_margin"android:orientation="vertical"tools:context=".TabHostActivity" ><LinearLayout android:id="@+id/tab_edit"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"><EditText android:id="@+id/edt"android:layout_width="match_parent"android:layout_height="wrap_content"android:text="input here..."/><Button android:id="@+id/but"android:layout_width="match_parent"android:layout_height="wrap_content"android:text="Serach"/></LinearLayout><LinearLayout android:id="@+id/tab_clock"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"><AnalogClock android:id="@+id/clock"android:layout_width="match_parent"android:layout_height="wrap_content"/></LinearLayout><LinearLayout android:id="@+id/tab_sex"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"><RadioGroup android:id="@+id/sex"android:layout_width="match_parent"android:layout_height="wrap_content"android:orientation="vertical"android:checkedButton="@+id/woman"><RadioButton android:id="@+id/man"android:layout_width="match_parent"android:layout_height="wrap_content"android:text="MAN"/><RadioButton android:id="@+id/woman"android:layout_width="match_parent"android:layout_height="wrap_content"android:text="WOMAN"/></RadioGroup></LinearLayout>
</LinearLayout>
package com.example.tabhostproject;import android.app.TabActivity;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.Menu;
import android.widget.TabHost;public class TabHostActivity extends TabActivity {TabHost tabHost = null;int layRes[]={R.id.tab_edit,R.id.tab_clock,R.id.tab_sex};@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);this.tabHost = super.getTabHost();LayoutInflater.from(this).inflate(R.layout.activity_tab_host, //定义要转换的布局管理局this.tabHost.getTabContentView(),//指定标签添加的容器true);//实例化布局管理器中的组件for(int i = 0;i<layRes.length;i++){TabHost.TabSpec myTab = this.tabHost.newTabSpec("tab"+i);myTab.setIndicator("标签"+i);//标签文字myTab.setContent(layRes[i]);this.tabHost.addTab(myTab);//添加标签}}@Overridepublic boolean onCreateOptionsMenu(Menu menu) {// Inflate the menu; this adds items to the action bar if it is present.getMenuInflater().inflate(R.menu.tab_host, menu);return true;}}

以上的代码是采用直接集成TabActivity来实现的标签页效果,如果你还继承Activity同时还能实现标签页,那么就需要第二种形式。

 

 

package com.example.tabhostproject;import android.app.Activity;
import android.os.Bundle;
import android.widget.TabHost;public class TabHostActivity extends Activity {TabHost tabHost = null;int layRes[]={R.id.tab_edit,R.id.tab_clock,R.id.tab_sex};@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);super.setContentView(R.layout.tab_host_widget);tabHost = (TabHost) super.findViewById(R.id.tabhost);this.tabHost.setup();//创建TabHost对象for(int i=0;i<layRes.length;i++){TabHost.TabSpec myTab = this.tabHost.newTabSpec("tab"+i);myTab.setIndicator("标签"+(i+1));//设置标签文字myTab.setContent(layRes[i]);this.tabHost.addTab(myTab);}this.tabHost.setCurrentTab(0);//设置开始索引}
}

 

<TabHost xmlns:android="http://schemas.android.com/apk/res/android"android:id="@+id/tabhost"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical" ><LinearLayoutandroid:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical" ><TabWidgetandroid:id="@android:id/tabs"android:layout_width="match_parent"android:layout_height="wrap_content" /><FrameLayoutandroid:id="@android:id/tabcontent"android:layout_width="match_parent"android:layout_height="match_parent" ><LinearLayoutandroid:id="@+id/tab_edit"android:layout_width="match_parent"android:layout_height="wrap_content"android:orientation="vertical" ><EditTextandroid:id="@+id/edt"android:layout_width="match_parent"android:layout_height="wrap_content"android:text="input here..." /><Buttonandroid:id="@+id/but"android:layout_width="match_parent"android:layout_height="wrap_content"android:text="Serach" /></LinearLayout><LinearLayoutandroid:id="@+id/tab_clock"android:layout_width="match_parent"android:layout_height="wrap_content"android:orientation="vertical" ><AnalogClockandroid:id="@+id/clock"android:layout_width="match_parent"android:layout_height="wrap_content" /></LinearLayout><LinearLayoutandroid:id="@+id/tab_sex"android:layout_width="match_parent"android:layout_height="wrap_content"android:orientation="vertical" ><RadioGroupandroid:id="@+id/sex"android:layout_width="match_parent"android:layout_height="wrap_content"android:checkedButton="@+id/woman"android:orientation="vertical" ><RadioButtonandroid:id="@+id/man"android:layout_width="match_parent"android:layout_height="wrap_content"android:text="MAN" /><RadioButtonandroid:id="@+id/woman"android:layout_width="match_parent"android:layout_height="wrap_content"android:text="WOMAN" /></RadioGroup></LinearLayout></FrameLayout></LinearLayout></TabHost>

我们现在实现了和第一种方式同样的显示效果,现在呢我们想要把标签放到屏幕的下方,那么只需要修改两个地方。

<TabHost xmlns:android="http://schemas.android.com/apk/res/android"android:id="@+id/tabhost"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical" ><RelativeLayoutandroid:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical" ><TabWidgetandroid:id="@android:id/tabs"android:layout_width="match_parent"android:layout_height="wrap_content" android:layout_alignParentBottom="true"/><FrameLayoutandroid:id="@android:id/tabcontent"android:layout_width="match_parent"android:layout_height="match_parent" ><LinearLayoutandroid:id="@+id/tab_edit"android:layout_width="match_parent"android:layout_height="wrap_content"android:orientation="vertical" ><EditTextandroid:id="@+id/edt"android:layout_width="match_parent"android:layout_height="wrap_content"android:text="input here..." /><Buttonandroid:id="@+id/but"android:layout_width="match_parent"android:layout_height="wrap_content"android:text="Serach" /></LinearLayout><LinearLayoutandroid:id="@+id/tab_clock"android:layout_width="match_parent"android:layout_height="wrap_content"android:orientation="vertical" ><AnalogClockandroid:id="@+id/clock"android:layout_width="match_parent"android:layout_height="wrap_content" /></LinearLayout><LinearLayoutandroid:id="@+id/tab_sex"android:layout_width="match_parent"android:layout_height="wrap_content"android:orientation="vertical" ><RadioGroupandroid:id="@+id/sex"android:layout_width="match_parent"android:layout_height="wrap_content"android:checkedButton="@+id/woman"android:orientation="vertical" ><RadioButtonandroid:id="@+id/man"android:layout_width="match_parent"android:layout_height="wrap_content"android:text="MAN" /><RadioButtonandroid:id="@+id/woman"android:layout_width="match_parent"android:layout_height="wrap_content"android:text="WOMAN" /></RadioGroup></LinearLayout></FrameLayout></RelativeLayout></TabHost>

3.3 小结

(1)使用Tab标签可以实现程序的分栏显示;

(2)Tab的实现可以通过继承TabActivity类实现也可以通过配置实现;

(3)通过配置实现的Tab较为麻烦。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/55986.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

LeetCode 1267. 统计参与通信的服务器

【LetMeFly】1267.统计参与通信的服务器 力扣题目链接&#xff1a;https://leetcode.cn/problems/count-servers-that-communicate/ 这里有一幅服务器分布图&#xff0c;服务器的位置标识在 m * n 的整数矩阵网格 grid 中&#xff0c;1 表示单元格上有服务器&#xff0c;0 表…

npm install sentry-cli失败的问题

1. 目前报错 2. 终端运行 npm set ENTRYCLI_CDNURLhttps://cdn.npm.taobao.org/dist/sentry-cli npm set sentrycli_cdnurlhttps://cdn.npm.taobao.org/dist/sentry-cli3. 再安装 npx sentry/wizardlatest -i nextjs即可成功

将Series序列中的缺失值用后一个值填充Series.bfill()

【小白从小学Python、C、Java】 【计算机等考500强证书考研】 【Python-数据分析】 对于Series序列中的缺失值n1 用n1后面的值n2来填充替代 Series.bfill() [太阳]选择题 关于以下代码的说法中错误的是? import numpy as np import pandas as pd a pd.Series([1,np.nan,2,np.…

BlazorServer中C#与JavaScript的相互调用

BlazorServer中C#与JavaScript的相互调用 前言&#xff1a; ​ 虽然BlazorServer中推荐使用C#在razor页面中的替代JavaScript来完成逻辑的编写&#xff0c;但当需要使用第三方的javascript文件/组件里的内容时&#xff0c;则难免要在C#中调用其方法或对象。反之当你的(用到第…

【Go 基础篇】切片:Go语言中的灵活数据结构

在Go语言中&#xff0c;切片&#xff08;Slice&#xff09;是一种强大且灵活的数据结构&#xff0c;用于管理和操作一系列元素。与数组相比&#xff0c;切片的大小可以动态调整&#xff0c;这使得它成为处理动态数据集合的理想选择。本文将围绕Go语言中切片的引入&#xff0c;介…

WPF网格拖动自动布局效果

WPF网格拖动自动布局效果 使用Canvas和鼠标相关事件实现如下的效果: XAML代码: <Window x:Class="CanvasTest.MainWindow"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:

Linux部署RocketMQ并使用SpringBoot创建生产、消费者

&#x1f61c;作 者&#xff1a;是江迪呀✒️本文关键词&#xff1a;RocketMQ、消息队列☀️每日 一言&#xff1a;在你心灰意冷、心烦意乱时也不要停下你的脚步&#xff01; 一、前言 RocketMQ&#xff08;Apache RocketMQ&#xff09;是一种开源的分布式消息中间…

聊一聊微前端框架的选型和实现 | 业务平台

一、项目背景 目前&#xff0c;我们开发维护的项目主要有 6 个&#xff0c;但是分别对应 PC 和 H5 两个端&#xff1a; 如上图所示&#xff0c;我们 6个项目最开始是一个一个进行开发维护的&#xff0c;但是到后期&#xff0c;这几个项目之间有的部分会有业务逻辑不同&#xff…

BUUCTF [SWPU2019]Web1

​ 这是一道sql二次注入题目&#xff0c;但是注入点并不在登录处 注册一个用户然后登录 广告申请处进行sql注入 你会发现过滤了很多关键字 空格#information等等 这里用到了一些绕过技巧 使用 /**/ 代替空格 union/**/select/**/1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,1…

c++11 标准模板(STL)(std::basic_ostringstream)(一)

定义于头文件 <sstream> template< class CharT, class Traits std::char_traits<CharT> > class basic_ostringstream;(C11 前)template< class CharT, class Traits std::char_traits<CharT>, class Allocator std::allo…

LLaMA中ROPE位置编码实现源码解析

1、Attention中q&#xff0c;经下式&#xff0c;生成新的q。m为句长length&#xff0c;d为embedding_dim/head θ i 1 1000 0 2 i d \theta_i\frac{1}{10000^\frac{2i}{d}} θi​10000d2i​1​ 2、LLaMA中RoPE源码 import torchdef precompute_freqs_cis(dim: int, end: i…

uniapp 开发微信小程序使用echart的dataZoom属性缩放功能不生效!bug记录!

在本项目中使用的是这个echart库 在项目中添加了dataZoom配置项但是不生效&#xff0c;突然想到微信小程序代码大小的限制&#xff0c;之前的echarts.js是定制的&#xff0c;有可能没有加dataZoom组件。故重新定制echarts.js。之前用的echarts版本是5.0.0&#xff0c;这次也是…

Web Components

Web Components标准非常重要的一个特性是&#xff0c;它使开发者能够将HTML页面的功能封装为custom elements&#xff08;自定义标签&#xff09;&#xff0c;可以使用CustomElementRegistry来管理自定义标签 <script>//1、创建自定义标签class NewElement extends HTML…

Docker file解析

文章目录 简介构建的三步骤Docker执行Dockerfile的大致流程DockerFile常用保留字指令创建第一个Dockerfile镜像的缓存特性 Docker file 解析 简介 Dockerfile是用来构建Docker镜像的文本文件&#xff0c;是由一条条构建镜像所需的指令和参数构成的脚本&#xff0c;记录了镜像构…

单片机IO模拟串口协议

一、前言 嵌入式硬件平台调试中常用的debug方法是看串口打印定位问题&#xff0c;但有时候会遇到单片机没有串口外设或者串口引脚被占用的情况&#xff0c;这时候也可以在代码里操作空闲的IO输出不同个数的脉冲来达到调试的效果&#xff0c;但是要用逻辑分析仪抓线逐个看波形比…

Redis数据结构:Set类型全面解析

Set 类型是一个无序并唯一的键值集合&#xff0c;它的存储顺序不会按照插入的先后顺序进行存储。Redis 中集合是通过哈希表实现的&#xff0c;所以添加&#xff0c;删除&#xff0c;查找的复杂度都是 O(1)。相对于列表&#xff0c;集合也有两个特点&#xff1a;无序、不可重复 …

浅析三维模型OBJ格式轻量化压缩文件大小的技术方法

浅析三维模型OBJ格式轻量化压缩文件大小的技术方法 在减小三维模型OBJ格式轻量化文件大小方面&#xff0c;有许多技术和方法可以使用。下面我将介绍一些常用的方法来减小OBJ文件的大小。 1、优化顶点数量&#xff1a;减少OBJ文件中的顶点数量是减小文件大小的一种有效方法。可…

【Springboot】| 从深入自动配置原理到实现 自定义Springboot starter

目录 一. &#x1f981; 前言二. &#x1f981; Spring-boot starter 原理实现分析2.1 自动配置原理 三. &#x1f981; 操作实践3.1 项目场景3.2 搭建项目3.3 添加相关依赖3.4 删除一些不需要的东西3.5 发邮件工具类逻辑编写3.6 创建相关配置类3.7 创建 Spring.factories 文件…

Dart PowerTCP Emulation for .NET Crack

Dart PowerTCP Emulation for .NET Crack .NET CF上的PowerTCP Emulation为手持设备提供了高级的Internet通信组件。这些功能允许同步操作&#xff0c;这样可以消耗更少的资源&#xff0c;提供更大的灵活性&#xff0c;并生成易于维护的软件。带有.NET的PowerTCP仿真包括VT52、…

服务器Linux系统配置mysql数据库主从自动备份

服务器Linux系统配置mysql数据库主从自动备份 当数据内容越来越多的时候&#xff0c;数据库也变得越来越大了。如果不小心误删了&#xff0c;或者被黑主机了&#xff0c;那就什么都没有了。所以数据库的数据怎么能让它不丢失做到万无一失变得尤为重要&#xff01; 我是艾西&a…