Android第二章(2)

第五组组件ProgressBar:

进度条通过style属性设置风格:




创建 ProgressBar的例子:
 <ProgressBar 
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            style="@android:style/Widget.ProgressBar.Large"/>
        <ProgressBar 
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"/>
环形进度条是不显示进度的,只是一个一直绕圈的环,设为水平进度条才会显示进度:
<ProgressBar 
        android:id="@+id/bar1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:max="100"
        style="@android:style/Widget.ProgressBar.Horizontal"/>
    <ProgressBar 
        android:id="@+id/bar2"
        android:layout_width="match_parent"
        android:layout_height="50px"
        android:max="100"
        style="@android:style/Widget.ProgressBar.Horizontal"
        android:progressDrawable="@drawable/my_bar"/>
其中android:progressDrawable设置的是进度条的自定义样子,需要指定的 layer-list的Drawable:
<layer-list xmlns:android="http://schemas.android.com/apk/res/android" >
    <item 
        android:id="@android:id/background"
        android:drawable="@drawable/abc_ic_clear"/>
    <item 
        android:id="@android:id/progress"
        android:drawable="@drawable/abc_ic_go"/>

</layer-list>
设置进度条进度的值:
new Thread()
		{

			@Override
			public void run()
			{
				// TODO Auto-generated method stub
				while(status<100)
				{
					status=dowork();
					handler.sendEmptyMessage(0x123);
				}
			}
			
		}.start();
Handler handler=new Handler()
	{

		@Override
		public void handleMessage(Message msg)
		{
			// TODO Auto-generated method stub
			if(msg.what==0x123)
			{
				bar1.setProgress(status);
				bar2.setProgress(status);
			}
		}
		
	};

SeekBar:拖动条,是ProgressBar的子类,所以ProgressBar能用的属性它都能用,android:thumb是可拖动的那块东东,属性值为Drawable对象,响应拖动的函数是OnSeekBarChangeListener
<SeekBar 
        android:id="@+id/seekbar"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:max="255"
        android:progress="255"/>
seekBar.setOnSeekBarChangeListener(new OnSeekBarChangeListener()
		{
			
			@Override
			public void onStopTrackingTouch(SeekBar arg0)
			{
				// TODO Auto-generated method stub
				
			}
			
			@Override
			public void onStartTrackingTouch(SeekBar arg0)
			{
				// TODO Auto-generated method stub
				
			}
			
			@Override
			public void onProgressChanged(SeekBar arg0, int arg1, boolean arg2)
			{
				// TODO Auto-generated method stub
				imageView.setAlpha(arg1);
			}
		});

RatingBar:星级评分条,这个与Seekbar类似,但是它是一颗一颗星星组成的,以下是一些特有的属性:

<RatingBar 
        android:id="@+id/ratingbar"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center_horizontal"
        android:numStars="5"
        android:stepSize="0.5"/>
对应的处理函数:setOnRatingBarChangeListener


第五组组件:ViewSwitcher

书本上关于这个的例子很复杂,setFactroy什么的,inflate什么的看不懂,但是网上有这个组件的其他简单使用方法!首先这个组件是FrameLayout的子类,这意味着这个组件一次也只能显示一个View,而且不存在FrameLayout覆盖的问题,是真正的一次只能显示一个组件,除此之外还有showPrevious(),showNext()等方法更换当前显示组件,我们只需在<ViewSwitcher></ViewSwitcher>标签内写好各个想显示的组件,它就会自动只显示最上面那个,当你调用那2个函数的时候就会更换显示的View组件。
 <ViewSwitcher 
        android:id="@+id/viewswitcher"
        android:layout_width="match_parent"
        android:layout_height="300px">
        <TextView 
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center"
            android:text="hello"/>
        <ImageView 
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:src="@drawable/ic_launcher"
            android:scaleType="fitCenter"/>
    </ViewSwitcher>


第六组组件:杂件

