Android界面编程之八 各种杂项组件

本文介绍了 Android 开发中常用的 UI 组件,包括 Toast 提示信息框的使用、CalendarView 的日期选择功能、DatePicker 和 TimePicker 的时间选择功能、NumberPicker 的数值选择功能、SearchView 的搜索功能、TabHost 的标签功能、ScrollView 的滚动功能以及 Notification 的通知功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

此篇将介绍Android其他常用UI组件

2.8.1 使用Toast显示提示信息框
Toast这个提示信息框用于向用户生成简单的提示信息,它有如下特点:
1.Toast 提示不会获得焦点
2.Toast提示会在一段时间后自动消失
使用Toast生成提示消息也非常简单,只要如下几个步骤:
1.调用Toast构造器或makeText()静态方法创建一个Toast对象
2.调用Toast的方法来设置该消息提示对齐方式、页边距等
3.调用Toast的show()方法将它显示出来
示例代码:
public class MainActivity extends ActionBarActivity {

   
@Override
   
protected void onCreate(Bundle savedInstanceState) {
       
super .onCreate(savedInstanceState);
        setContentView(R.layout.
activity_main );
        Button simple = (Button) findViewById(R.id.
simple );
        simple.setOnClickListener(
new OnClickListener()
        {
       
@Override
       
public void onClick(View source)
        {
        Toast toast = Toast.makeText(MainActivity.
this , "simple hint" ,Toast. LENGTH_SHORT );
        toast.show();
        }
        });
        Button bn = (Button) findViewById(R.id.
bn );
        bn.setOnClickListener(
new OnClickListener()
        {
       
@Override
       
public void onClick(View source)
        {
        Toast toast =
new Toast(MainActivity. this );
        toast.setGravity(Gravity.
CENTER , 0, 0);
        ImageView image =
new ImageView(MainActivity. this );
        image.setImageResource(R.drawable.
tools );
        LinearLayout ll =
new LinearLayout(MainActivity. this );
        ll.addView(image);
        TextView textView =
new TextView(MainActivity. this );
        textView.setText(
"hint with pic" );
        textView.setTextSize(20);
        ll.addView(textView);
        toast.setView(ll);
        toast.setDuration(Toast.LENGTH_LONG);
        toast.show();
        }
        });
    }
}

2.8.2 CalendarView
可用于显示和选择日期;若希望监控该组件的日期改变,可调用CalendarView的setOnDateChangeListener()方法为此组件的点击时间添加事件监听器
android:dataTextAppearance


android:firstDayOfWeek


android:focusedMonthDateColor


android:maxDate


android:minDate


android:selectedDateVerticalBar


android:selectedWeekBackgroundColor


android:showWeekNumber


android:shownWeekCount

设置日历总共显示几个星期
android:unfocusedMonthDateColor


android:weekDayTextAppearance


android:weekNumberColor


android:weekSeparatorLineColor


示例代码:
main.xml
< LinearLayout 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:orientation = "vertical" >

   
< TextView
       
android:layout_width = "match_parent"
       
android:layout_height = "wrap_content"
       
android:text = "select your birthday" />
   
< CalendarView
       
android:layout_width = "match_parent"
       
android:layout_height = "match_parent"
       
android:firstDayOfWeek = "3"
       
android:shownWeekCount = "4"
       
android:selectedWeekBackgroundColor = "#aff"
       
android:focusedMonthDateColor = "#f00"
       
android:weekSeparatorLineColor = "#ff0"
       
android:unfocusedMonthDateColor = "#f9f"
       
android:id = "@+id/calendarView"         />

