android初探
1.dialog对话框:
A.警告对话框:AlertDialog,可以有0到3个按钮,一个单选框或复选框列表的对话框,警告对话框可创建大多数的交互界面,是推荐的类型
B.进度对话框ProgressDialog:显示一个进度环或进度条,由于它是AlertDialog的扩展,所以也支持按钮
C.日期选择对话框DatePickerDialog:让用户选择一个日期
D.时间选择对话框TimePickerDialog:让用户选择一个时间
E.如果你希望自定义对话框,可以扩展
2.创建对话框:
A.普通的告警对话框:
创建AlertDialog的方式:
AlertDialog.Builder builder=new AlertDialog.Builder(this);
//设置警告信息,设置对话框不可取消(不能用back键取消)
builder.setMessage(“你确定退出吗”).setCancelable(false)
//设置警告按钮
.setPositiveButton(“确定”,new DialogInterface.OnClickListener(){
public void onClick(DialogInterface dialog,int id){
MyActivity.this.finish();
}
}
.setNegativeButton(“取消”,new AlertDialog.OnClickListener(){
public void onClick(DialogInterface dialog,int id){
Dialog.cancel();
}
});
AlertDialog alert=builder.create();
alert.show();//显示对话框
B.创建具有可选项的AlertDialog对话框:
final CharSequence[] items={“红”,”绿”,”蓝”};
AlertDialog.Builder builder=new AlertDialog.Builder(this);
builder.setTitle(“请选择一种颜色:”);
builder.setItems(items,new DialogInterface.OnClickListener(){
public void onClick(DialogInterface dialog,int item){
Toast.makeText(getApplicationContext(),items[item],
Toast.LENGTH_SHORT).show();
}
});
AlertDialog alert=builder.create();
alert.show();//显示对话框
C.创建单选框和多选框
final CharSequence[] items={“红”,”绿”,”蓝”};
AlertDialog.Builder builder=new AlertDialog.Builder(this);
builder.setTitle(“请选择一种颜色:”);
builder.setSingleChoiceItems(items,-1,new DialogInterface.OnClickListener(){
public void onClick(DialogInterface dialog,int item){
Toast.makeText(getApplicationContext(),items[item],
Toast.LENGTH_SHORT).show();
}
});
AlertDialog alert=builder.create();
alert.show();//显示对话框
第二个参数表示默认选中的选项位置,使用-1表示默认情况下不选中任何选项
创建多选列表使用setMultiChoiceItems()方法
D.创建进度条对话框
ProgressDialog progressDialog;
progressDialog=new ProgressDialog(mcontext);
//设置进度条显示样式
progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
//设置进度条显示内容
progressDialog.setMessage(“Loading...”);
//进度条是否可取消
progressDialog.setCancelable(false);
E.信息内容是一个简单的view类型
new AlertDialog.Builder(this).setTitle(“请输入”)
.setIcon(R.drawable.ic_dialog_info)
.setView(new EditText(this))
.setPositiveButton(“确定”,null)
.setNegativeButton(“取消”,null).show();
F.信息内容是一组单选框
new AlertDialog.Builder(this).setTitle(“单选框”)
.setIcon(R.drawable.ic_dialog_info)
.setSingleChoiceItems(new String[]{“item1”,”item2”},0,new DialogInterface.OnClickListener(){
public void onClick(DialogInterface dialog,int which){
dialog.dismiss();
}
}).setNegativeButton(“取消”,null).show();
G.信息内容是一组复选框
new AlertDialog.Builder(this).setTitle(“复选框”)
.setMultiChoiceItems(new String[]{“item1”,“item2”},null,null)
.setPositiveButton(“确定”,null)
.setNegativeButton(“取消”,null).show();
H.信息内容是一组简单的列表
new AlertDialog.Builder(this).setTitle(“列表框”)
.setItems(new String[]{“item1”,”item2”})
.setPositiveButton(“确定”,null).show();
I.信息内容为一个自定义的布局文件
LayoutInflater inflater=getLayoutInflater();
View view=inflater.inflate(R.layout.dialog,null);
new AlertDialog.Builder(this).setTitle(“自定义布局”)
.setPositiveButton(“确定”,null)
.setNegaviteButton(“取消”,null).show();
3.五大布局:
A.线性布局LinearLayout,线性布局以设置的垂直或水平属性值,来排列所有的子元素。所有的子元素都会排列在其他元素之后,因此一个垂直列表的每一行只有一个元素,而一个水平列表只有一个行高,
线性布局保持子元素之间的间隔以及互相对齐。线性布局还支持为单独的子元素设置weight,好处是允许子元素填充屏幕的剩余空间,子元素指定weight值,剩余的空间就会按照子元素的weight比例分配给子元素,weight用法归纳:按比例划分水平方向,将涉及到的view的android:width设置为0dp,然后设置android:
Weight为相应的比例即可;竖直方向,只需设置android:height为0dp,之后设置weight属性即可。
ViewGroup继承自View,AbsoluteLayout,LinearLayout,FrameLayout,RelativeLayout继承自ViewGroup,TableLayout继承自LinearLayout
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent" android:orientation="vertical">
<EditText android:text="EditText"
android:id="@+id/editText1"
android:gravity=”center”
android:layout_height="wrap_content"
android:layout_width="fill_parent">
</EditText>
<LinearLayout android:id="@+id/linearLayout1"
android:layout_height="fill_parent"
android:layout_width="fill_parent"
android:gravity="right">
<Button android:id=@+id/btn
Android:text=”button”/>
</LinearLayout>
</LinearLayout>
android:gravity属性设置管理器内组件的对齐方式,该属性支持top,bottom,left,right,center_vertical,fill_vertical,center_horizontal,
fill_horizontal,center,fill,
clip_horizontal,clip_vertical几个属性,也可以同时指定多重对齐方式的组合,如left|center_vertical代表出现在屏幕左边,而且垂直居中
B.表格布局TableLayout,表格布局将子元素的位置分配到行或列中,一个TableLayout由多个TableRow组成,每一个TableRow都会有一个row。表格布局不会显示row,columns和cell的边框线。表格允许单元格为空,单元格不能跨列,如果直接向TableLayout添加组件,那么该组件将直接占一行
a. 代码示例:
<?xml version="1.0" encoding="utf-8"?>
<TableLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width=”fill_parent”
android:layout_height=”fill_parent”
android:stretchColumns=”1”>
<TableRow>
<TextView android:layout_column=”1”
android:padding=”3dip”
Android:text=”1row”/>
</TableRow>
<TableRow>
<TextView android:layout_column=”1”
android:padding=”3dip”
Android:text=”2row”/>
</TableRow>
</TableLayout>
b. 其他xml属性:
android:collapseColumns:设置需要被隐藏的列序号,多个序列号之间用逗号隔开
android:shrinkColumns:设置允许被收缩的列的列序号,多个序列号之间用逗号隔开
android:stretchColumns:设置允许被拉伸的列的列序号,多个序列号之间用逗号隔开
C.相对布局RelativeLayout,相对布局允许子元素指定它们相对于其他元素或父元素的位置(通过ID指定)。因此,你可以右对齐,或上下或置于屏幕的中央的形式来排列元素。元素按顺序排列,因此如果第一个元素位于屏幕的中央,那么相对这个元素的其他元素将以屏幕中央的相对位置来排列。
a.代码示例:
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width=”fill_parent”
android:layout_height=”fill_parent”
<TextView android:id=”@+id/label”
android:layout_width=”fill_parent”
android:layout_height=”wrap_content”
Android:text=”欢迎访问我的博客”/>
<EditText android:id=”@+id/entry”
android:layout_width=”fill_parent”
android:layout_height=”wrap_content”
android:layout_below=”@id/label”/>
<Button android:id=”@+id/btn”
android:layout_width=”wrap_content”
android:layout_height=”wrap_content”
android:layout_below=”@id/label”
android:layout_alignParentRight=”true”
android:layout_marginLeft=”10dip”
android:text=”OK”/>
<Button android:layout_width=”wrap_content”
android:layout_height=”wrap_content”
android:layout_toLeftOf=”@id/btn”
android:layout_alignTop=”@id/btn”
android:text=”取消”/>
</RelativeLayout>
b.android:layout_toRightOf:控制该子组件位于给出id组件的右侧, android:layout_toRightOf: 控制该子组件位于给出id组件的左侧
android:layout_above: 控制该子组件位于给出id组件的上方;android:layout_below: 控制该子组件位于给出id组件的下方
android:layout_alignTop: 控制该子组件位于给出id组件的上边界对齐;android:layout_alignBottom: 控制该子组件位于给出id组件的下边界对齐
android:layout_alignLeft: 控制该子组件位于给出id组件的左边界对齐;android:layout_alignRight: 控制该子组件位于给出id组件的右边界对齐
值均为给出组件的id:android:layout_alignLeft=”@id/view”
D.绝对布局AbsoluteLayout,绝对布局可以让子元素指定准确的x,y坐标并显示在屏幕上。(0,0)为左上角,当向下或向右移动时坐标值变大。绝对布局没有页边框,允许元素之间相互重叠(尽管不推荐)。
E.框架布局FrameLayout,框架布局被定制为屏幕上的一个空白备用区域,之后你可以在其中填充一个单一对象。所有的子元素都会固定在屏幕的左上角,不能为框架布局的一个子元素指定位置,后一个子元素将会直接在前一个子元素上进行填充覆盖,把它们部分或全部挡住。
4.活动之间的跳转:
A.startActivity(Intent):只是从当前界面跳到另外一个界面,两个界面不再有联系
B.startActivityForResult(intent):可以经当前界面认为当前界面为一个父窗体,要跳转的界面为子窗体,当子窗体关闭时,父窗体会执行onActivityResult()方法,并可以获得子窗体的返回值
C.代码:
Intent intent=new Intent();
//传递参数
intent.putExtra(“myText”,”你好,第二个活动”);
intent.setClass(MainActivity.this,SecondActivity.class);
startActivity(intent);
SecondActivity中获取参数代码:
//从MainActivity跳转到SecondActivity利用Intent传递参数
Intent intent=getIntent();
String info=intent.getStringExtra(“myText”);
注:SecondActivity需在activityMainfest当中进行注册
使用Bundle传递参数:
Intent intent=new Intent();
Bundle bundle=new Bundle();
bundle.putString(“info”,”你好”);
intent.putExtras(bundle);
intent.setClass(MainActivity.this,SecondActivity.class);
startActivity(intent);
SecondActivity中获取参数代码:
Bundle bundle=this.getIntent().getExtras();
String text=bundle.getString(“info”);
5.android使用http协议与服务器通信:
A.android目前只提供两种http 通信方式,HttpURLConnection和HttpClient,HttpURLConnection多用于接收和发送流式数据,因此比较适合上传和下载文件
B.HttpClient通信流程:
a创建HttpClient对象,该对象可用来多次发送不同的http请求
b.创建HttpPost或HttpGet对象,设置参数,每发送一次http请求,都需要这样一个对象
c.利用HttpClient的execute方法发送请求并等待结果,该方法会一直阻塞当前线程,直到返回结果或抛出异常
d.针对结果或异常做相应处理
C.需考虑的问题:
a.HttpClient对象可以重复使用,可以作为类的静态变量
b.HttpGet和HttpPost一般无法重复使用,可创建一个方法用来初始化,同时设置一些需要上传到服务器的资源
c.目前android不再支持在UI线程中发起http请求,这样会阻塞UI线程,因此还需要一个子线程发送http请求,执行execute方法
d.不同的请求对应不同的返回结果,对于如何处理结果(一般都是json或UI更新),需要一定的自由度
e.简单来说,每次需要发送http 请求时,开一个子线程用于发送请求,子线程接收到结果或抛出异常时,根据情况向UI线程发送message,最后在UI线程的handler或handleMessage方法中做结果解析和UI更新
D.代码示例:
public class MainActivity extends Activity{
//模拟器把自己当成localhost,服务器应为10.0.2.2
private static String url=”http://10.0.2.2:8080/PDAServer/login.action”;
private static Handler handler=new Handler();
protected void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
getPDAServiceData(url);
}
//请求服务
private void getPDAServiceData(String url){
url+=”?username=123456”;
HttpClient client=new DefaultHttpClient();
HttpPost request;
//以下红色字体需处理异常
request=new HttpPost(new URL(url));
HttpReponse response=client.execute(request);
//判断请求是否成功
if(reponse.getStatusLine().getStatusCode==200){
HttpEntity entity=reponse.getEntity();
if(entity!=null){
String out=EntityUtils.toString(entity);
//将从服务器获取的数据展示出来,使用多线程的方式
handler.post(new Runnable(){
public void run(){
new AlertDialog.Builder(this).setMessage(out).create().show();
}
});
}
}
}
}
6.Handler多线程处理
A.Handler,直接继承自Object,它允许发送和处理message或Runnable对象,并且会关联到主线程MessageQueue中,每个handler就是一个单独的线程,并且关联到消息队列的线程。
当实例化一个handler时,它就承载着一个线程和一个消息队列的线程,这个线程就可以把message或Runnable压入到消息队列,并且从消息队列中取出message或Runnable,进而操作他们
B.Handler主要有两个作用:在工作线程中发送消息;在UI线程中获取、处理消息
C.Handler压入消息队列有两大体系:post和sendMessage
a.Post:Post允许把一个Runnable对象压入到消息队列中。它的方法有:post(Runnable),postAtTime(Runnable,long),postDelayed(Runnable,long)
b.sendMessage:sendMessage允许把一个包含消息数据的Message对象压入到消息队列中,它的方法有:
sendEmptyMessage(int),sendMessage(Message),sendMessageAtTime(Message,long),sendMessageDelayed(Message,long)
D.Post:对于handler的post方式来说,它会传递一个Runnable对象到消息队列中,在Runnable对象中重写run方法,一般在这个run方法中写入需要在UI现呈上进行的操作,关于post方式的方法:
a.boolean post(Runnable r):把一个Runnable对象入队到消息队列中,UI线程从消息队列中取出这个对象后,立即执行
b.boolean postAtTime(Runnable r,long uptimeMillis):把一个Runnable对象入队到消息队列中,UI线程从消息队列中取出这个对象后,在特定的时间执行
c.boolean postDelayed(Runnable r,long delayMillis):把一个Runnable对象入队到消息队列中,UI线程从消息队列中取出这个对象后,延迟delayMillis秒执行
d.void removeCallbacks(Runnable r):从消息队列中移除一个Runnable对象
e.代码示例:
public class HandlerPostActivity extends Activity{
private Button btn1,btn2;
private TextView testView;
//声明一个Handler对象
pirvate Handler handler=new Handler();
protected void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
btn1=(Button)findViewById(R.id.btn1);
btn2=(Button)findViewById(R.id.btn2);
testView=(TextView )findViewById(R.id.testView);
btn1.setOnClickListener(new View.OnClickListener(){
public void click(View v){
//新启动一个子线程
new Thread(new Runnable(){
public void run(){
//使用post方式修改UI组件testView的text属性
handler.post(new Runnable(){
public void run(){
testView.setText(“使用handler 的post方式在工作线程中发送一段执行到消息队列中,在主线程中执行”);
}
}
}
}).start();
}
});
btn1.setOnClickListener(new View.OnClickListener(){
public void click(View v){
//新启动一个子线程
new Thread(new Runnable(){
public void run(){
//使用postDelayed方式修改组件testView的text属性
handler.postDelayed(new Runnable(){
public void run(){
testView.setText(“使用handler postDelayed发送一段到消息队列中国,在主线程中延迟3s执行”);
}
},3000);
}
}).start();
}
});
}
注意:对于post方式而言,它其中Runnable对象的run方法,均执行在UI线程上,所以对于这段代码而言,不能执行在UI线程上的操作,一样无法使用post方式
f.代码示例2:使用post方式从互联网上获取一张图片,并显示ImageView中
public class HandlerPostActivity extends Activity{
private Button btn;
private ImageView imageView;
private static String image_path = "http://ww4.sinaimg.cn/bmiddle/786013a5jw1e7akotp4bcj20c80i3aao.jpg";
private ProgressDialog dialog;
//一个静态的handler,handler建议声明为静态的
private static Handler handler=new Handler();
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.asynctask_activity);
btn=(Button)findViewById(R.id.btn);
imageView=(ImageView)findById(R.id.imageView);
//设置进度条提示
dialog=new ProgressDialog(this);
dialog.setTitle(“提示”);
dialog.setMessage(“正在下载,请稍后...”);
dialog.setCancelable(false);
btn.setOnClickListener(new View.OnClickListener(){
public void onClick(View v){
//开启一个子线程,用于下载图片
new Thread(new MyThread()).start();
dialog.show();
}
});
}
public class MyThread implements Runnable{
public void run(){
//下载一个图片
HttpClient client=new DefaultHttpClient();
HttpGet httpGet=new HttpGet(image_path);
HttpReponse httpReponse=null;
//红色字体需处理异常
httpResponse=client.execute(httpGet);
if (httpResponse.getStatusLine().getStatusCode() == 200) {
byte[] data=EntityUtils.toByteArray(httpResponse.getEntity());
//得到一个bitmap对象,并且为了使能够在post访问,必须声明为final
final Bitmap bmp=BitmapFactory.decodeByteArray(data,0,data.length);
handler.post(new Runnable(){
public void run(){
imageView.setImageBitmap(bmp);
}
});
//隐藏对话框
dialog.dismiss();
}
}
}
}
D.Message
a.Handler如果使用sendMessage的方式把消息入队到消息队列中,需传递一个Message对象,而在Handler中需重写handleMessage()方法,用于获取工作线程传递过来的消息,此方法应用在UI线程上
b.Message是一个final类,所以不可被继承。Message封装了线程中传递的消息,如果对于一般的数据,Message提供了getData()和setData()方法来获取与设置参数,其中操作的数据是一个Bundle对象,
Bundle对象提供了一系列getXXX()和setXXX()方法用于传递基本数据类型的键值对。对于复杂的数据类型,Bundle提供了两个方法:putParcelable(String key,Parcelable value):需要传递的对象类实现Parcelable接口;
pubSerializable(String key,Serializable value):需要传递的对象类实现Serializable接口。
c.另一种方式在Message中传递对象,即使用Message自带的obj属性传值,它是一个Object类型,可以传递任意类型的对象,Message自带如下属性:
int arg1:参数一,用于传递不复杂的参数,复杂数据使用setData()传递
int arg2:参数二,用于传递不复杂的参数,复杂数据用setData()传递
Object obj:传递一个任意的对象
int what:定义的消息码,一般用于设定消息的标志
d.对于Message对象,一般不建议通过构造方法得到,而是建议通过使用Message.obtain()静态的方法或Handler.obtainMessage()获取。Message.obtain()会从消息池中获取一个Message对象,如果消息池是空的,才会使用构造方法实例化一个Message对象,这样有利于消息资源的利用。不用担心消息池中的消息过多,它的上限是10个
e.代码示例:
public class HandleMessageActivity extends Activity{
private Button btn;
private ImageView imageView;
private static String image_path=”http://ww4.sinaimg.cn/bmiddle/786013a5jw1e7akotp4bcj20c80i3aao.jpg”;
private ProgressDialog dialog;
private static int IS_FINISH=1;
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.asynctask_activity);
btn=(Button)findViewById(R.id.btn);
imageView=(ImageView)findViewById(R.id.imageView);
//设置进度条提示
dialog=new ProgressDialog(this);
dialog.setTitle(“提示”);
dialog.setMessage(“正在下载,请稍后...”);
dialog.setCancelable(false);
btn.setOnClickListener(new View.OnClickListener(){
public void onClick(View v){
//开启一个子线程,用于下载图片
new Thread(new MyThread()).start();
dialog.show();
}
});
}
private Handler handler=new Handler(){
//在Handler中获取消息,重写handleMessage()方法
public void handleMessage(Message msg){
//判断消息码是否为空
if(msg.what==IS_FINISH){
byte[] data=(byte[])msg.obj;
Bitmap bmp=BitmapFactory.decodeByteArray(data,0,data.length);
imageView.setImageBitmap(bmp);
dialog.dismiss();
}
}
};
public class MyThread implements Runnable{
public void run(){
HttpClient client=new DefaultHttpClient();
HttpGet httpGet=new HttpGet(image_path);
HttpResponse httpResponse=null;
//红色字体部分需处理异常
httpResponse=client.execute(httpGet);
if(httpResponse.getStatusLine().getStatusCode()==200){
byte[] data=EntityUtils.toByteArray(httpResponse.getEntity());
//获取一个Message对象,设置what为1
Message msg=Message.obtain();
msg.obj=data;
msg.what=IS_FINISH;
//发送这个消息到消息队列中
handler.sendMessage(msg);
}
}
}
}
7.android使用http协议与服务器通信(HttpURLConnection)
A.get方式:
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.asynctask_activity);
//采用get方式访问服务器
String strurl=”http://192.168.0.100:8080/AndroidJ2eeServlet/ServletTest?param=helloworld”;
URL url=null;
//红色字体部分需处理异常
url=new URL(strurl);
HttpURLConnection conn=(HttpURLConnection)url.openConnection();
InputStreamReader in=new InputStreamReader(conn.getInputStream());//向J2ee服务器发送消息
BufferedReader bufferReader=new BufferedReader(in);
String result=””;
String readLine=null;
while((readLine=bufferReader.readLine())!=null){
result+=readLine;
}
in.close();
conn.disconnect();
TextView textView=(TextView)findViewById(R.id.textView);
textView.setText(result);
}
B.post方式:
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.asynctask_activity);
//采用post方式向服务端传送数据以及从服务器接收数据
String strUrl=”http://192.168.0.100:8080/AndroidJ2eeServlet/ServletTest”;
URL url=null;
//红色字体部分需处理异常
url=new URL(strUrl);
HttpURLConnection conn=(HttpURLConnection)url.openConnection();
conn.setDoInput(true);//设置输入流采用字节流
conn.setOutput(true);//设置输出流采用字节流
conn.setRequestMethod(“POST”);
conn.setUseCaches(false);//设置缓存
conn.setRequestProperty(“content-type”,”application/x-www-form-urlencoded”);//设置meta参数
conn.setRequestProperty(“Charset”,”utf-8”);
conn.connect();//连接既向服务器发送消息
DataOutputStream dop=new DataOutputStream(conn.getOutputStream());
dop.writeBytes(“param=”+URLEncode.encode(“Q:下周去钓鱼”,”utf-8”));//发送参数
dop.flush();
dop.close();
//以下是接收工作
BufferedReader bufferReader=new BufferedReader(new InputStreamReader(conn.getInputStream()));
String result=””;
String readLine=null;
while((readLine=bufferReader.readLine())!=null){
result+=readLine;
}
bufferReader.close();
conn.disconnect();
//将接收到的数据显示出来
TextView textView=(TextView)findViewById(R.id.result);
textView.setText(URLDecode.decode(result,”utf-8”);
}
8.android界面
A.android生成屏幕有三种方式:xml配置生成;通过用户界面接口生成;直接用代码生成
B.View类,任何一个View对象都继承android.View类,它是一个存储有屏幕上特定的一个矩形布局和内容属性的一个布局。一个View对象可以处理测距、布局、焦点变换和滚动条,以及屏幕区域自己表现的按键和手势。作为一个基类,一个view对象为Widget,Widget则是一组用于绘制交互屏幕元素的完全实现子类,Widget可以处理自己的测距和绘图,所以可以用它们快速的构建UI,可用到的Widget包括Text,EditText,Button,RadioButton,CheckBox和ScrollView
C.ViewGroup,是一个android.view,ViewGroup的对象,ViewGroup是一个特殊的View对象,它的功能是装载和管理一组下层的View和其他ViewGroup
D.TextView对象,示例:
TextView textView=(TextView)findById(R.id.textView);
textView.setTextColor(Color.RED);
textView.setTextSize(20);
textView.setBckgroundColor(Color.BLUE);
textView.setString(“我是一个文本”);
E.Toast,提示类:
Toast toast=Toast.makeText(this,”我是一个提示”,Toast.LENGTH_SHORT);
toast.setGravity(Gravity.TOP,0,220);//设置提示的位置
toast.show();//显示提示
F.单项选择:RadioButton,RadioGroup,选项按钮可以通过RadioButton来实现,“答案”则通过RadioGroup 来实现,在xml配置文件中:
<RadioButton...>
<RadioGroup.../>
<RadioGroup.../>
</RadioButton>
G多项选择(CheckBox),xml配置文件
<CheckBox../>
<CheckBox.../>
<CheckBox.../>
H.下拉列表:Spinner,xml文件
<Spinner android;id=”@+id/spinner”
android:layout_width=”wrap_content”
android:layout_height=”wrap_content”
android:layout_cneterHorizontal=”true”/>
java代码:
priavate static final String[] items={“O型”,”A型”,”B型”,”AB型”};
Spinner spinner=(Spinner)findById(R.id.spinner);
//将可选内容与ArrayAdapter关联
ArrayAdapter adapter=new ArrayAdapter<String>(this,R.layout.simple_spinner_item,items);
//设置下拉列表的风格
adapter.setDropDownViewResource(R.layout.simple_spinner_dropdown_item);
//将adapter添加到spinner中
spinner.setAdapter(adapter);
I.自动提示(AutoCompeleteTextView)
J.日期和时间(DatePicker,TimePicker):首先需要在布局文件中定义DatePicker和TimePicker,然后通过Calendar获取系统日期,接着通过init方法将日期传给DatePicker,并设置 OnDateChangedListener来监听日期改变,当时间被改变设置setOnTimeChangedListener监听时间的改变,
java文件:
public void onCreate(Bundle savedInstanceState){
super.onCreated(saveInstanceState);
setContentView(R.layout.main);
Calendar c=Calendar.getInstance();
//获取DatePicker对象
DatePicker datePicker=(DatePicker)findViewById(R.id.datePicker);
//将日历初始化为当前时间,并设置监听事件
datePicker.init(c.get(Calendar.YEAR),c.get(Calendar.MONTH),c.get(Calendar.DAY_OF_MONTH),new DatePicker.OnDateChangedListener(){
@Override
public void onDateChanged(DatePicker view,int year,int monthOfYear,int dayOfMonth){
//当日期更改时在这里进行处理
c.set(year,monthOfYear,dayOfMonth);
}
});
//获取TimePicker对象
TimePicker timePicker=(TimePicker)findViewById(R.id.timePicker);
//设置为24小时显示制
timePicker.setIs24HourView(true);
timePicker.setOnTimeChangedListener(new TimePicker.OnTimeChangedListener(){
@Override
public void onTimeChanged(TimePicker view,int hourOfDay,int minute){
//时间改变处理
c.set(year,month,day,hourOfDay,minute,second);
}
});
}
xml配置文件:
<DatePicker
android:layout_width=”wrap_content”
android:layout_height=”wrap_content”
android:id=”@+id/datePicker”>
</DatePicker>
<TimePicker
android:id=”@+id/timePicker”
android:layout_width=”wrap_content”
android:layout_height=”wrap_content”>
</TimePicker>
9.android小知识:
A.实例化一个res/layout/main.xml:通过类LayoutInflate可以对布局xml文件实例化
a.LayoutInflate inflate=LayoutInflate.from(Context context);进而可以创建一个试图
View view=inflate.inflate(R.layout.main,null);//即创建了main.xml文件的试图,可以动态的创建或者修改改xml文件
b.LayoutInflater inflater=getLayoutInflater();//调用activity的getLayoutInflater();方法
c.LayoutInflater inflater=(LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
B.创建Activity时,如果单击事件较多,Activity可实现OnClickListener接口;
View continueBtn=findViewById(R.id.continue_btn);
continueBtn.setOnClickListener(this);
View newBtn=findViewById(R.id.new_btn);
newBtn.setOnClickListener(this);
//实现的单击方法
public void click(View v){
switch(v.getId()){
case R.id.continue_btn:
//执行一些操作
break;
case R.id.new_btn:
//执行一些操作
break;
default:
break;
}
}
10.菜单(menu):
两种方式创建菜单:
通过xml布局文件创建:
<menu xmlnx=””>
<item android:id=”@+id/about”
android:title=”关于”/>
<item android:id=”@+id/exit”
android:title=”退出”/>
</menu>
java代码:
//创建发方法
public boolean onCreateOptionsMenu(Menu menu){
MenuInflate inflater=getMenuInflater();
//设置menu界面为menu.xml
inflater.inflater(R.menu.menu,menu);
return true;
}
通过menu.add方法添加
//创建发方法
public void onCreateOptionsMenu(Menu menu){
menu.add(0,0,0,R.string.ok);
menu.add(0,1,1,R.string.back);
return true;
}
11.A.ImageView:将一张图片显示在屏幕上,需要创建一个显示图片的对象,这个对象就是ImageView,然后通过setImageResource来设置要显示的图片资源索引
B.ImageButton:要创建带图标的Button,首先要在布局文件中定义ImageButton,然后通过setImageDrawable方法来设置按钮要显示的图标
C.拖动效果(Gallery)
D.切换图片(ImageSwitcher)
E.网格视图(GridView):GridView的视图排列方式与矩阵类似,当屏幕上由很多元素(文字,图片或其他元素)需要显示时可以使用GridView来显示。既然有多个元素需要显示,就要使用BaseAdapter来存储这些元素
F.ScrollView卷轴视图:
G.进度条ProgressBar,android提供两类进度条样式:长型进度条和圆型进度条
H.拖动条SeekBar:拖动条类似进度条,不同的是拖动条用户可以控制;由于拖动条用户可以控制,所以需要对其进行事件监听,需要实现SeekBar.OnSeekBarChangeListener接口,在 SeekBar中需要监听三个事件:数值的改变(onProgressChanged)、开始拖动(onStartTackingTouch)、停止拖动(onStopTrackingTouch)
I.状态栏提示(Notification,NotificationManager):android提供了NotificationManager来管理状态栏信息,提供Notification来处理这些讯息。首先通过getSystenService()得到 NotificationManager对象,我们可以对Notification的内容、标题和图标等属性进行设置。,然后通过notify方法来执行一个Notification快讯
J.TabWidget:TabWidget类似电话薄中的界面,通过多个标签切换显示不同的内容。首先需了解TabHost,它是一个用来存放多个Tab标签的容器
12.Bitmap类:用于获取图像文件信息,进行图像的旋转、平移和缩放等,并可以指定保存文件格式
A.可以通过来获取该图像对象Bitmap:
Bitmap bitmap=(BitmapDrawable)getResource().getDrawable(R.drawable.fuwa).getBitmap();
B.获得图像资源后,可以使用drawBitmap()方法将图像显示到屏幕(x,y)坐标上,方法:Canvas.drawBitmap(bitmap,x,y,null);
C.要获得图像信息,可以通过bitmap.getHeight()获得图像高度,通过bitmap.getWidth()获得图像宽度
D.实现图像的平移,只需改变Canvas.drawBitmap(bitmap,x,y,null)方法中的x,y,即可
E.图像的旋转:用Matrix实现图像旋转,Matrix是一个3*3的矩阵,专门用于图像变换匹配。Matrix没有结构体,必须初始化,可以通过reset()或set()方法实现吗matrix.reset()
初始化之后,就可以使用setRotate()方法设置旋转的角度:matrix.setRotate()。
旋转角度设置完毕之后,可以使用createBitmap()方法创建一个经过旋转处理的Bitmap对象
bitmapRotate=Bitmap.createBitmap(bitmap,0,0,bitmapWidth,bitmapHeight,matrix,true);
13.android颜色编码表:
<resources>
<color name="white">#ffffff</color><!--白色 --> <color name="ivory">#fffff0</color><!--象牙色 -->
<color name="lightyellow">#ffffe0</color><!--亮黄色 --> <color name="yellow">#ffff00</color><!--黄色 -->
<color name="snow">#fffafa</color><!--雪白色 --> <color name="floralwhite">#fffaf0</color><!--花白色 -->
<color name="lemonchiffon">#fffacd</color><!--柠檬绸色 --> <color name="cornsilk">#fff8dc</color><!--米绸色 -->
<color name="seaShell">#fff5ee</color><!--海贝色 --> <color name="lavenderblush">#fff0f5</color><!--淡紫红 -->
<color name="papayawhip">#ffefd5</color><!--番木色 --> <color name="blanchedalmond">#ffebcd</color><!--白杏色 -->
<color name="mistyrose">#ffe4e1</color><!--浅玫瑰色 --> <color name="bisque">#ffe4c4</color><!--桔黄色 -->
<color name="moccasin">#ffe4b5</color><!--鹿皮色 --> <color name="navajowhite">#ffdead</color><!--纳瓦白 -->
<color name="peachpuff">#ffdab9</color><!--桃色 --> <color name="gold">#ffd700</color><!--金色 -->
<color name="pink">#ffc0cb</color><!--粉红色 --> <color name="lightpink">#ffb6c1</color><!--亮粉红色 -->
<color name="orange">#ffa500</color><!--橙色 --> <color name="lightsalmon">#ffa07a</color><!--亮肉色 -->
<color name="darkorange">#ff8c00</color><!--暗桔黄色 --> <color name="coral">#ff7f50</color><!--珊瑚色 -->
<color name="hotpink">#ff69b4</color><!--热粉红色 --> <color name="tomato">#ff6347</color><!--西红柿色 -->
<color name="orangered">#ff4500</color><!--红橙色 --> <color name="deeppink">#ff1493</color><!--深粉红色 -->
<color name="fuchsia">#ff00ff</color><!--紫红色 --> <color name="magenta">#ff00ff</color><!--红紫色 -->
<color name="red">#ff0000</color><!--红色 --> <color name="oldlace">#fdf5e6</color><!--老花色 -->
<color name="lightgoldenrodyellow">#fafad2</color><!--亮金黄色 --> <color name="linen">#faf0e6</color><!--亚麻色 -->
<color name="antiquewhite">#faebd7</color><!--古董白 --> <color name="salmon">#fa8072</color><!--鲜肉色 -->
<color name="ghostwhite">#f8f8ff</color><!--幽灵白 --> <color name="mintcream">#f5fffa</color><!--薄荷色 -->
<color name="whitesmoke">#f5f5f5</color><!--烟白色 --> <color name="beige">#f5f5dc</color><!--米色 -->
<color name="wheat">#f5deb3</color><!--浅黄色 --> <color name="sandybrown">#f4a460</color><!--沙褐色 -->
<color name="azure">#f0ffff</color><!--天蓝色 --> <color name="honeydew">#f0fff0</color><!--蜜色 -->
<color name="aliceblue">#f0f8ff</color><!--艾利斯兰 --> <color name="khaki">#f0e68c</color><!--黄褐色 -->
<color name="lightcoral">#f08080</color><!--亮珊瑚色 --> <color name="palegoldenrod">#eee8aa</color><!--苍麒麟色 -->
<color name="violet">#ee82ee</color><!--紫罗兰色 --> <color name="darksalmon">#e9967a</color><!--暗肉色 -->
<color name="lavender">#e6e6fa</color><!--淡紫色 --> <color name="lightcyan">#e0ffff</color><!--亮青色 -->
<color name="burlywood">#deb887</color><!--实木色 --> <color name="plum">#dda0dd</color><!--洋李色 -->
<color name="gainsboro">#dcdcdc</color><!--淡灰色 --> <color name="crimson">#dc143c</color><!--暗深红色 -->
<color name="palevioletred">#db7093</color><!--苍紫罗兰色 --> <color name="goldenrod">#daa520</color><!--金麒麟色 -->
<color name="orchid">#da70d6</color><!--淡紫色 --> <color name="thistle">#d8bfd8</color><!--蓟色 -->
<color name="lightgray">#d3d3d3</color><!--亮灰色 --> <color name="lightgrey">#d3d3d3</color><!--亮灰色 -->
<color name="tan">#d2b48c</color><!--茶色 --> <color name="chocolate">#d2691e</color><!--巧可力色 -->
<color name="peru">#cd853f</color><!--秘鲁色 --> <color name="indianred">#cd5c5c</color><!--印第安红 -->
<color name="mediumvioletred">#c71585</color><!--中紫罗兰色 --> <color name="silver">#c0c0c0</color><!--银色 -->
<color name="darkkhaki">#bdb76b</color><!--暗黄褐色 --> <color name="rosybrown">#bc8f8f</color><!--褐玫瑰红 -->
<color name="mediumorchid">#ba55d3</color><!--中粉紫色 --> <color name="darkgoldenrod">#b8860b</color><!--暗金黄色 -->
<color name="firebrick">#b22222</color><!--火砖色 --> <color name="powderblue">#b0e0e6</color><!--粉蓝色 -->
<color name="lightsteelblue">#b0c4de</color><!--亮钢兰色 --> <color name="paleturquoise">#afeeee</color><!--苍宝石绿 -->
<color name="greenyellow">#adff2f</color><!--黄绿色 --> <color name="lightblue">#add8e6</color><!--亮蓝色 -->
<color name="darkgray">#a9a9a9</color><!--暗灰色 --> <color name="darkgrey">#a9a9a9</color><!--暗灰色 -->
<color name="brown">#a52a2a</color><!--褐色 --> <color name="sienna">#a0522d</color><!--赭色 -->
<color name="darkorchid">#9932cc</color><!--暗紫色 --> <color name="palegreen">#98fb98</color><!--苍绿色 -->
<color name="darkviolet">#9400d3</color><!--暗紫罗兰色 --> <color name="mediumpurple">#9370db</color><!--中紫色 -->
<color name="lightgreen">#90ee90</color><!--亮绿色 --> <color name="darkseagreen">#8fbc8f</color><!--暗海兰色 -->
<color name="saddlebrown">#8b4513</color><!--重褐色 --> <color name="darkmagenta">#8b008b</color><!--暗洋红 -->
<color name="darkred">#8b0000</color><!--暗红色 --> <color name="blueviolet">#8a2be2</color><!--紫罗兰蓝色 -->
<color name="lightskyblue">#87cefa</color><!--亮天蓝色 --> <color name="skyblue">#87ceeb</color><!--天蓝色 -->
<color name="gray">#808080</color><!--灰色 --> <color name="grey">#808080</color><!--灰色 -->
<color name="olive">#808000</color><!--橄榄色 --> <color name="purple">#800080</color><!--紫色 -->
<color name="maroon">#800000</color><!--粟色 --> <color name="aquamarine">#7fffd4</color><!--碧绿色 -->
<color name="chartreuse">#7fff00</color><!--黄绿色 --> <color name="lawngreen">#7cfc00</color><!--草绿色 -->
<color name="mediumslateblue">#7b68ee</color><!--中暗蓝色 --> <color name="lightslategray">#778899</color><!--亮蓝灰 -->
<color name="lightslategrey">#778899</color><!--亮蓝灰 --> <color name="slategray">#708090</color><!--灰石色 -->
<color name="slategrey">#708090</color><!--灰石色 --> <color name="olivedrab">#6b8e23</color><!--深绿褐色 -->
<color name="slateblue">#6a5acd</color><!--石蓝色 --> <color name="dimgray">#696969</color><!--暗灰色 -->
<color name="dimgrey">#696969</color><!--暗灰色 --> <color name="mediumaquamarine">#66cdaa</color><!--中绿色 -->
<color name="cornflowerblue">#6495ed</color><!--菊兰色 --> <color name="cadetblue">#5f9ea0</color><!--军兰色 -->
<color name="darkolivegreen">#556b2f</color><!--暗橄榄绿 --> <color name="indigo">#4b0082</color><!--靛青色 -->
<color name="mediumturquoise">#48d1cc</color><!--中绿宝石 --> <color name="darkslateblue">#483d8b</color><!--暗灰蓝色 -->
<color name="steelblue">#4682b4</color><!--钢兰色 --> <color name="royalblue">#4169e1</color><!--皇家蓝 -->
<color name="turquoise">#40e0d0</color><!--青绿色 --> <color name="mediumseagreen">#3cb371</color><!--中海蓝 -->
<color name="limegreen">#32cd32</color><!--橙绿色 --> <color name="darkslategray">#2f4f4f</color><!--暗瓦灰色 -->
<color name="darkslategrey">#2f4f4f</color><!--暗瓦灰色 --> <color name="seagreen">#2e8b57</color><!--海绿色 -->
<color name="forestgreen">#228b22</color><!--森林绿 --> <color name="lightseagreen">#20b2aa</color><!--亮海蓝色 -->
<color name="dodgerblue">#1e90ff</color><!--闪兰色 --> <color name="midnightblue">#191970</color><!--中灰兰色 -->
<color name="aqua">#00ffff</color><!--浅绿色 --> <color name="cyan">#00ffff</color><!--青色 -->
<color name="springgreen">#00ff7f</color><!--春绿色 --> <color name="lime">#00ff00</color><!--酸橙色 -->
<color name="mediumspringgreen">#00fa9a</color><!--中春绿色 --> <color name="darkturquoise">#00ced1</color><!--暗宝石绿 -->
<color name="deepskyblue">#00bfff</color><!--深天蓝色 --> <color name="darkcyan">#008b8b</color><!--暗青色 -->
<color name="teal">#008080</color><!--水鸭色 --> <color name="green">#008000</color><!--绿色 -->
<color name="darkgreen">#006400</color><!--暗绿色 --> <color name="blue">#0000ff</color><!--蓝色 -->
<color name="mediumblue">#0000cd</color><!--中兰色 --> <color name="darkblue">#00008b</color><!--暗蓝色 -->
<color name="navy">#000080</color><!--海军色 --> <color name="black">#000000</color><!--黑色 -->
</resources>
14.使用HttpClient接口实现网络通信:
A.DefaultHttpClient:DefaultHttpClient是HttpClient的一个直接子类,是一个默认的HTTP客户端,可以使用它创建一个HTTP连接。在HTTP中提供了多个重载的execute()方法,用来执行http请求
B.HttpRequest接口:HttpGet和HttpPost是HttpRequest的直接子类,分别用于向服务器提交get请求和post请求
C.HttpResponse接口:HttpResponse接口提供了Http的响应信息,其中getEntity() 方法用于获得响应消息的实体,getStatusLine()方法用于获取响应的状态行,在返回结果statusLine中包含了HTTP响应的状态码,可以使用方法getStatusCode()方法获得
15.ViewGroup.MarginLayoutParams用于控制子组件周围的页边距:
android:layout_marginBottom该子组件下边的页边距;android:layout_marginLeft该子组件左边的页边距;
android:layout_marginRight该子组件右边的页边距;android:layout_marginTop: 该子组件上边的页边距
对于view的尺寸,android给了三种单位供选择使用:
px:像素;dp:dip,表示屏幕实际的像素;
sp:会根据系统设定的字体大小进行缩放,与dp类似,通常用与设置字体
尺寸单位的选择技巧:如果设置长度、高度等属性可以使用dp;如果设置字体,推荐使用sp;在屏幕适配方面,不推荐使用px,因为使用dp或sp,UI会根据设备的density和scaleDensity进行等比例缩放,以达到不同屏幕适配的效果,让其在不同的屏幕看起来差不多的效果。
16.子activity向父activity返回结果,实现子activity向父activity发送返回信息,有以下两种方法可调用:
public final void setResult(int resultCode);
public final void setResult(int resultCode,Intent data);
通常来说,resultCode是以下两个预定义常量的任意一个:
Activity.RESULT_OK;Activity.RESULT_CANCELED;如果需自定义结果代码,还可以使用另一个常量:RESULT_FIRST_USER;
17.fragment
A. fragment的特性:
a. Fragment总是作为Activity界面组成部分,Fragment可以通过getActivity()方法获取所在的activity,activity可以通过调用FragmentManager的findFragmentById()或findFragmentByTag()方法获取fragment;
b. 在activity运行时,可调用FragmentManager的add(),remove(),replace()方法动态的操作Fragment
c. 一个Activity可同时组合多个Fragment,一个Fragment可以被多个Activity复用
d. Fragment可以响应输入事件并有自己的生命周期,但其生命周期被其所在的activity生命周期所控制
B. 创建Fragment:
a. 创建Fragment需要继承Fragment基类或Fragment的子类,Fragment的子类有:DialogFragment,ListFragment,PreferenceFragment或者WebViewFragment,与创建activity类似,fragment需要实现一些回调方法:onCreate(),onCreateView(),onStart(),onResume(),onPause(),onStop()等,通常会重写以下三个方法:
onCreate():系统创建Fragment后回调该方法,初始化必要组件
onCreateView():当Fragment绘制界面组件时调用该方法,该方法返回一个view,该view就是Fragment显示的view
onPause():离开fragment调用该方法
b. 代码示例:
@Override
public View onCreateView(LayoutInflater inflater,ViewGroup container,Bundle savedInstanceState){
//加载fragment_main.xml布局文件
View rootView=inflater.inflate(R.layout.fragment_main,container,false);
return rootView;
}
C. Fragment添加到Activity:创建好的Fragment只有添加到Activity才能起作用,添加到Activity有两种方法:
a. 在布局文件中使用<Fragment…/>元素添加Fragment,android:name指定Fragment的实现类;
<LinearLayout …>
<Fragment android:name=”com.myfragment.test.MyFragment”
android:id=”@+id/fragment”
android:layout_width=”wrap_content”
android:layout_height=”match_parent”/>
</LinearLayout>
注:每个fragment都需要提供一个唯一的标识,为fragment提供id有三种方法:
① android:id属性提供一个唯一的标识
② 用android:tag属性提供一个唯一的字符串
③ 如果上述两个属性都没有,系统会使用其容器视图(View)的id
b. 在java代码中,通过FragmentTransaction对象的add()方法来添加Fragment
@Override
protected void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
//加载容器
setContentView(R.layout.activity_main);
//添加fragment
getFragmentManager().beginTransaction().add(R.id.container,new MyFragment()).commit();
}
activity_main.xml布局文件如下所示:
<FrameLayout xmlns:android=”…”
android:id=”@+id/container”
android:layout_width=”match_parent”
android:layout_height=”match_parent”/>
注:Activity的getFragmentManager()方法可以返回FragmentManager,FragmentManager的beginTransaction()方法可开启并返回FragmentTransaction对象
D. Fragment与Activity通信
a. Fragment添加到Activity后,fragment和activity必须实现通信,这就需要fragment能够获取activity,activity能够获取到fragment:
Fragment获取它所在的Activity:调用fragment的getActivity()即可获取到fragment的activity
Activity获取它所拥有的Fragment:调用Activity关联的FragmentManager的findFragmentById(int id)或findFragmentByTag(String tag)即可获取指定的fragment
注:在布局文件中<Fragment…/>元素添加fragment时,可以指定android:id或android:tag属性,用于标识该fragment
b. Fragment与Activity传递数据:
Activity向Fragment传递数据:在Activity中创建Bundle数据包,并调用fragment的setArguments(Bundle bundle)方法将Bundle数据包传递给fragment
Fragment向Activity传递数据或activity需要在Fragment运行时实时获取数据:在Fragment中定义一个内部回调接口,再让包含该Fragment的Activity实现回调接口
E. Fragment管理与Fragment事务:
a.Activity管理Fragment主要通过FragmentManager,通过FragmentManager可以完成以下几个功能:
使用findFragmentById()和findFragmentByTag()获取指定的Fragment
调用popBackStack()将Fragment从后台栈中弹出,
调用addOnBackStackChangeListener()注册一个监听器,用于监听后台栈的变化
c. 借助FragmentTransaction实现删除、添加、替换Fragment,FragmentTransaction代表Activity对Fragment执行的多个改变,代码示例:
//打开事务,获取FragmentManager
FragmentManager fm=getFragmentManager();
FragmentTransaction transaction=fm.beginTransaction();
//创建一个新的Fragment
Fragment fragment=new MyFragment();
//替换container容器的fragment
transaction.replace(R.id.container,fragment);
//将事务添加到back栈,允许用户按下back键返回到上一个状态
transaction.addToBackStack(null);
transaction.commit();
18.weight属性详解:
A. layout_gravity和gravity区别:layout_gravity表示的是组件自身在父组件中的位置,gravity表示的是组件的子组件在组件中的位置
B. 作为父layout的LinearLayout的属性android:orientation=”vartical”时,android:layout_gravity属性设为横向的时候才能生效,如left,right,
center_horizontal;当android:orientation=”horizontal”时,android:layout_gravity属性设为纵向的时候才能生效,如top,bottom,
center_vertical