Toast:用于短暂显示文字的提示框,也可以显示一些复杂一些的组件,但是本意就是为了简单显示文字罢了。
/*Toast toast=Toast.makeText(MainActivity.this, "简单消息展示", Toast.LENGTH_SHORT);
toast.show();*/
Toast toast=new Toast(MainActivity.this);
ImageView imageView=new ImageView(MainActivity.this);
imageView.setImageResource(R.drawable.ic_launcher);
toast.setView(imageView);
toast.setDuration(Toast.LENGTH_SHORT);
toast.show();

DatePicker和TimePicker:选择日期的组件,TimePicker就是选择小时和分钟的,没什么其他特别的属性设置,但是DatePicker因为有年份,所以可以设置开始年份和结束年份:android:startYear和android:EndYear:
<DatePicker 
            android:id="@+id/datepicker"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:startYear="2000"
            android:endYear="2014"/>
        <TimePicker 
            android:id="@+id/timepicker"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"/>
同时他们都有变化的监听器:注意实验结果月份那里是从0开始的
datePicker.init(2014, 6, 21,new OnDateChangedListener()
		{
			
			@Override
			public void onDateChanged(DatePicker arg0, int arg1, int arg2, int arg3)
			{
				// TODO Auto-generated method stub
				textView1.setText(arg1+"年 "+(arg2+1)+"月"+arg3+"日");
			}
		});
		timePicker.setOnTimeChangedListener(new OnTimeChangedListener()
		{
			
			@Override
			public void onTimeChanged(TimePicker arg0, int arg1, int arg2)
			{
				// TODO Auto-generated method stub
				textView2.setText(arg1+"时"+arg2+"分");
			}
		});

TabHost:
TabHost与TabSpec与FrameLayout混合在一起使用:
<?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">
    <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="120px"/>
        <FrameLayout 
            android:id="@android:id/tabcontent"
            android:layout_width="match_parent"
            android:layout_height="match_parent">
            <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="Tab1文字测试"/>
                <ImageView 
                    android:layout_width="wrap_content"
                     android:layout_height="wrap_content"
                     android:src="@drawable/ic_launcher"/>
            </LinearLayout>
            <LinearLayout 
                android:id="@+id/tab2"
                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="Tab2文字测试"/>
                <ImageView 
                    android:layout_width="wrap_content"
                     android:layout_height="wrap_content"
                     android:src="@drawable/ic_launcher"/>
            </LinearLayout>
            <LinearLayout 
                android:id="@+id/tab3"
                android:layout_width="match_parent"
                android:layout_height="match_parent">
                <TextView 
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:text="Tab3文字测试"/>
                <ImageView 
                    android:layout_width="wrap_content"
                     android:layout_height="wrap_content"
                     android:src="@drawable/ic_launcher"/>
            </LinearLayout>
        </FrameLayout>
     </LinearLayout>
</TabHost>

注意TabHost的id,TabSpec的id和FrameLayout的id都是系统的,tab分页按钮位于TabSpec中,每个Tab页面内容在FrameLayout里面
Activity必须是extends TabActivity类才行:
TabHost tabhost=getTabHost();
		TabSpec tab1=tabhost.newTabSpec("tab1")
				.setIndicator("已接电话")
				.setContent(R.id.tab1);
		tabhost.addTab(tab1);
		
		TabSpec tab2=tabhost.newTabSpec("tab2").setContent(R.id.tab2).setIndicator("呼出电话", getResources().getDrawable(R.drawable.ic_launcher));
		tabhost.addTab(tab2);
		
		TabSpec tab3=tabhost.newTabSpec("tab3")
				.setIndicator("未接电话")
				.setContent(R.id.tab3);
		tabhost.addTab(tab3);

ScrollView和HorizontalScrollView:提供滚动条,注意的地方就是他们只能包含一个组件!


对话框:

常用的对话框有4种:AlertDialog,ProgressDialog,DatePickerDialog和TimePickerDialog

AlertDialog:

