一、布局管理器
1.线性布局LinearLayout
线性布局的每一列只能放置一个组件,且组件超出了屏幕内容不会换行
可设定的属性:
orientation:布局内元素的排列方式,horizontal横排(默认),vertical竖排
gravity:布局内元素的位置,可以使用 | 连接,有top,bottom,left,right属性
layout_width和layout_height:布局的宽度和高度,有match_parent=fill_parent最大,wrap_content布局内元素的最大
id:唯一标识
background:背景颜色,可以使用@来引用,也可以直接使用十六进制
2.表格布局TableLayout
表格布局继承了线性布局
先看代码和效果
<?xml version="1.0" encoding="utf-8"?>
<TableLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center_vertical"
android:stretchColumns="0,3">
<TableRow
android:id="@+id/row1"
android:layout_width="wrap_content"
android:layout_height="wrap_content">
<TextView/>
<TextView
android:text="用户名:"
android:textSize="100px">
</TextView>
<EditText
android:textSize="100px"
android:minWidth="300px">
</EditText>
<TextView/>
</TableRow>
<TableRow
android:id="@+id/row2"
android:layout_width="wrap_content"
android:layout_height="wrap_content">
<TextView/>
<TextView
android:text="密码:"
android:textSize="100px">
</TextView>
<EditText
android:textSize="100px"
android:minWidth="300px"
android:inputType="textPassword">
</EditText>
<TextView/>
</TableRow>
<TableRow>
<TextView/>
<Button
android:id="@+id/button1"
android:layout_width="100px"
android:layout_height="wrap_content"
android:text="登录"
android:textSize="80px"
>
</Button>
<Button
android:id="@+id/button2"
android:layout_width="100px"
android:layout_height="wrap_content"
android:text="注册"
android:textSize="80px">
</Button>
<TextView/>
</TableRow>
</TableLayout>
具体说下里面的属性
在TableLayout的大标签下面,每一个TableRow代表一行,gravity表示为内部这几个row的位置
stretchColumns表示需要在哪些位置伸展为空的内容,这里写的0、3,即为数组的1和4的位置为空,即红框这一部分
测试之后发现其实使用gravity=center的属性可以替代拉伸
EditText里可以用inputType属性来更改输入的文本类型
3.帧布局管理器FrameLayout
帧布局就是指将屏幕分为一个个空白的区域,每一个区域为一帧,默认从左上角开始,且后面的组件会覆盖掉之前的组件
foreground设置前景图像的属性,foregroundGravity前景图像的位置
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:foreground="@drawable/ic_launcher_background"
android:foregroundGravity="center|top">
<TextView
android:layout_width="800px"
android:layout_height="800px"
android:background="@color/black"
android:layout_gravity="center"/>
<TextView
android:layout_width="500px"
android:layout_height="500px"
android:background="@color/white"
android:layout_gravity="center"/>
<TextView
android:layout_width="300px"
android:layout_height="300px"
android:background="@color/black"
android:layout_gravity="center"/>
</FrameLayout>
其中layout_gravity表示的是容器本身位于父容器的位置,可用 | 连接
效果如下
4.相对布局RelativeLayout
基本属性:
? gravity设置容器内组件的对齐方式,
? ignoreGravity设置该属性为true的组件不受gravity属性的影响
根据父容器定位:
? layout_alignParentLeft的属性为true表示左对齐父容器,还有Right,Top,Bottom,
? android:layout_centerHorizontal为true表示在父容器中水平居中,还有Vertical垂直居中,以及InParent居中
根据兄弟容器定位:
? layout_toLeftOf设定id属性即放在这个id对象的左边,同类型的还有layout_toRightOf,layout_above,layout_below,效果如下
? layout_alignLeft即和该参考组件的左边界对其,同类型还有layout_alignBottom,layout_alignLeft,layout_alignRight,效果如下
? margin设置偏移量,指和父容器的偏移量,有layout_marginLeft/Right/Top/Bottom,也可以设置layout_margin来同时控制四个偏移量
? padding设置填充,主要设置组件内元素的填充亮,比如TextView中文字的具体位置,paddingLeft/Right/Top/Bottom以及android:padding同时设置四个位置
二、基本组件
1.文本框与编辑框TextView EditView
EditView是TextView的子类,所以拥有它的所有方法
<?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">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="测试单行文本,这段文本有很多个字"
android:autoLink="email"
android:singleLine="true"
android:textSize="80px"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="测试多行文本,这段文本有很多个字"
android:textSize="80px"/>
<EditText
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:hint="请输入你的密码"
android:inputType="numberPassword"/>
</LinearLayout>
需要注意的是输入类型和是否单行输入
2.按钮Button
最主要的就是onClick方法,可以同各国两种方式实现,一种是在onCreate中设置setOnClickListener(new View.OnClickListener()来实现,另一种是在xml里写onclick属性,在Activity类中直接写该方法,下面实现了一下登陆验证的操作
xml如下
<?xml version="1.0" encoding="utf-8"?>
<TableLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center_vertical"
android:stretchColumns="0,3">
<TableRow
android:layout_height="wrap_content"
android:layout_width="wrap_content"
>
<TextView/>
<TextView
android:layout_height="wrap_content"
android:layout_width="wrap_content"
android:text="注册邮箱:"
android:textSize="30dp"/>
<EditText
android:id="@+id/user"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:hint="请输入你的注册邮箱"
android:inputType="textEmailAddress"
android:textSize="20dp"/>
<TextView/>
</TableRow>
<TableRow
android:layout_height="wrap_content"
android:layout_width="wrap_content"
>
<TextView/>
<TextView
android:layout_height="wrap_content"
android:layout_width="wrap_content"
android:text="密码:"
android:textSize="30dp"/>
<EditText
android:id="@+id/pwd"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:hint="请输入你的密码"
android:inputType="textPassword"
android:textSize="20dp"/>
<TextView/>
</TableRow>
<TableRow
android:layout_height="wrap_content"
android:layout_width="wrap_content"
>
<TextView/>
<TextView
android:layout_height="wrap_content"
android:layout_width="wrap_content"
android:text="密码确认:"
android:textSize="30dp"/>
<EditText
android:id="@+id/pwdc"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:hint="请再次输入你的密码"
android:inputType="textPassword"
android:textSize="20dp"/>
<TextView/>
</TableRow>
<TableRow
android:layout_height="wrap_content"
android:layout_width="wrap_content"
>
<TextView/>
<TextView
android:id="@+id/info"
android:layout_height="wrap_content"
android:layout_width="wrap_content"
android:textColor="#a1a1a1"
android:textSize="20dp"/>
<TextView/>
</TableRow>
<TableRow
android:layout_height="wrap_content"
android:layout_width="wrap_content"
>
<TextView/>
<Button
android:id="@+id/reg"
android:layout_height="wrap_content"
android:layout_width="200px"
android:text="注册"
android:textSize="25dp"
android:onClick="regClick"
/>
<TextView/>
</TableRow>
<TableRow
android:layout_height="wrap_content"
android:layout_width="wrap_content"
>
<TextView/>
<Button
android:id="@+id/re"
android:layout_height="wrap_content"
android:layout_width="200px"
android:text="重置"
android:textSize="25dp"
/>
<TextView/>
</TableRow>
</TableLayout>
java代码如下
package com.thundersoft.test;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;
import androidx.annotation.Nullable;
import com.thundersoft.myapplication.R;
public class ButtonActivity extends Activity {
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.button);
EditText user = findViewById(R.id.user);
EditText pwd = findViewById(R.id.pwd);
EditText pwdc = findViewById(R.id.pwdc);
TextView info = findViewById(R.id.info);
String pwds = pwd.getText().toString();
String pwdcs = pwdc.getText().toString();
Button reg = findViewById(R.id.reg);
Button re = findViewById(R.id.re);
re.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
info.setText("");
user.setText("");
pwd.setText("");
pwdc.setText("");
}
});
reg.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (!pwds.equals(pwdcs)){
info.setText("密码不一致");
}
else {
Toast t = Toast.makeText(ButtonActivity.this, "注册成功", Toast.LENGTH_SHORT);
t.show();
}
}
});
}
}
3.单选按钮RaidoButton
RaidoButton需要在RadioGroup中使用
<?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">
<RadioGroup
android:id="@+id/group"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal">
<RadioButton
android:id="@+id/man"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="男"
android:textSize="20dp"/>
<RadioButton
android:id="@+id/woman"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="女"
android:textSize="20dp"/>
</RadioGroup>
<Button
android:id="@+id/submit"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="20dp"
android:text="提交"/>
</LinearLayout>
java代码如下
package com.thundersoft.test;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.RadioButton;
import android.widget.RadioGroup;
import android.widget.Toast;
import androidx.annotation.Nullable;
import com.thundersoft.myapplication.R;
public class RadioActivity extends Activity {
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.radiobutton);
RadioGroup group = findViewById(R.id.group);
group.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(RadioGroup group, int checkedId) {
RadioButton button = findViewById(checkedId);
Toast toast = Toast.makeText(RadioActivity.this, button.getText() + "被点击", Toast.LENGTH_SHORT);
toast.show();
}
});
Button submit = findViewById(R.id.submit);
submit.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
for (int i = 0; i < group.getChildCount(); i++) {
RadioButton childAt = (RadioButton) group.getChildAt(i);
if (childAt.isChecked()){
Toast toast = Toast.makeText(RadioActivity.this, childAt.getText() + "确定", Toast.LENGTH_SHORT);
toast.show();
}
}
}
});
}
}
java中,通过找到组的id,通过组的getChildCount方法,通过循环,对radio的下标进行选定
4.复选框CheckBox
<CheckBox
android:id="@+id/c1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="1"/>
<CheckBox
android:id="@+id/c2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="1"/>
<CheckBox
android:id="@+id/c3"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="1"/>
<Button
android:id="@+id/submit1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="20dp"
android:text="提交"/>
因为checkbox的监听因素,需要创建一个单独的监听器对象,传入多个监听器中
private CompoundButton.OnCheckedChangeListener listener = new CompoundButton.OnCheckedChangeListener(){
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
if (isChecked){
Toast toast = Toast.makeText(RadioActivity.this, "选中了"+buttonView.getText().toString(), Toast.LENGTH_SHORT);
toast.show();
}
}
};
CheckBox c1 = findViewById(R.id.c1);
CheckBox c2 = findViewById(R.id.c2);
CheckBox c3 = findViewById(R.id.c3);
c1.setOnCheckedChangeListener(listener);
c2.setOnCheckedChangeListener(listener);
c3.setOnCheckedChangeListener(listener);
这样可以简化代码
点击获取如下
Button button = findViewById(R.id.submit1);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String answer = "";
if(c1.isChecked())
answer += c1.getText().toString() + " ";
if(c2.isChecked())
answer += c2.getText().toString() + " ";
if(c3.isChecked())
answer += c3.getText().toString() + " ";
Toast toast = Toast.makeText(RadioActivity.this, "选中"+answer, Toast.LENGTH_SHORT);
toast.show();
}
});
5.图像视图ImageView
图象视图有几个重要的属性
android:adjustViewBounds用于设置ImageView是否调整自己的边界来保持所显示图片的宽高比,也就是以图片为主
android:maxHeight/Width需要设置上一个属性为true才能指定最大值
android:scaleType属性有以下显示
? matrix以matrix的方式缩放
? fitXY以ImageView的尺寸为主
? fitStar/fitCenter/fitEnd保持图片纵横比,知道图片能完全显示
? center/centerCrop/centerInside放在正中间/保持纵横比并完全覆盖/保持纵横比并完全显示
tint染色
6.列表选择框spinner
在xml中新建spinner标签
可以指定strings中的内容放入spinner中
<string-array name="spinner">
<item>学生</item>
<item>老师</item>
<item>保安</item>
<item>食堂阿姨</item>
<item>领导</item>
</string-array>
<Spinner
android:entries="@array/spinner"
android:layout_width="wrap_content"
android:layout_height="80px"
android:id="@+id/spinner"/>
java代码如下
package com.thundersoft.test;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.Spinner;
import android.widget.Toast;
import androidx.annotation.Nullable;
import com.thundersoft.myapplication.R;
public class SpinnerActivity extends Activity {
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.spinner);
Spinner spinner = findViewById(R.id.spinner);
spinner.getSelectedItem();
spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
String s = parent.getItemAtPosition(position).toString();
Toast.makeText(SpinnerActivity.this,s,Toast.LENGTH_SHORT).show();
}
@Override
public void onNothingSelected(AdapterView<?> parent) {
}
});
}
}
java通过选择监听器来监听选择的元素
parent.getItemAtPosition(position).toString();
很多情况下不能从strings中获得内容,我们需要把获取到的内容放在java中存储
通过适配器来实现功能,使用方法如下
package com.thundersoft.test;
import android.app.Activity;
import android.os.Bundle;
import android.widget.ArrayAdapter;
import android.widget.LinearLayout;
import android.widget.Spinner;
import androidx.annotation.Nullable;
import com.thundersoft.myapplication.R;
public class Spinner2Activity extends Activity {
String[] strings = new String[]{"学生","老师","领导"};
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
LinearLayout linearLayout = new LinearLayout(Spinner2Activity.this);
setContentView(linearLayout);
Spinner spinner = new Spinner(Spinner2Activity.this);
ArrayAdapter<String> objectArrayAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item,strings);
objectArrayAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
spinner.setAdapter(objectArrayAdapter);
linearLayout.addView(spinner);
}
}
7.列表视图ListView
最简单的实现方式就是使用ListView标签,接着设置entity属性为@strings里的内容,如下图所示
<?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">
<ListView
android:id="@+id/listview"
android:divider="@color/red"
android:dividerHeight="10px"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:footerDividersEnabled="false"
android:headerDividersEnabled="false"
android:entries="@array/listview"/>
</LinearLayout>
divider是分割条,可以使用颜色和图片
dividerHeight分割条的高度
entries之间见过,就是使用strings中的array来指定list
footerDividersEnabled/header是底部和头部的绘制,需要通过java代码控制
但是这样的并不常用,很多情况下需要从其他地方获取ListView,而且这些内容必须在java代码中管理
下面是使用适配器加xml布局文件生成的listview
package com.thundersoft.test;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.LinearLayout;
import android.widget.ListView;
import android.widget.Toast;
import androidx.annotation.Nullable;
import com.thundersoft.myapplication.R;
public class ListviewActivity extends Activity {
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
LinearLayout linearLayout = new LinearLayout(ListviewActivity.this);
setContentView(linearLayout);
ListView listView = new ListView(ListviewActivity.this);
View line = View.inflate(ListviewActivity.this, R.layout.linearlayout, null);
listView.addHeaderView(line);
ArrayAdapter<CharSequence> ad = ArrayAdapter.createFromResource(this, R.array.listview, android.R.layout.simple_list_item_checked);
listView.setAdapter(ad);
listView.addFooterView(line);
linearLayout.addView(listView);
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
String s = parent.getItemAtPosition(position).toString();
Toast.makeText(ListviewActivity.this,s,Toast.LENGTH_SHORT).show();
}
});
}
}
View.inflate(ListviewActivity.this, R.layout.linearlayout, null);表示的是从其他位置获取的内容
我们也可以自定义列表中的内容,这时候就需要继承ListActivity了,代码如下
package com.thundersoft.test;
import android.app.ListActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import androidx.annotation.Nullable;
public class Listview2Activity extends ListActivity {
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
String[] strings = new String[]{"测试1", "测试2", "测试3"};
ArrayAdapter<String> ad = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, strings);
this.setListAdapter(ad);
}
@Override
protected void onListItemClick(ListView l, View v, int position, long id) {
super.onListItemClick(l, v, position, id);
String s = l.getItemAtPosition(position).toString();
System.out.println(s);
}
}
该方法相对简单,直接通过this.setListAdapter(ad);配置适配器即可
另外要着重说明一下适配器之一的SimpleAdapter,它的代码如下
package com.thundersoft.test;
import android.app.ListActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.SimpleAdapter;
import androidx.annotation.Nullable;
import com.thundersoft.myapplication.R;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.ListIterator;
import java.util.Map;
public class Listview3Activity extends ListActivity {
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
int[] ints = {R.drawable.code, R.drawable.pic, R.drawable.fav};
String[] strings = new String[]{"代码专区", "图片预览", "我的喜爱"};
List<Map<String,Object>> item = new ArrayList<>();
for (int i = 0; i < strings.length; i++) {
HashMap<String, Object> map = new HashMap<>();
map.put("image",ints[i]);
map.put("title",strings[i]);
item.add(map);
}
SimpleAdapter ad = new SimpleAdapter(this, item, R.layout.item, new String[]{"title", "image"}, new int[]{R.id.item_title, R.id.item_image});
this.setListAdapter(ad);
}
}
SimpleAdapter的源码如下
public SimpleAdapter(Context context, List<? extends Map<String, ?>> data,
@LayoutRes int resource, String[] from, @IdRes int[] to)
context表示指定关联该Adapter运行的上下文,这里是this
data指定一个基于Map的列表List,代表每一行
resource表示要放的布局文件,这里的item是一个LinearLayout中包含一个Image和Text的布局
from表示唯一指定表示名字,这里的title和image和map中的k键对应
to表示为放在布局文件上的哪个位置,item_title和item_image是id
这里需要新建一个item的xml文件
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="match_parent">
<ImageView
android:layout_width="25dp"
android:layout_height="25dp"
android:id="@+id/item_image"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/item_title"/>
</LinearLayout>
8.日期时间选取器DatePicker TimePicker
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:clipToPadding="false"
tools:context=".MainActivity">
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<DatePicker
android:id="@+id/date"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
<TimePicker
android:id="@+id/time"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
</LinearLayout>
</ScrollView>
java代码如下
package com.thundersoft.test;
import android.app.Activity;
import android.os.Bundle;
import android.widget.DatePicker;
import android.widget.TimePicker;
import androidx.annotation.Nullable;
import com.thundersoft.myapplication.R;
import java.util.Calendar;
public class PickerActivity extends Activity {
int year;
int month;
int day;
int hour;
int minute;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.picker);
DatePicker datePicker = findViewById(R.id.date);
TimePicker timePicker = findViewById(R.id.time);
timePicker.setIs24HourView(true);
Calendar instance = Calendar.getInstance();
year = instance.get(Calendar.YEAR);
month = instance.get(Calendar.MONTH);
day = instance.get(Calendar.DAY_OF_MONTH);
hour = instance.get(Calendar.HOUR_OF_DAY);
minute = instance.get(Calendar.MINUTE);
datePicker.init(year, month, day, new DatePicker.OnDateChangedListener() {
@Override
public void onDateChanged(DatePicker view, int year, int month, int day) {
PickerActivity.this.year=year;
PickerActivity.this.month=month;
PickerActivity.this.day=day;
System.out.println(year+month+day+hour+minute);
}
});
timePicker.setOnTimeChangedListener(new TimePicker.OnTimeChangedListener() {
@Override
public void onTimeChanged(TimePicker view, int hour, int minute) {
PickerActivity.this.hour = hour;
PickerActivity.this.month = minute;
System.out.println(hour+minute);
}
});
}
}
需要注意的是日历对象的使用
9.计时器Chronometer
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<Chronometer
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/chro"/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="开始计时"
android:id="@+id/startbutton"/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="停止计时"
android:id="@+id/endbutton"/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="归零"
android:id="@+id/for0"/>
</LinearLayout>
java代码如下
package com.thundersoft.test;
import android.app.Activity;
import android.os.Bundle;
import android.os.SystemClock;
import android.view.View;
import android.widget.Button;
import android.widget.Chronometer;
import androidx.annotation.Nullable;
import com.thundersoft.myapplication.R;
public class ChronometerActivity extends Activity {
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.chronometer);
Chronometer chronometer = findViewById(R.id.chro);
chronometer.setBase(SystemClock.elapsedRealtime());
chronometer.setFormat("已用时间:%s");
Button start = findViewById(R.id.startbutton);
Button end = findViewById(R.id.endbutton);
Button for0 = findViewById(R.id.for0);
start.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
chronometer.start();
}
});
end.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
chronometer.stop();
}
});
for0.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
chronometer.setBase(SystemClock.elapsedRealtime());
}
});
}
}
1.先设置初始时间
2.再设置格式
3.开始计时器
4.结束计时器
4.设置监听器(可省略)setOnChronometerTickListener
三、实践
1.要求
实现一个登录页面,提供记住密码和用户名功能,登陆后显示列表视图必须包含登录用户名,且点击列表会显示点击那一项
2.代码实现
login.xml
<?xml version="1.0" encoding="utf-8"?>
<TableLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@drawable/ic_launcher_foreground"
android:gravity="center"
android:stretchColumns="0,3">
<TableRow
android:layout_height="wrap_content"
android:layout_width="wrap_content"
>
<TextView/>
<TextView
android:layout_height="wrap_content"
android:layout_width="wrap_content"
android:text="用户名:"
android:textSize="30dp"/>
<EditText
android:id="@+id/user"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:hint="请输入你的用户名"
android:textSize="20dp"/>
<TextView/>
</TableRow>
<TableRow
android:layout_height="wrap_content"
android:layout_width="wrap_content"
>
<TextView/>
<TextView
android:layout_height="wrap_content"
android:layout_width="wrap_content"
android:text="密码:"
android:textSize="30dp"/>
<EditText
android:id="@+id/pwd"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:hint="请输入你的密码"
android:inputType="textPassword"
android:textSize="20dp"/>
<TextView/>
</TableRow>
<TableRow
android:layout_height="wrap_content"
android:layout_width="wrap_content"
>
<TextView/>
<CheckBox
android:id="@+id/remember"
android:text="记住用户名和密码"
android:textSize="15dp"/>
<TextView/>
</TableRow>
<TableRow
android:layout_height="wrap_content"
android:layout_width="wrap_content"
>
<TextView/>
<Button
android:id="@+id/login"
android:layout_height="wrap_content"
android:layout_width="200px"
android:text="登录"
android:textSize="25dp"
/>
<TextView/>
</TableRow>
<TableRow
android:layout_height="wrap_content"
android:layout_width="wrap_content"
>
<TextView/>
<Button
android:id="@+id/re"
android:layout_height="wrap_content"
android:layout_width="200px"
android:text="重置"
android:textSize="25dp"
/>
<TextView/>
</TableRow>
</TableLayout>
item.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="20dp"
android:id="@+id/item_user"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text=" "
android:textSize="20dp"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="20dp"
android:id="@+id/item_num"/>
</LinearLayout>
LoginActivity.java
package com.thundersoft.session1;
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.EditText;
import android.widget.Toast;
import android.content.SharedPreferences.Editor;
import androidx.annotation.Nullable;
import javax.security.auth.login.LoginException;
public class LoginActivity extends Activity {
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.login);
SharedPreferences sp = null;
EditText user = findViewById(R.id.user);
EditText pwd = findViewById(R.id.pwd);
Button login = findViewById(R.id.login);
Button re = findViewById(R.id.re);
CheckBox remember = findViewById(R.id.remember);
sp = this.getSharedPreferences("userinfo", Context.MODE_PRIVATE);
if (sp.getBoolean("checkboxBoolean", false))
{
user.setText(sp.getString("user", null));
pwd.setText(sp.getString("pwd", null));
remember.setChecked(true);
}
SharedPreferences finalSp = sp;
login.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
System.out.println(user.getText().toString());
if(user.getText().toString().trim().equals("")){
Toast.makeText(LoginActivity.this, "请您输入用户名!", Toast.LENGTH_SHORT).show();
return;
}
if(pwd.getText().toString().trim().equals("")){
Toast.makeText(LoginActivity.this, "请您输入密码!", Toast.LENGTH_SHORT).show();
return;
}
Editor editor = finalSp.edit();
if (remember.isChecked())
{
editor.putString("user", user.getText().toString());
editor.putString("pwd", pwd.getText().toString());
editor.putBoolean("checkboxBoolean", true);
}
else
{
editor.putString("user", null);
editor.putString("pwd", null);
editor.putBoolean("checkboxBoolean", false);
}
editor.commit();
Intent intent=new Intent(LoginActivity.this,MainActivity.class);
intent.putExtra("name", user.getText().toString());
startActivity(intent);
finish();
}
});
}
}
MainActivity.java
package com.thundersoft.session1;
import android.app.ListActivity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.SimpleAdapter;
import android.widget.Toast;
import androidx.annotation.Nullable;
import com.thundersoft.session1.R;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.ListIterator;
import java.util.Map;
public class MainActivity extends ListActivity {
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Intent intent = getIntent();
String name = intent.getStringExtra("name");
int[] num = new int[]{1,2,3,4,5};
String[] names = new String[]{name,name,name,name,name};
List<Map<String,Object>> item = new ArrayList<>();
for (int i = 0; i < names.length; i++) {
HashMap<String, Object> map = new HashMap<>();
map.put("num",num[i]);
map.put("name",names[i]);
item.add(map);
}
SimpleAdapter ad = new SimpleAdapter(
this,
item,
R.layout.item,
new String[]{"num", "name"},
new int[]{R.id.item_num, R.id.item_user});
this.setListAdapter(ad);
}
@Override
protected void onListItemClick(ListView l, View v, int position, long id) {
super.onListItemClick(l, v, position, id);
int index = position+1;
Toast.makeText(this,"您选择了第"+ index +"项",Toast.LENGTH_SHORT).show();
}
}
3.实现效果
|