Android控件一:基本控件

搜索框(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組件

  1. 在界面佈局中定義TabHost組件,併爲該組件定義選項卡內容
  2. 使用findViewById獲取TabHost組件
  3. 通過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) {

       }
   });












發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章