这种对话框最常用,但是大体上分为4个区域:图标区,标题区,内容区和按钮区;
用AlertDialog.Builder类--->SetIcon---->SetTitle
另外设置内容区的方法较多:SetMessage()设置单一的文字信息,SetItems()参数里面有数组,对话框变成一个叫你选择的列表框了,SetSingleChoiceItems()和SetMultiChoiceItems()单选和多选对话框,setAdapter()用Adapter来设置列表框对话框的内容样式,还有SetView(),个人感觉这个应该是最好用了。
Button btn1=(Button)findViewById(R.id.btn1);
		btn1.setOnClickListener(new OnClickListener()
		{
			
			@Override
			public void onClick(View arg0)
			{
				// TODO Auto-generated method stub
				AlertDialog.Builder builder=new AlertDialog.Builder(MainActivity.this);
				LinearLayout layout=(LinearLayout)getLayoutInflater().inflate(R.layout.login_main, null);
				builder.setView(layout);
				builder.create();
				builder.show();
			}
		});
其中
LinearLayout layout=(LinearLayout)getLayoutInflater().inflate(R.layout.login_main, null);
这一句是把一个布局管理器作为View返回,这里明确下findViewById是在绑定了布局管理器的前提下找那个布局管理器里面的组件,inflate则是获取其他布局管理器。


DatePickerDialog与TimePickerDialog:

这2个对话框比较简单,就是之前的DatePicker和TimePicker的基础上加上一个设置按钮和一个取消按钮做成一个对话框罢了。
只需要new一个DatePickerDialog对象,并且show()出来就行,参数里面有个按设置按钮的响应函数要写:
final EditText edit=(EditText)findViewById(R.id.edit);
		edit.setOnClickListener(new OnClickListener()
		{
			Calendar c=Calendar.getInstance();
			@Override
			public void onClick(View arg0)
			{
				// TODO Auto-generated method stub
				DatePickerDialog datedlg=new DatePickerDialog(MainActivity.this, new DatePickerDialog.OnDateSetListener()
				{
					
					@Override
					public void onDateSet(DatePicker arg0, int arg1, int arg2, int arg3)
					{
						// TODO Auto-generated method stub
						edit.setText(arg1+"-"+arg2+"-"+arg3);
					}
				}, c.get(Calendar.YEAR), c.get(Calendar.MONTH), c.get(Calendar.DAY_OF_MONTH));
				datedlg.show();
			}
		});
按一下EditText就弹出对话框选时间,选好之后按设置按钮,把时间setText到EditText文本中,不用用户自己写时间这么傻。

ProgressDialog:

这种对话框和ProgressBar很类似的,只是做成对话框模式,本质是一样的。

ProgressDialog pd;
	private int status=0;
	Handler handler=new Handler()
	{

		@Override
		public void handleMessage(Message msg)
		{
			// TODO Auto-generated method stub
			if(msg.what==0x123)
			{
				pd.setProgress(status);
			}
			else if(msg.what==0x124)
			{
				pd.cancel();
			}
		}
		
	};
	@Override
	protected void onCreate(Bundle savedInstanceState)
	{
		super.onCreate(savedInstanceState);
		setContentView(R.layout.dialog_main);
		Button btn=(Button)findViewById(R.id.btn1);
		btn.setOnClickListener(new OnClickListener()
		{
			
			@Override
			public void onClick(View arg0)
			{
				// TODO Auto-generated method stub
				pd=new ProgressDialog(MainActivity.this);
				pd.setMessage("正在努力中  >.<");
				pd.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
				pd.show();
				new Thread()
				{
					@Override
					public void run()
					{
						// TODO Auto-generated method stub
						while(status<100)
						{
							status=dowork();
							handler.sendEmptyMessage(0x123);
						}
						handler.sendEmptyMessage(0x124);
					}
					
				}.start();
			}
		});
	}
	public int dowork()
	{
		try
		{
			Thread.sleep(200);
		} catch (InterruptedException e)
		{
			// TODO: handle exception
		}
		return ++status;
	}
创建一个进度条对话框,设置了下内容和进度条样式之后就show出来,然后另起一个线程跑其他工作,并且根据进度改变进度条的值,100%的时候条用cancel函数自动取消对话框,这样一个较为智能的进度条对话框就做好了。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值