</ LinearLayout >
Java程序代码:
public class MainActivity extends ActionBarActivity {

CalendarView
cv ;
   
@Override
   
protected void onCreate(Bundle savedInstanceState) {
       
super .onCreate(savedInstanceState);
        setContentView(R.layout.
activity_main );
       
cv = (CalendarView) findViewById(R.id. calendarView );
       
cv .setOnDateChangeListener( new OnDateChangeListener()
        {
       
@Override
       
public void onSelectedDayChange(CalendarView view, int year,
       
int month, int dayOfMonth)
        {
        Toast.makeText(MainActivity.
this , "your birthday is" + year + "." + month+ "." +dayOfMonth, Toast. LENGTH_SHORT ).show();
        }
        });
    }
}

2.8.3 DatePicker和TimePicker
程序获取用户选择的日期、时间,可通过
为DatePicker添加OnDateChangedListener进行监听
为TimePicker添加OnTimerChangedListener进行监听
DatePicker支持的XML属性有
android:calendarViewShown
该日期选择是否显示CalendarView组件
android:endYear

android:maxDate

android:minDate

android:spinnerShown
该选择器是否显示Spinner日期选择组件
android:startYear

示例代码:
public class MainActivity extends Activity {

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 );
        DatePicker datePicker = (DatePicker) findViewById(R.id.
datePicker );
        TimePicker timePicker = (TimePicker) findViewById(R.id.
timePicker );
        Calendar c = Calendar.getInstance();
       
year = c.get(Calendar. YEAR );
       
month = c.get(Calendar. MONTH );
       
day = c.get(Calendar. DAY_OF_MONTH );
       
hour = c.get(Calendar. HOUR );
       
minute = c.get(Calendar. MINUTE );
        datePicker.init(
year , month , day , new OnDateChangedListener()
        {
       
@Override
       
public void onDateChanged(DatePicker arg0, int year, int month, int day)
        {
        MainActivity.
this . year = year;
        MainActivity.
this . month = month;
        MainActivity.
this . day = day;
        showDate(year, month, day,
hour , minute );
        }
        });
//        timePicker.setOnTimeChangedListener(new onTimeChangedListener()
//        {
//        @Override
//        public void onTimeChanged(TimePicker view, int hourOfDay, int minute)
//        {
//        MainActivity.this.hour = hourOfDay;
//        MainActivity.this.minute = minute;
//        showDate(year, month, day, hour, minute);
//        }
//        });
    }

   
private void showDate( int year, int month, int day, int hour, int minute)
    {
    EditText show = (EditText) findViewById(R.id.
show );
    show.setText(
"your purcharse day is " +year + "." +
    (month + 1) +
"." + day + "  " + hour + ":" +minute);
    }
}
xml代码:
< LinearLayout 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:orientation = "vertical" >

   
< TextView
       
android:layout_width = "wrap_content"
       
android:layout_height = "wrap_content"
       
android:text = "time you buy the books"
       
android:textSize = "20dp" />
   
< DatePicker
       
android:id = "@+id/datePicker"
       
android:layout_width = "wrap_content"
       
android:layout_height = "200dp"
       
android:layout_gravity = "center_horizontal"
       
android:startYear = "2000"
       
android:endYear = "2012"
       
android:calendarViewShown = "true"
       
android:spinnersShown = "true" />
   
< TimePicker
       
android:id = "@+id/timePicker"
       
android:layout_width = "wrap_content"
       
android:layout_height = "100dp"
       
android:layout_gravity = "center_horizontal"
       
/>
   
< EditText
       
android:id = "@+id/show"
       
android:layout_width = "match_parent"
       
android:layout_height = "wrap_content"
       
android:editable = "false"
       
android:cursorVisible = "false"
       
/>

</ LinearLayout >

