搜索框(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) {
}
});