自定义UI:
View子类,复写onRraw()方法。
public class CustomView extends View {
@Override
protected void onDraw(Canvas canvas) {
// TODO Auto-generated method stub
super.onDraw(canvas);
Paint paint=new Paint();
paint.setAntiAlias(true);
paint.setColor(Color.GREEN);
canvas.drawCircle(20, 20, 15, paint);
}
/**
* @param context
*/
public CustomView(Context context) {
super(context);
// TODO Auto-generated constructor stub
}
}
public class MainActivity extends Activity {
private CustomView customView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
customView=new CustomView(this);
this.setContentView(customView);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
}
对ListView或ListActivity的适配
1、ArrayAdapter
public class MainActivity extends Activity {
private ListView list;
private String[]contents={"java","C++","C#","android","ios"};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
list=(ListView)this.findViewById(R.id.list1);
//调用系统的View显示
ArrayAdapter<String> adapter=new ArrayAdapter<String>(this,
android.R.layout.simple_list_item_1, contents);
list.setAdapter(adapter);
}
2、SimpleAdapter
主要是针对List<Map<>>集合的ListView的适配
public class MainActivity extends Activity {
private ListView list;
private String[]contents={"面向对象","移动开发","面向过程"};
private String[]oo={"java","android","C langue"};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
list=(ListView)this.findViewById(R.id.list1);
//所有列的数据
List<Map<String,String>> list1=new ArrayList<Map<String,String>>();
for(int i=0;i<contents.length;i++){
//每一行的数据用map集合保存
Map<String,String> map=new HashMap<String, String>();
map.put("head",android.R.drawable.sym_contact_card+"");
map.put("txt1", contents[i]);
map.put("txt2",oo[i]);
list1.add(map);
}
//适配器中第一个参数是当前的上下文,第二个是list集合,第三个是每一行要显示的布局,第四个是集合中的key值,第五个是集合中的值要填充的具体控件
SimpleAdapter adapter=new SimpleAdapter(this, list1,R.layout.my_simple_text_view,
new String[]{"head","txt1","txt2"},new int[]{R.id.head_img,R.id.text_view1,R.id.text_view2});
list.setAdapter(adapter);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
}
布局文件:(有可能覆盖)
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
>
<ImageView
android:id="@+id/head_img"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="60sp"
android:orientation="vertical" >
<TextView
android:id="@+id/text_view1"
android:layout_width="wrap_content"
android:layout_height="30dp" />
<TextView
android:id="@+id/text_view2"
android:layout_width="wrap_content"
android:layout_height="30dp"
android:textColor="#ff0000"/>
</LinearLayout>
</LinearLayout>
ListView布局
Spinner布局如下:
radioGroup:
适配器每项数据要显示的布局文件:
<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textColor="#f00"
android:textSize="15sp"
android:padding="10dp"
>"
</TextView>
package com.example.android_ui;
import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.View;
//import android.widget.AdapterView;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.AdapterView.OnItemSelectedListener;
import android.widget.ArrayAdapter;
import android.widget.CompoundButton;
import android.widget.RadioGroup.OnCheckedChangeListener;
//import android.widget.CompoundButton.OnCheckedChangeListener;
import android.widget.ListView;
import android.widget.RadioButton;
import android.widget.RadioGroup;
import android.widget.Spinner;
import android.widget.Toast;
public class ViewActivity extends Activity {
private String[] contents={"C","C++","java","android","C#","javaWeb","asp.net"};
private RadioButton radioButton1,radioButton2;
private RadioGroup radioGroup ;
private ListView listView;
private Spinner spinner;
private void initView(){
radioButton1=(RadioButton)this.findViewById(R.id.radio_1);
radioButton2=(RadioButton)this.findViewById(R.id.radio_2);
radioGroup=(RadioGroup)this.findViewById(R.id.rg_1);
listView=(ListView)this.findViewById(R.id.list_view);
spinner=(Spinner)this.findViewById(R.id.spinner1);
Log.i("<<<<", "initView()完成");
}
private void setListenr(){
//radioButon多选按钮
/*radioButton1.setOnCheckedChangeListener(new OnCheckedChangeListener() {
//RadionButton 实例的监听接口
@Override
public void onCheckedChanged(CompoundButton arg0, boolean arg1) {
Toast.makeText(ViewActivity.this,"您选择了1000"+arg1, 1000).show();
}
});
radioButton2.setOnCheckedChangeListener(new OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton arg0, boolean arg1) {
// TODO Auto-generated method stub
Toast.makeText(ViewActivity.this,"您选择了2000"+arg1, 1000).show();
}
});*/
//radioGroupd单选按钮,获得radioGroup实例即可
radioGroup.setOnCheckedChangeListener(new OnCheckedChangeListener() {
@Override
public void onCheckedChanged(RadioGroup arg0, int arg1) {
// TODO Auto-generated method stub
if(arg1==R.id.rg_1_java){
Toast.makeText(ViewActivity.this,"您选择了java"+arg1, 1000).show();
}
else{
Toast.makeText(ViewActivity.this,"您选择了android"+arg1, 1000).show();
}
}
});
//listView实例绑定监听器,arg2是每项的索引值
/*listView.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,
long arg3) {
Toast.makeText(ViewActivity.this,"您选择了"+contents[arg2], 1000).show();
}
});
*/
spinner.setOnItemSelectedListener(new OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> arg0, View arg1, int arg2,
long arg3) {
Toast.makeText(ViewActivity.this,"您选择了"+contents[arg2], 1000).show();
}
@Override
public void onNothingSelected(AdapterView<?> arg0) {
Toast.makeText(ViewActivity.this,"您尚未选择", 1000).show();
}
});
}
private void setAdapter(){
//第一个参数是上下文,第二个是内容显示布局,第三个是要显示的内容
ArrayAdapter<String> adapter=new ArrayAdapter<String>(this,
R.layout.item_view, contents);
//listView.setAdapter(adapter);
spinner.setAdapter(adapter);
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//实例化组件
initView();
//设置适配器
setAdapter();
//设置监听
setListenr();
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
}
自定义对话框
布局:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
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:paddingBottom="15px"
android:text="请输入登录信息:"
android:textColor="#00ff00"
android:textSize="25sp" />
<TableLayout
android:layout_width="match_parent"
android:layout_height="wrap_content" >
<TableRow>
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingLeft="20dp"
android:text="姓名:"
android:textSize="20sp" />
<EditText
android:id="@+id/edit_user_name"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="请输入姓名" />
</TableRow>
<TableRow>
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingLeft="20dp"
android:text="密码:"
android:textSize="20sp" />
<EditText
android:id="@+id/edit_user_password"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="请输入密码" />
</TableRow>
</TableLayout>
<Button
android:id="@+id/sure"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="确定"
android:layout_marginLeft="150dp"
/>
</LinearLayout>
//自定义对话框
private void showCustomDialog(){
Button btnCustomDialog=(Button)this.findViewById(R.id.btn_custom_dialog);
btnCustomDialog.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Dialog dialog=new Dialog( BaseDialog.this);
dialog.setContentView(R.layout.custom_dialog);
dialog.setTitle("登录");
dialog.show();
//handleDialog();
}
});
}
AlterDialog对话框
//alertdialog
private void showAlertDialog(){
Button btnAlertDialog=(Button)this.findViewById(R.id.btn_alert_dialog);
btnAlertDialog.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//首先获取当前Activity的LayoutInflater:
LayoutInflater layout=BaseDialog.this.getLayoutInflater();
//接着使用LayoutInflater对象获取Layout
View view=layout.inflate(R.layout.custom_dialog,null);
//获得AlertDialog的实例
AlertDialog alertDialog=new AlertDialog.Builder(BaseDialog.this).setIcon(android.R.drawable.dialog_frame)
.setTitle("提示")
.setMessage("确定退出?")
.setCancelable(false)
.setView(view)//可以自己定义该对话框的风格
.setNegativeButton("No",new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.cancel();//
//dialog.dismiss();
}
} )
.setPositiveButton("Yes",new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
// TODO Auto-generated method stub
BaseDialog.this.finish();
}
}).show();//不能忘记!!!
}
});
}
ProgressDialog 可以在子线程里更新UI。
private void progressDialog(){
progressDialog=new ProgressDialog(BaseDialog.this);
progressDialog.setTitle("模拟任务完成进度");
progressDialog.setMax(100);
progressDialog.setMessage("任务进行中,请稍后......");
progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
progressDialog.show();
/*Button button=(Button)this.findViewById(R.id.btn_progress_dialog);
button.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {*/
new Thread(new Runnable() {
@Override
public void run() {
try {
for(int i=0;i<50;i++){
Thread.sleep(1000);
//progressDialog可以在子线程里更新进度公式=当前值和总大小的比值乘上progress设置的最大值
progressDialog.setProgress(i*100/50);
}
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}).start();
//}
//});
}
DatePickerDialog
private void showDatePickerDialog(){
Button button=(Button)findViewById(R.id.btn_date_dialog);
button.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
//先获得日历实例
Calendar calendar=Calendar.getInstance();
//注意日期对话框
new DatePickerDialog(BaseDialog.this,
new DatePickerDialog.OnDateSetListener() {
@Override
public void onDateSet(DatePicker view, int year, int monthOfYear,int dayOfMonth) {
Toast.makeText(BaseDialog.this,"设置时间是:"+year+"年"+monthOfYear+"月"+dayOfMonth+"天", 1000).show();
}
}, calendar.get(Calendar.YEAR),calendar.get(Calendar.MONTH), calendar.get(Calendar.DAY_OF_MONTH)).show();
}
});
}
TimePickerDialog
private void showTimePickerDialog(){
Button button=(Button)findViewById(R.id.btn_time_dialog);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Calendar calendar=Calendar.getInstance();
new TimePickerDialog(BaseDialog.this,new OnTimeSetListener() {
@Override
public void onTimeSet(TimePicker view, int hourOfDay, int minute) {
Toast.makeText(BaseDialog.this,"设置时间是:"+ hourOfDay+"时"+minute+"分", 1000).show();
}
}, calendar.get(Calendar.HOUR_OF_DAY),calendar.get(Calendar.MINUTE),true).show();
}
});
}
AutoCompleteTextView:
//自动完成文本
private void showAutoCompleteTextView(){
AutoCompleteTextView autoCompleteTextView=(AutoCompleteTextView)this.findViewById(R.id.actv);
//建立数据源
String[] countries = new String[]{
"Afghanistan", "Albania", "Algeria", "American Samoa", "Andorra",
"Angola", "Anguilla", "Antarctica", "Antigua and Barbuda", "Argentina",
"Armenia", "Aruba", "Australia", "Austria", "Azerbaijan",
"Bahrain", "Bangladesh", "Barbados", "Belarus", "Belgium",
"Belize", "Benin", "Bermuda", "Bhutan", "Bolivia",
"Bosnia and Herzegovina", "Botswana", "Bouvet Island", "Brazil", "British Indian Ocean Territory",
"British Virgin Islands", "Brunei", "Bulgaria", "Burkina Faso", "Burundi",
"Cote d'Ivoire", "Cambodia", "Cameroon", "Canada", "Cape Verde",
"Cayman Islands", "Central African Republic", "Chad", "Chile", "China",
"Christmas Island", "Cocos (Keeling) Islands", "Colombia", "Comoros", "Congo",
"Cook Islands", "Costa Rica", "Croatia", "Cuba", "Cyprus", "Czech Republic",
"Democratic Republic of the Congo", "Denmark", "Djibouti", "Dominica", "Dominican Republic",
"East Timor", "Ecuador", "Egypt", "El Salvador", "Equatorial Guinea", "Eritrea",
"Estonia", "Ethiopia", "Faeroe Islands", "Falkland Islands", "Fiji", "Finland",
"Former Yugoslav Republic of Macedonia", "France", "French Guiana", "French Polynesia",
"French Southern Territories", "Gabon", "Georgia", "Germany", "Ghana", "Gibraltar",
"Greece", "Greenland", "Grenada", "Guadeloupe", "Guam", "Guatemala", "Guinea", "Guinea-Bissau",
"Guyana", "Haiti", "Heard Island and McDonald Islands", "Honduras", "Hong Kong", "Hungary",
"Iceland", "India", "Indonesia", "Iran", "Iraq", "Ireland", "Israel", "Italy", "Jamaica",
"Japan", "Jordan", "Kazakhstan", "Kenya", "Kiribati", "Kuwait", "Kyrgyzstan", "Laos",
"Latvia", "Lebanon", "Lesotho", "Liberia", "Libya", "Liechtenstein", "Lithuania", "Luxembourg",
"Macau", "Madagascar", "Malawi", "Malaysia", "Maldives", "Mali", "Malta", "Marshall Islands",
"Martinique", "Mauritania", "Mauritius", "Mayotte", "Mexico", "Micronesia", "Moldova",
"Monaco", "Mongolia", "Montserrat", "Morocco", "Mozambique", "Myanmar", "Namibia",
"Nauru", "Nepal", "Netherlands", "Netherlands Antilles", "New Caledonia", "New Zealand",
"Nicaragua", "Niger", "Nigeria", "Niue", "Norfolk Island", "North Korea", "Northern Marianas",
"Norway", "Oman", "Pakistan", "Palau", "Panama", "Papua New Guinea", "Paraguay", "Peru",
"Philippines", "Pitcairn Islands", "Poland", "Portugal", "Puerto Rico", "Qatar",
"Reunion", "Romania", "Russia", "Rwanda", "Sqo Tome and Principe", "Saint Helena",
"Saint Kitts and Nevis", "Saint Lucia", "Saint Pierre and Miquelon",
"Saint Vincent and the Grenadines", "Samoa", "San Marino", "Saudi Arabia", "Senegal",
"Seychelles", "Sierra Leone", "Singapore", "Slovakia", "Slovenia", "Solomon Islands",
"Somalia", "South Africa", "South Georgia and the South Sandwich Islands", "South Korea",
"Spain", "Sri Lanka", "Sudan", "Suriname", "Svalbard and Jan Mayen", "Swaziland", "Sweden",
"Switzerland", "Syria", "Taiwan", "Tajikistan", "Tanzania", "Thailand", "The Bahamas",
"The Gambia", "Togo", "Tokelau", "Tonga", "Trinidad and Tobago", "Tunisia", "Turkey",
"Turkmenistan", "Turks and Caicos Islands", "Tuvalu", "Virgin Islands", "Uganda",
"Ukraine", "United Arab Emirates", "United Kingdom",
"United States", "United States Minor Outlying Islands", "Uruguay", "Uzbekistan",
"Vanuatu", "Vatican City", "Venezuela", "Vietnam", "Wallis and Futuna", "Western Sahara",
"Yemen", "Yugoslavia", "Zambia", "Zimbabwe"} ;
ArrayAdapter<String> adapter=new ArrayAdapter<String>(this,R.layout.item_view1, countries);
autoCompleteTextView.setAdapter(adapter);
}
五星评分条:
//五星评分条
private void showRatingBar(){
RatingBar bar=(RatingBar)this.findViewById(R.id.rating_bar);
bar.setOnRatingBarChangeListener(new OnRatingBarChangeListener() {
@Override
public void onRatingChanged(RatingBar ratingBar, float rating,
boolean fromUser) {
Toast.makeText(MainActivity.this,"rating="+rating, 1000).show();
}
});
}
QuickContactBadge
<QuickContactBadge
android:id="@+id/quick_contact_badge"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="#00ffff"
android:src="@drawable/ic_launcher"
/>
M没有这个图标是显示不出来的!!!
private void showQuickContactBadge(){
QuickContactBadge badge=(QuickContactBadge)this.findViewById(R.id.quick_contact_badge);
//true表示点击才有动作
badge.assignContactFromPhone("13047220489",true);
}
Seekbar
<SeekBar
android:id="@+id/seek_bar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:max="100"
android:progress="20"
/>
//拖动条
private void showSeeBar(){
SeekBar bar=(SeekBar)this.findViewById(R.id.seek_bar);
bar.setOnSeekBarChangeListener(new OnSeekBarChangeListener() {
@Override
public void onStopTrackingTouch(SeekBar seekBar) {
Toast.makeText(MainActivity.this,"停止进度="+seekBar.getProgress(), 1000).show();
}
@Override
public void onStartTrackingTouch(SeekBar seekBar) {
Toast.makeText(MainActivity.this,"开始进度="+seekBar.getProgress(), 1000).show();
}
@Override
public void onProgressChanged(SeekBar seekBar, int progress,
boolean fromUser) {
Toast.makeText(MainActivity.this,"进度="+progress, 1000).show();
}
});
}
CheckBox
private void showCheckBox(){
CheckBox box1=(CheckBox)this.findViewById(R.id.check_box1);
box1.setOnCheckedChangeListener(new OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
if(isChecked==true)
Toast.makeText(MainActivity.this,"您选择了"+buttonView.getText().toString(),1000).show();
else{
Toast.makeText(MainActivity.this,"尚未选择!!!",1000).show();
}
}
});
CheckBox box2=(CheckBox)this.findViewById(R.id.check_box2);
box2.setOnCheckedChangeListener(new OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
if(isChecked==true)
Toast.makeText(MainActivity.this,"您选择了"+buttonView.getText().toString(),1000).show();
else{
Toast.makeText(MainActivity.this,"尚未选择!!!",1000).show();
}
}
});
}
ToggleButton
数值选择器
private void showNumberPicker(){
//获得引用
NumberPicker numberPicker=(NumberPicker)this.findViewById(R.id.number_picker_button);
//设置初值
numberPicker.setMaxValue(200);
numberPicker.setMinValue(10);
numberPicker.setValue(5);
numberPicker.setOnValueChangedListener(new OnValueChangeListener() {
@Override
public void onValueChange(NumberPicker picker, int oldVal, int newVal) {
if(newVal==100){
AlertDialog alertDialog=new AlertDialog.Builder(MainActivity.this).setIcon(android.R.drawable.title_bar)
.setTitle("提示")
.setMessage("恭喜正确!!!")
.setNegativeButton("关闭对话框", new OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
// TODO Auto-generated method stub
dialog.cancel();
}
}).show();
}
}
});
}