2.8.4 NumberPicker 
用户可通过拖动来选择数值。常用的方法如下:
setMinValue(int minVal)
设置该组件支持的最小值
setMaxValue(int maxVal)
设置该组件支持的最大值
setValue(int value)
设置该组件的当前值
示例代码:
public class MainActivity extends ActionBarActivity {

NumberPicker
np1 , np2 ;
int minPrice = 25;
int maxPrice = 75;

   
@Override
   
protected void onCreate(Bundle savedInstanceState) {
       
super .onCreate(savedInstanceState);
        setContentView(R.layout.
activity_main );
       
np1 = (NumberPicker) findViewById(R.id. np1 );
       
np1 .setMinValue(10);
       
np1 .setMaxValue(50);
       
np1 .setValue( minPrice );
       
np1 .setOnValueChangedListener( new OnValueChangeListener()
        {
       
@Override
       
public void onValueChange(NumberPicker picker, int oldVal, int newVal)
        {
       
minPrice = newVal;
        showSelectedPrice();
        }
        });
       
np2 = (NumberPicker) findViewById(R.id. np2 );
       
np2 .setMinValue(60);
       
np2 .setMaxValue(100);
       
np2 .setValue( maxPrice );
       
np2 .setOnValueChangedListener( new OnValueChangeListener()
        {
       
@Override
       
public void onValueChange(NumberPicker picker, int oldVal, int newVal)
        {
       
maxPrice = newVal;
        showSelectedPrice();
        }
        });
    }
   
public void showSelectedPrice()
    {
    Toast.makeText(
this , "the lowest price you've choosen is" + minPrice
    +
", the highest price is" + maxPrice , Toast. LENGTH_SHORT ).show();
    }
}
main.xml代码:
< TableLayout 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" >

   
< TableRow
       
android:layout_width = "match_parent"
       
android:layout_height = "wrap_content" >
   
< TextView
       
android:text = "choose low price"
       
android:layout_width = "120dp"
       
android:layout_height = "wrap_content" />
   
< NumberPicker
       
android:id = "@+id/np1"
       
android:layout_width = "match_parent"
       
android:layout_height = "80dp"
       
android:focusable = "true"
       
android:focusableInTouchMode = "true" />
   
</ TableRow >
   
< TableRow
       
android:layout_width = "match_parent"
       
android:layout_height = "wrap_content" >
   
< TextView
       
android:text = "choose high price"
       
android:layout_width = "120dp"
       
android:layout_height = "wrap_content" />
   
< NumberPicker
       
android:id = "@+id/np2"
       
android:layout_width = "match_parent"
       
android:layout_height = "80dp"
       
android:focusable = "true"
       
android:focusableInTouchMode = "true" />
   
</ TableRow >

</ TableLayout >

2.8.5 SearchView 
常用方法:
setIconifiedByDefault(boolean iconified)
设置该搜索框默认是否自动缩小为图标
setSubmitButtonEnable(boolean enabled)
设置是否显示搜索框
setQueryHint(CharSequence hint)

setOnQueryTextListener(SearchView.OnQueryTextListenter listener)
为该搜索框设置事件监听器
若为SearchView增加一个配套的ListView,则可以为SearchView增加自动完成功能
示例代码:
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 = (ListView) findViewById(R.id. lv );
       
lv .setAdapter( new ArrayAdapter<String>( this ,android.R.layout. simple_list_item_1 , mStrings ));
       
sv = (SearchView) findViewById(R.id. sv );
       
sv .setIconifiedByDefault( false );
       
sv .setOnQueryTextListener( this );
       
sv .setSubmitButtonEnabled( true );
       
sv .setQueryHint( "search" );
    }
   
@Override
   
public boolean onQueryTextChange(String newText)
    {
   
if (TextUtils.isEmpty(newText))
    {
   
lv .clearTextFilter();
    }
   
else
    {
   
lv .setFilterText(newText);
    }
   
return true ;
    }
   
@Override
   
public boolean onQueryTextSubmit(String query)
    {
    Toast.makeText(
this , "your choice is " +query, Toast. LENGTH_SHORT ).show();
   
return false ;
    }
}
main.xml代码:
< LinearLayout 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:orientation = "vertical" >

   
< SearchView
       
android:id = "@+id/sv"
       
android:layout_width = "wrap_content"
       
