第五组组件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
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和TimePickerDialogAlertDialog:
这种对话框最常用,但是大体上分为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函数自动取消对话框,这样一个较为智能的进度条对话框就做好了。