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) {

       }
   });












  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值