android:layout_height = "wrap_content" />
   
< ListView
       
android:id = "@+id/lv"
       
android:layout_width = "match_parent"
       
android:layout_height = "0dp"
       
android:layout_weight = "1" ></ ListView >

</ LinearLayout >

2.8.6 TabHost
TabHost可以在窗口上放置多个标签,与TabWidget结合使用的还有如下组件:
TabWidget
代表选项卡的标签条
TabSpec
代表选项卡的一个Tab页面
TabHost仅仅是一个简单的容器,它提供了如下两个方法来创建、添加选项卡:
newTabSpec(String tag)
创建选项卡
addTab(TabHost.TabSpec tabSpec)
添加选项卡
使用TabHost的一般步骤如下:
  1. 在布局界面中定义TabHost组件,并为该组件定义该选项卡内容
  2. Activity应该继承TabActivity
  3. 调用TabActivity的getTabHost()方法获取TabHost对象
  4. 通过TabHost对象的方法来创建、添加选项卡
tips:若想监听,设置TabHost.OnTabChangeListener
TabHost使用时 main.xml中需要结合TabWidget使用,并且
TabHost
@android:id/tabhos
TabWidget
@android:id/tabs
FrameLayout
@android:id/tabcontent
上面3个ID是Android系统已有ID
示例代码:
main.xml
< TabHost xmlns:android = "http://schemas.android.com/apk/res/android"
   
xmlns:tools = "http://schemas.android.com/tools"
   
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
           
android:id = "@android:id/tabs"
       
android:layout_width = "match_parent"
      
android:layout_height = "wrap_content" />
       
< FrameLayout
           
android:id = "@android:id/tabcontent"
       
android:layout_width = "match_parent"
       
android:layout_height = "match_parent" >
           
< LinearLayout
               
android:id = "@+id/tab01"
               
android:orientation = "vertical"
       
android:layout_width = "match_parent"
       
android:layout_height = "match_parent" >
               
< TextView
       
android:layout_width = "wrap_content"
       
android:layout_height = "wrap_content"
       
android:text = "testview" />
               
< TextView
       
android:layout_width = "wrap_content"
       
android:layout_height = "wrap_content"
       
android:text = "testview 2" />
           
</ LinearLayout >
           
< LinearLayout
               
android:id = "@+id/tab02"
               
android:orientation = "vertical"
       
android:layout_width = "match_parent"
       
android:layout_height = "match_parent" >
               
< TextView
       
android:layout_width = "wrap_content"
       
android:layout_height = "wrap_content"
       
android:text = "testview" />
               
< TextView
       
android:layout_width = "wrap_content"
       
android:layout_height = "wrap_content"
       
android:text = "testview 2" />
           
</ LinearLayout >
           
< LinearLayout
               
android:id = "@+id/tab03"
               
android:orientation = "vertical"
       
android:layout_width = "match_parent"
       
android:layout_height = "match_parent" >
               
< TextView
       
android:layout_width = "wrap_content"
       
android:layout_height = "wrap_content"
       
android:text = "testview" />
               
< TextView
       
android:layout_width = "wrap_content"
       
android:layout_height = "wrap_content"
       
android:text = "testview 2" />
           
</ LinearLayout >
       
</ FrameLayout >
           
   
</ LinearLayout >

</ TabHost >
Java代码:
public class MainActivity extends TabActivity {

   
@Override
   
protected void onCreate(Bundle savedInstanceState) {
       
super .onCreate(savedInstanceState);
        setContentView(R.layout.
activity_main );
        TabHost tabHost = getTabHost();
        TabSpec tab1 = tabHost.newTabSpec(
"tab1" )
        .setIndicator(
"Accepted" )
        .setContent(R.id.
tab01 );
        tabHost.addTab(tab1);
        TabSpec tab2 = tabHost.newTabSpec(
"tab2" )
        .setIndicator(
"Called" ,getResources().getDrawable(R.drawable. ic_launcher ))
        .setContent(R.id.
tab02 );
        tabHost.addTab(tab2);
        TabSpec tab3 = tabHost.newTabSpec(
"tab3" )
        .setIndicator(
"Missed" )
        .setContent(R.id.
tab03 );
        tabHost.addTab(tab3);
    }
}

