搜索框(SearchView)
选项卡TabHost
数值选择器(NumberPicker)
时间和日期选择器:DataPicker与TimePicker
日历视图-CalendarView
带图片的Toast
图片关联联系人QuickContactBadge
列表选择框Spinner
搜索框(SearchView)的功能与用法
SearchView是搜索框组件,它可以让用户在文本框内输入汉字,并允许通过监听器监控用户输入,当用户用户输入完成后提交搜索按钮时,也通过监听器执行实际的搜索。
使用SearchView时可以使用如下常用方法。
setIconifiedByDefault(boolean iconified):设置该搜索框默认是否自动缩小为图标。
setSubmitButtonEnabled(boolean enabled):设置是否显示搜索按钮。
setQueryHint(CharSequence hint):设置搜索框内默认显示的提示文本。
setOnQueryTextListener(SearchView.OnQueryTextListener listener):为该搜索框设置事件监听器。
如果为SearchView增加一个配套的ListView,则可以为SearchView增加自动完成的功能。如下实例示范了SearchView的功能与用法。
实例:
package com.example.administrator;
import android.os.Build;
import android.os.Bundle;
import android.app.Activity;
import android.support.annotation.RequiresApi;
import android.text.TextUtils;
import android.util.Log;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.SearchView;
import android.widget.Toast;
public class MainActivity extends Activity implements SearchView.OnQueryTextListener {
private SearchView sv;
private ListView lv;
//自动完成的列表
private final String[] mStrings = {"aaaaaa", "bbbbbb", "cccccc"};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
lv = findViewById(R.id.lv);
lv.setAdapter(new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, mStrings));
lv.setTextFilterEnabled(true);
lv.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@RequiresApi(api = Build.VERSION_CODES.O)
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
sv.setQuery(mStrings[position],true);
}
});
sv = findViewById(R.id.sv);
//设置该SearchView默认是否自动缩小为图标
sv.setIconifiedByDefault(true);
//为该SearchView组件设置事件监听器
sv.setOnQueryTextListener(this);
//设置该SearchView显示搜索按钮
sv.setSubmitButtonEnabled(true);
//设置该SearchView内默认显示的提示文本
sv.setQueryHint("查找");
}
//用户输入字符时激发该方法
@Override
public boolean onQueryTextChange(String newText) {
Log.i("onQueryTextChange", "onQueryTextChange: "+newText);
// TODO Auto-generated method stub
if (TextUtils.isEmpty(newText)) {
//清除ListView的过滤
lv.clearTextFilter();
} else {
//使用用户输入的内容对ListView的列表项进行过滤
lv.setFilterText(newText);
}
return true;
}
//单击搜索按钮时激发该方法
@Override
public boolean onQueryTextSubmit(String query) {
// TODO Auto-generated method stub
//实际应用中应该在该方法内执行实际查询
//此处仅使用Toast显示用户输入的查询内容
Toast.makeText(this, "您选择的是:" + query, Toast.LENGTH_SHORT).show();
return true;
}
}
选项卡TabHost介绍
1,选项卡TabHost介绍
TabHost可以方便地在窗口上放置多个标签页,每个标签页相当于获得了一个与外部容器大小相同的组件摆放区域
TabHost是一个简单的容器,提供如下两种方法来创建选项卡
newTabSpec(String tag):创建选项卡
addTab(TabHost.TabSpec tabSpec):添加选项卡
2,使用在布局文件中使用TabHost,不用继承TabActivity使用findViewById获取TabHost组件
- 在界面布局中定义TabHost组件,并为该组件定义选项卡内容
- 使用findViewById获取TabHost组件
- 通过TabHost对象的方法来创建和添加选项卡
3,实例
layout/activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<TabHost xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@android:id/tabhost"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_weight="1">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<!-- TabWidget组件id值不可变-->
<TabWidget
android:id="@android:id/tabs"
android:layout_width="match_parent"
android:layout_height="wrap_content">
</TabWidget>
<!-- FrameLayout布局,id值不可变-->
<FrameLayout
android:id="@android:id/tabcontent"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout_above="@android:id/tabs">
<!-- 第一个tab的布局 -->
<LinearLayout
android:id="@+id/tab1"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="第一个tab的布局" />
</LinearLayout>
<!-- 第二个tab的布局 -->
<LinearLayout
android:id="@+id/tab2"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="第二个tab的布局" />
</LinearLayout>
</FrameLayout>
</LinearLayout>
</TabHost>
com/example/administrator/MainActivity.java
package com.example.administrator;
import android.app.Activity;
import android.os.Build;
import android.os.Bundle;
import android.support.annotation.RequiresApi;
import android.widget.TabHost;
public class MainActivity extends Activity {
@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
TabHost tab = findViewById(android.R.id.tabhost);
//初始化TabHost容器
tab.setup();
//在TabHost创建标签,然后设置:标题/图标/标签页布局
tab.addTab(tab.newTabSpec("tab1").setIndicator("本地音乐", getDrawable(R.drawable.car)).setContent(R.id.tab1));
tab.addTab(tab.newTabSpec("tab2").setIndicator("网络音乐", null).setContent(R.id.tab2));
}
}
数值选择器(NumberPicker)的功能与用法
数值选择器用于让用户输入数值,用户既可以通过键盘输入数值,也可以通过拖动来选择数值。使用该组件常用如下三个方法。
setMinValue(int minVal):设置该组件支持的最小值。
setMaxValue(int maxVal):设置该组件支持的最大值。
setValue(int value):设置该组件的当前值。
实例:选择您意向的价格范围
com/example/administrator/MainActivity.java
package com.example.administrator;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.EditText;
import android.widget.NumberPicker;
import android.widget.NumberPicker.OnValueChangeListener;
public class MainActivity extends Activity implements View.OnClickListener {
private final String TAG = "MainActivity";
private NumberPicker np1, np2;
//定义最低价格、最高价格的初始值
private int minPrice = 25;
private int maxPrice = 75;
private EditText down;
private EditText up;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
down = findViewById(R.id.et_down);
up = findViewById(R.id.et_up);
down.setOnClickListener(this);
up.setOnClickListener(this);
Log.i(TAG, "onCreate: " + Thread.currentThread().getName());
np1 = new NumberPicker(this);
np2 = new NumberPicker(this);
//设置np1的最小值和最大值
np1.setMinValue(10);
np1.setMaxValue(50);
//设置np1的当前值
np1.setValue(minPrice);
np1.setOnValueChangedListener(new OnValueChangeListener() {
@Override
public void onValueChange(NumberPicker picker, int oldVal, int newVal) {
minPrice = newVal;
}
});
//设置np2的最小值和最大值
np2.setMinValue(60);
np2.setMaxValue(100);
//设置np2的当前值
np2.setValue(maxPrice);
np2.setOnValueChangedListener(new OnValueChangeListener() {
@Override
public void onValueChange(NumberPicker picker, int oldVal, int newVal) {
maxPrice = newVal;
}
});
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.et_down:
new AlertDialog.Builder(MainActivity.this).setView(np1).setPositiveButton("确定", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
down.setText(minPrice + "");
}
}).show();
break;
case R.id.et_up:
new AlertDialog.Builder(MainActivity.this).setView(np2).setPositiveButton("确定", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
up.setText(maxPrice + "");
}
}).show();
break;
}
}
}
时间和日期选择器:DataPicker与TimePicker
一、实现动态输入日期和时间
DataPicker(日历选择器)
DataPicker对象以init()方法指定DatePicker初始的年月日及OnDateChangedListener事件
Timepicker(时间选择器)
Timepicker对象直接以setOnTimeChangedListener()事件处理时间改变时称需要做的操作
二、监听器
OnDateChangedListener
当用户更改了DataPicker中的年、月、日将触发OnDateChangedListener监听器的onDateChange()事件
OntimeChangedListener
当用户更改了TimePicker中的时、分、秒将触发OnTimeChangedListener监听器的onTimeChange()事件
OnDateSetListener
当用户更改了DataPickerDialog中的年、月、日将触发OnDateSetListener监听器的onDateSet()事件
OnTimeSetListener
当用户更改了TimePickerDialog中的时、分、秒将触发OnTimeSetListener监听器的onTimeSet()事件
三、实例
layout/activity_main.xml
<?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="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical"
tools:context=".MainActivity">
<Button
android:id="@+id/show_data"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="显示日期控件" />
<Button
android:id="@+id/show_time"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="显示时间控件" />
<Button
android:id="@+id/show_data_d"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="以Dialog形式显示日期控件" />
<Button
android:id="@+id/show_time_d"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="以Dialog形式显示时间控件" />
<RelativeLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content">
<DatePicker
android:id="@+id/dataPicker"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<TimePicker
android:visibility="gone"
android:id="@+id/timePicker"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</RelativeLayout>
</LinearLayout>
com/example/administrator/MainActivity.java
package com.example.administrator;
import android.app.Activity;
import android.app.DatePickerDialog;
import android.app.TimePickerDialog;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.DatePicker;
import android.widget.TimePicker;
import android.widget.Toast;
import java.util.Calendar;
import java.util.TimeZone;
public class MainActivity extends Activity implements View.OnClickListener {
private DatePicker datapicker;
private TimePicker timePicker;
private Calendar cal;
private int year;
private int month;
private int day;
private int hour;
private int minute;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
//实例化一个日历实例,括号里的内容是解决差8个小时的问题
cal = Calendar.getInstance(TimeZone.getTimeZone("GMT+8:00"));
year = cal.get(Calendar.YEAR);
month = cal.get(Calendar.MONTH) + 1;
day = cal.get(Calendar.DAY_OF_MONTH);
hour = cal.get(Calendar.HOUR_OF_DAY);
minute = cal.get(Calendar.MINUTE);
}
private void initView() {
findViewById(R.id.show_data).setOnClickListener(this);
findViewById(R.id.show_time).setOnClickListener(this);
findViewById(R.id.show_data_d).setOnClickListener(this);
findViewById(R.id.show_time_d).setOnClickListener(this);
datapicker = findViewById(R.id.dataPicker);
timePicker = findViewById(R.id.timePicker);
}
@Override
public void onClick(View v) {
switch (v.getId()) {
//显示日期
case R.id.show_data:
timePicker.setVisibility(View.GONE);
datapicker.setVisibility(View.VISIBLE);
datapicker.init(year, cal.get(Calendar.MONTH), day, new DatePicker.OnDateChangedListener() {
@Override
public void onDateChanged(DatePicker view, int year, int monthOfYear, int dayOfMonth) {
Toast.makeText(MainActivity.this, "当前日期是:" + year + "-" + (monthOfYear + 1) + "-" + dayOfMonth, Toast.LENGTH_SHORT).show();
}
});
break;
//显示时间
case R.id.show_time:
timePicker.setVisibility(View.VISIBLE);
datapicker.setVisibility(View.GONE);
timePicker.setOnTimeChangedListener(new TimePicker.OnTimeChangedListener() {
@Override
public void onTimeChanged(TimePicker timePicker, int hourOfday, int minute) {
Toast.makeText(MainActivity.this, "当前时间是:" + hourOfday + ":" + minute, Toast.LENGTH_SHORT).show();
}
});
break;
//显示在对话框中的日期
case R.id.show_data_d:
new DatePickerDialog(this, new DatePickerDialog.OnDateSetListener() {
@Override
public void onDateSet(DatePicker datePicker, int year, int monthOfYear, int dayOfMonth) {
Toast.makeText(MainActivity.this, "当前日期是:" + year + "-" + (monthOfYear + 1) + "-" + dayOfMonth, Toast.LENGTH_SHORT).show();
}
}, year, cal.get(Calendar.MONTH), day).show();
break;
//显示在对话框中的时间
case R.id.show_time_d:
new TimePickerDialog(this, new TimePickerDialog.OnTimeSetListener() {
@Override
public void onTimeSet(TimePicker timePicker, int hourOfday, int minute) {
Toast.makeText(MainActivity.this, "当前时间是:" + hourOfday + ":" + minute, Toast.LENGTH_SHORT).show();
}
}, hour, minute, true).show();
break;
}
}
}
日历视图-CalendarView
日历组件(CalendarView)可以用于显示和选择日期,用户即可选择一个日期,也可通过触摸来滚动日历。
如果要监控该组件的日期改变,可调用CalendarView的setOnDataChangeListener()方法为该组件的点击事件添加事件监听器。
CalendarView的常见XML属性如下:
XML属性 相关方法说明
android:firstDayOfWeek setFirstDayOfWeek(int) 设置每周的第一天,允许设置周一到周日任意一天作为每周的第一天
android:shownWeekCount setShownWeekCount() 设置该日历组件总共显示几个星期(目前已过时)
android:selectedWeekBackgroundColor setSelectedWeekBackgroundColor(int) 设置被选中周的背景色(目前已过时)
android:focusedMonthDateColor setFocusedMonthDateColor(int) 设置获得焦点的月份的日期文字的颜色(目前已过时)
android:unfocusedMonthDateColor setUnfocusedMonthDateColor(int) 设置没有焦点的月份的日期文字的颜色(目前已过时)
实例:
calendarView = (CalendarView) findViewById(R.id.calendarViewId);
//设置监听
calendarView.setOnDateChangeListener(new CalendarView.OnDateChangeListener() {
public void onSelectedDayChange(CalendarView view, int year, int month, int dayOfMonth) {
String content = year + "-" + (month + 1) + "-" + dayOfMonth;
Toast.makeText(MainActivity.this, "你选择了:\n" + content, Toast.LENGTH_SHORT).show();
}
});
带图片的Toast
代码实现:
Toast toast = new Toast(this);
LinearLayout ll = new LinearLayout(this);
ll.setGravity(Gravity.CENTER);
ll.setOrientation(LinearLayout.HORIZONTAL);
ImageView imageView = new ImageView(this);
imageView.setImageResource(R.drawable.car);
TextView textView = new TextView(this);
textView.setText("我的带图片的Toast");
ll.addView(imageView,0);
ll.addView(textView,1);
toast.setView(ll);
toast.setDuration(Toast.LENGTH_SHORT);
toast.show();
图片关联联系人QuickContactBadge
-
QuickContactBadge继承了ImageView,因此它的本质也是图片,也可以通过android:src属性指定它显示的图片。
-
QuickcontactBadge额外增加的功能是:该图片可以关联到手机中指定联系人,当用户单击该图片时,系统将会打开相应联系人的联系方式界面。
相关方法
为了让QuickContactBadge与特定联系人关联,可以调用如下方法进行关联。
assignContactFromEmail(String emailAddress,boolean lazyLookup):将该图片关联到指定E-mail 地址对应的联系人。
assignContactFromPhone(String phoneNumber,boolean lazyLookup):将该图片关联到指定电话号码对应的联系人。
assignContactFromUri(Uri contactUri):将该图片关联到特定Uri对应的联系人。
代码实现:
1,布局文件
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
xmlns:app="http://schemas.android.com/apk/res-auto">
<QuickContactBadge
android:layout_marginTop="30dp"
android:layout_marginLeft="20dp"
android:id="@+id/badge"
android:layout_width="20dp"
android:layout_height="20dp"
android:src="@mipmap/ic_launcher"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toLeftOf="@id/desc"
app:layout_constraintBottom_toBottomOf="@id/badge"
/>
<TextView
app:layout_constraintLeft_toRightOf="@id/badge"
android:id="@+id/desc"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="16dp"
android:text="点击图片,打开联系人"
/>
</android.support.constraint.ConstraintLayout>
2,Java代码
QuickContactBadge badge = findViewById(R.id.badge);
badge.assignContactFromPhone("456",false);
列表选择框Spinner
代码实现:
1,布局中
<Spinner
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:entries="@array/books"
android:popupBackground="#66ccff"
android:dropDownWidth="230dp"
/> >
<Spinner
android:id="@+id/spinner"
android:layout_width="match_parent"
android:layout_height="wrap_content"
/>
2,Java中
//获取界面布局文件的Spinner组件
spinner = (Spinner) findViewById(R.id.spinner);
String[] arr={"孙悟空","猪八戒","唐僧"};
//创建ArrayAdapter对象
// ArrayAdapter<String> adapter=new ArrayAdapter<String>(this,android.R.layout.simple_list_item_multiple_choice,arr);
ArrayAdapter<String> adapter=new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1,arr);
spinner.setAdapter(adapter);
spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> adapterView, View view, int i, long l) {
String select = adapterView.getItemAtPosition(i).toString();//取得被选中的列表项的文字
Toast.makeText(MainActivity.this,select,Toast.LENGTH_SHORT).show();
}
@Override
public void onNothingSelected(AdapterView<?> adapterView) {
}
});