2.8.7 ScrollView
由FrameLayout派生,作用是为普通组件添加滚动条,ScrollView只能包含一个组件。
ScrollView只能为应用添加垂直滚动条,若想添加水平滚动条,需借助HorizontalScrollView实现
示例代码:(TextView的内容必须使屏幕显示不下~~)
< 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" >

   
< HorizontalScrollView
       
android:layout_width = "match_parent"
       
android:layout_height = "wrap_content" >

       
< LinearLayout
           
android:layout_width = "match_parent"
           
android:layout_height = "match_parent"
           
android:orientation = "vertical" >

             <!—  众多TextView 定义省略 -->
        </ LinearLayout >
   
</ HorizontalScrollView >

</ ScrollView >

2.8.8 Notification
通知,即显示在手机状态栏的状态。Notification所代表的是一种具有全局效果的通知,程序一般通过NotificationManage服务来发送Notification
Android3.0 增加了Notification.Builder类,提供了如下常用方法
setDefaults()
设置通知LED灯、音乐、振动
setAutoCancel()
设置点击通知后,状态栏自动删除
setContentTitle()
设置通知图标
setContentText()
设置通知内容
setSmallIcon()
设置通知图标
setTick()
设置在状态栏的提示文本
setContentIntent()
设置点击通知后要启动的程序对应的PendingIntent
发送Notification的步骤如下:
  1. 调用getSystemService(NOTIFICATION_SERVICE)方法获取系统的NotificationManager服务
  2. 通过构造器设置各种属性
  3. 为Notification设置各种属性
  4. 通过NotificationManager发送Notification
示例代码:
public class MainActivity extends ActionBarActivity {

static final int NOTIFICATION_ID = 0X123;
NotificationManager
nm ;
   
@Override
   
protected void onCreate(Bundle savedInstanceState) {
       
super .onCreate(savedInstanceState);
        setContentView(R.layout.
activity_main );
       
nm = (NotificationManager)
        getSystemService(
NOTIFICATION_SERVICE );
    }
   
public void send(View source)
    {
    Intent intent =
new Intent(MainActivity. this , OtherActivity. class );
    PendingIntent pi = PendingIntent.getActivity(MainActivity.
this , 0, intent, 0);
    Notification notify =
new Notification.Builder( this )
    .setAutoCancel(
true )
    .setTicker(
"MSG" )
    .setSmallIcon(R.drawable.
ic_launcher )
    .setContentTitle(
"a new message" )
    .setContentText(
"congratulations, you have passed our test" )
//    .setDefault(Notification.DEFAULT_SOUND)
//    .setSound()
    .setWhen(System.currentTimeMillis())
    .setContentIntent(pi)
    .build();
   
nm .notify( NOTIFICATION_ID , notify);
    }
   
public void del(View v)
    {
   
nm .cancel( NOTIFICATION_ID );
    }
}
main.xml代码:
<? xml version = "1.0" encoding = "utf-8" ?>
< LinearLayout xmlns:android = "http://schemas.android.com/apk/res/android"
android:orientation = "horizontal"
android:layout_width = "fill_parent"
android:layout_height = "fill_parent"
android:gravity = "center_horizontal"
>
< Button
android:layout_width = "wrap_content"
android:layout_height = "wrap_content"
android:text = "发送Notification"
android:onClick = "send"
/>
< Button
android:layout_width = "wrap_content"
android:layout_height = "wrap_content"
android:text = "删除Notification"
android:onClick = "del"
/>
</ LinearLayout >

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值