Mars学习笔记

来源:互联网 发布:xml与java 编辑:程序博客网 时间:2024/04/30 11:38

Android学习笔记

1.一个Android Project的文件作用

eclipse生成一个Android Project,配置好后,生成了很多文件

src文件夹中是自己编写的源文件

gen文件夹下的R.javaADT自动生成的文件,主要内容是res文件下各元素的id

res中存放了各种资源文件,其中三个文件夹drawable-hdpi drawable-mdpi drawable-ldpi是对应不同分辨率的图片,layout文件夹下的main.xml关于布局,values文件夹中strings.xml是关于字符

AndroidManifest.xml中是控制应用的包名,图标,首先的Activity等信息

 

2.创建一个Activity

一个Activity是一个类,并且要继承自一个Activity

需要复写onCreate方法

每一个Activity组件都需要在AndroidManifest.xml中进行配置

Activity添加控件

 

3.为一个Activity设置一些简单元素

首先,每个Activity需要在AndroidManifest中进行配置,是否是开始时就执行这个Activity

然后,打开res->layout->main.xml中,中间父类标签是<LinearLayout>是线性布局的意思,还有绝对位置布局,相对位置布局等

    在其中添加一个Button

<Button

android:id="@+id/MyButton"                      Button添加id,由于R.Java中没有id这个类,需要加个‘+’符号

android:layout_width="fill_parent"                                宽度填满父类

android:layout_height="wrap_content"  高度与内容相符合

/>

这个时候run已经可以看到新添加的Button

之后,打开Activity_01.java文件,在onCreate方法中来为控件添加属性

通过id获得控件         findViewById()方法  通过id找到元素返回一个View

 

Buttonmybutton=findViewById(R.id.MyButton);

mybutton.setText("第一个Button");

 

其中关键的方法:findViewById(R.id.button1)

4.设置多个Activity,用Intent来传值,启动

首先,创建一个Activity

          AndroidManifest.xml中添加Activity(已经自动生成好)

          layout->main.xml中添加一个button,加上id

          在类重写的onCreate方法中获得button控件并且设置button的属性

然后,再创建一个Activity

          在原来的src下面的包里新建一个class,继承Activity,复写onCreate方法(在类中右键选Source->Override/ImplementonCreate)

          AndroidManifest.xml中添加Activity{

                         其中要添加android:name=".otherActivity"  (前面有一个' . ',加上包名刚好找到)

                                           android:label="@string/other"    (string.xml中设置了<stringname="other">hahaha</string>)

            }

          layout中添加一个other.xml文件,添加布局,新增一个button,onCreate方法中setContentView(R.layout.other);

继续,创造联系两个ActivityIntent

           在与OnCreate方法平行的地方写一个类

           class MyButtonListener implements OnClickListener{   //此处引入包时要注意!!!点击OnClickListener变灰引入包,选view那个

                    public void onClick(View v){

                                 Intent intent=new Intent();                               //创建Intent对象

                                 intent.putExtra("Tags","Bussiness");           //intent可以传递参数  intent.putExtra(键值,值)的方式

                                 intent.setClass(Activity02.this,otherActivity.class);       //从自身类(Activity02.this),传到哪个类(otherActivity.class)

                                 Activity.this.startActivity(intent);

                    }

           }

          

再之后把这个类绑定到button

            OnCreate方法中再写

mybutton.setOnClickListener(newMyButtonListener());

 

otherActivity类名中进行获得传递的参数值

 Intent intent=getIntent();       //先获得Intent对象

               String value=intent.getStringExtra("Tags");         //把传过来的值获得

               调用viewtextsetText方法进行设置显示

 

其中关键的方法:intent.putExtra("Tags","hahaha");

                              intent.setClass(当前的Activity.class,目标的Activity.class)

                              startActivity(intent);

                             String got=EditView控件.getText().ToString();

                              button.setOnClickListener()

                              intent=getIntent();

                              String parameter=intent.getStringExtra("one");

 

5.EditText控件

用控件对象.getText()获得输入框里的内容,然后还要加.ToString()

setText(里面必须是String类型)    如果是int后面加个""

 

6.菜单Menu

要在Activity类中重写onCreateOptionsMenu(Menumenu)方法

然后用menu.add(0,1,1,string)来添加MENU选项

 

要编写每个选项实现的功能要重写onOptionsItemSelected(MenuItemitem)方法

 

其中关键方法:menu.add(intgroupId,int ItemId,int order,string description)

                      int id=  item.getItemId();  //返回点击的Itemid

7.弹出对话框

Manifest.xml中添加Activity的时候多加一个android:theme="@android:style/Theme.Dialog"

 

8.RadioGroup RadioButton控件

添加RadioGroup控件时有一个属性android:orientation="vertival"     "horizontal"

RadioGroup添加一个setOnCheckedChangeListener

 rg.setOnCheckedChangeListener(newRadioGroup.OnCheckedChangeListener() {

@Override
public void onCheckedChanged(RadioGroup group, int checkedId) {
// TODO Auto-generated method stub
if(male.getId()==checkedId){
System.out.println("click male");
}
else if(female.getId()==checkedId){
System.out.println("click female");
}
}
});

关键方法:

radioButton1.getId()

9.CheckBox控件

swim.setOnCheckedChangeListener(newRadioGroup.OnCheckedListener()

{

       public voidOnCheckedChange(RadioGroup group,int checkedId){

              if(swim.getId()==checkedId){

 

               }

          }

}

);

10.Toast控件--提示框

Toast.makeText(Activity类名.this,"输出的内容",Toast.LENGTH_SHORT);  //最后一个参数是显示多少毫秒

11.ProgressBar进度条

添加进度条到main.xml布局文件时,加一个

style="?android:attr/progressBarStyleHorizontal" 会得到一个水平进度条

style="?android:attr/progressBarStyle"         得到一个菊花条

android:visibility="gone"                          隐藏

android:max="200"                              最大200

 

关键方法:

first.setVisibility(View.VISIBLE)

first.setProgress(20);

first.setSecondaryProgress(30);

 

12.ListView控件

工程继承自ListActivity

在布局中添加一个ListView控件 android:id="@id/android:list"         //有专属的id

每个ListActivity必须要调用setListAdapter(adapter)方法,因此需要一个adapter作参数

SimpleAdapter adapter=new SimpleAdapter(                           //SimpleAdapter是一个适配器类

                                                                           this,                      //运行的环境,也就是当前工程类

                                                                                   list,               //一个存储数据的数组  ArratList<HashMap<String,???>>

                                                                                         R.layout.user,          //用来显示的layout  

                                                                                                              new   String[]{"user_name","user_id"},     //上面数组中的键部分

                                                                                                                           new int[]{R.id.user_name,R.id.user_id} //要显示到的控件id

);

所以参数里的元素是下面部分:

ArrayList<HashMap<String,String>>list=new ArrayList<HashMap<String,String>>();

HashMap<String,String>map1=new HashMap<String,String>();

map1.put("user_name","user1");       map1.put("user_ip","192.168.9.1");

list.add(map1);

 

ListView有一个onListItemClick(ListViewl,View v,int position,long id)方法可以复写来获得点击控件的位置,id

关键方法:

android:id="@id/android:list"

setListAdapter(adapter);

new SimpleAdapter(blablabla)

13.Activity的布局

控件的一些属性

android:id

android:gravity         //控件中的内容相对于控件本身的位置

android:layout_width        layout_height

android:background="#aa0000"  //背景颜色RGB ="@android:drawable/editbox_background"   android默认的文本框颜色

android:textsize="35pt"        //字体大小  pt

android:paddingLeft/Top/Right/Bottom="20dip"     //dip是与手机屏幕大小无关的单位,也可以用px

android:margin      //外边距

android:weight="1"      //这个控件相对于别的控件的大小

android:singleLine="true"         //是否把内容显示在同一行

 

layoutLinearLayout  TableLayout   RelativeLayout

LinearLayout     android:orientation="vertical"           horizontal

TableLayout      android:stretchColumns="1"    内容填不满时候拉伸的列号

标签里加<TableRow> </TableRow>

 

RelativeLayout中的控件属性有        

android:layout_above="@id/xxx"    below   toLeftOf   toRightOf       //把当前控件放在XXX的上下左右

android:layout_alignBaseline="@id/xxx" alignBottomalignLeft alignRight alignTop //同时把两个控件的上///右边缘对齐,类似嵌套

android:layout_alignParentBottomalignParentLeft alignParentRight alignParentTop        //和父控件对齐边缘,值为true false

android:layout_centerHorizontal       centerInParent   centerVertical             //值为true false

14.Handler用法

一种异步处理机制

首先创建一个Handler对象

Handler barHandler=new Handler(){
                       @Override
                       public void handleMessage(Message msg) {         //
这个handler带的处理消息的机制,如果有线程发送信息Message
                              // TODO Auto-generated method stub               //
将由这个handleMessage函数来处理
                               bar.setProgress(msg.arg1);
                               barHandler.post(newThread);          
                           }

                  };

 

barHandler.post(newThread);            //handler里添加新的线程,这一句是重点

重写线程的run函数来达到在后台执行的目的

Runnable newThread=new Runnable(){
                   int i=0;
                       @Override
                       public void run() {
                             // TODO Auto-generated method stub
                               System.out.println("BeginThread");
                                i+=10;
                               //
要发送一个消息到消息队列中去
                               //
生成消息
                               Message msg=barHandler.obtainMessage();             //
获得barHandler的消息
                               msg.arg1=i;                                                                   //
修改参数arg1

                               barHandler.sendMessage(msg);                                 //
发送消息到消息队列中,让handleMessage方法处理
                               if(i==100)
                                   barHandler.removeCallbacks(newThread);
                     }
         };

 

关键方法:

handler.post(newThread);   //handler中加入线程

 

没有调用newThreadstart()方法,直接用了run()方法,其实handlermain还是在同一线程中,并未分开执行,如果要分开执行,需要用HandlerThread类来进行

//先创建一个HandlerThread对象     一个线程

HandlerThread handlerThread=newHandlerThread("handler_thread");        //这里括号的参数是要生成新的线程的名字!!!!

handlerThread.start();                                                                                      //一个HandlerThread中有一个Looper

Handler myhand=newHandler(handlerThread.getLooper());                    //Handler类有一个以looper为参数的构造函数

                               //这样,新创建的Handler就在一个新的线程中了

//Message msg=myHandler.obtainMessage();

//msg.sendToTarget();

 

15.Bundle

Bundle b=new Bundle();

b.putInt("Age",15);

b.putString("Name",John);

msg.setData(d);

msg.sendToTarget();

 

//handleMessage

String a=b.getString("Name");

int age=b.getInt("age");

 

16.SQLite数据库

写一个类继承SQLiteOpenHelper

public class DBHelper extendsSQLiteOpenHelper {

public DBHelper(Context context,Stringname,CursorFactory factory,int version) {
// TODO Auto-generated constructor stub
super(context,name,factory,version);              //
复写构造函数
}

public void onCreate(SQLiteDatabase db){                //复写OnCreate方法
// TODO Auto-generated method stub
System.out.println("Create a database");
db.execSQL("create table user(id int,name varchar(20))");            //
执行创建一个user
}

public void onUpgrade(SQLiteDatabase db,int oldVersion, int newVersion) {    //OnUpdate方法
// TODO Auto-generated method stub
System.out.println("Update a database");
}

}

 

 

生成一个继承来的类

DBHelper dbHelper=new DBHelper(工程类的名字.this,"数据库名",null,1);  //SQLiteOpenHelper是一个数据库的管理类

SQLiteDatabasedb=dbHelper.getWritableDatabase(); //这个时候生成了SQLiteDatabase对象才调用了OnCreate,创建了数据库

 

ContentValues values=newContentValues();       //插入和更新都要靠ContentValues对象来作为参数传递

values.put("id", 1);
values.put("name", "Vincent");

 

//表中插入数据

db.insert("user",null,values);

//表中更新数据

db.update("user", values,"id=?", new String[]{"1"});  //表名,插入的值,条件,条件域

//表中查询数据

Cursor cur=db.query("user",new String[]{"id","name"}, "id=?", newString[]{"1"}, null, null, null);

                                    表名               选中的列               限制条件        条件域   groupBy  having orderBy

while(cur.moveToNext){

String name =cur.getString(cur.getColumnIndex("name"));
System.out.println("query--->" + name);

}

 

17.网络文本读取

读取文本文件:即把一个文本内容全部取出

首先,生成一个URL对象

URL url=new URL(urlStr);

再生成一个HttpURLConnection对象

HttpURLConnectionurlConn=(HttpURLConnection)url.openConnection();

返回文件中的内容

urlConn.getInputStream();                                               //返回一个InputStream对象

newInputStreamReader(urlConn.getInputStream());            //返回一个Reader对象

BufferedReader br=newBufferedReader(new InputStreamReader(urlConn.getInputStream()));   //内容存在了一个BufferedReader

 

StringBuffer sb=new StringBuffer();   String line=null;

因为BufferedReadergetLine功能

while((line=br.getLine())!=null){

sb.append(line);

}

 

18.下载文件并且放入SD卡中

首先需要在Manifest.xml中添加两个权限

 <uses-permissionandroid:name="android.permission.INTERNET"/>
<uses-permissionandroid:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

 

下载文件需要地址urlStr,存文件需要路径path和保存的文件名fileName

URL url=new URL(urlStr);

HttpURLConnectionurlConn=(HttpURLConnection)url.openConnection();          //生成打开链接对象

InputStream is=urlConn.getInputStream();                                                        //从打开链接获得输入内容

//创建存储路径

StringSDPATH=Environment.getExternalStorageDirectory()+"/";        //SD卡存储路径

File dir=new File(SDPATH+path);

dir.mkdir();                                                                                                    //生成文件夹

File file=newFile(SDPATH+path+"/"+fileName);                                    //生成文件

file.createNewFile();

 

OutputStream outputStream=newFIleOutputStream(file);                  //生成写文件的输出流

 

byte[] buffer=new byte[4*1024];                   //生成一个缓冲容器   4KB大小

 

while((input.read(buffer))!=-1)             //从输入流中读

outputStream.write(buffer);                //写入文件

 

outputSteam.flush()

inputSteam.close();outputSteam.close();

 

19.ContentProvider

为存储和获取数据提供统一的接口

可以在不同程序间共享数据

比如取得android系统的联系人信息

Cursorcur=getConentResolver().query(People.CONTENT_URI,null,null,null,null);

startManagingCursor(cur);

ListAdapter listAdapter=newSimpleCursorAdapter(this,andorid.layout.lay,cur,new String[]{People.NAME},newint[]{android.R.id.text});

listView.setAdapter(listAdapter);

 

如果要自己写一个继承ContentProvider

要复写insert()  query()  delete()   update()  getType()方法,方法内容自己定义就可以达到不同的方式封装数据了

20.XML文件解析 SAX(Simple API for XML)

SAXParserFactory factory=SAXParserFactory.getInstance();     //生成一个SAXParserFactory对象

XMLReaderreader=factory.newSAXParser().getXMLReader();//factory生成一个SAXParser对象,getXMLReader方法得到Reader

//XMLReader设置ContentHandler

reader.setContentHandler(newMyContentHandler());     //MyContentHandler是自定义的继承自DefaultHandler的类,下面有类定义

reader.parse(new InputSource(newStringReader(resultString)));

 

class MyContentHandler extendsDefaultHandler{

        Stringname,address,sex,status,money;

        StringtagName;

        public voidstartDocument() throws SAXException{

              System.out.println("-------begin---------");

        }

        public voidendDocument() throws SAXException{

               System.out.println("-------end---------");

        }

//当开始读取标签时候

public void startElement(StringnamespaceURI,String localName,String qName,Attributes attr) throwsSAXException{

tagName=localName; //后面在遍历其中子标签的时候有用 

System.out.println("-------beginElement---------");

if(localName="worker") //如果标签的名字是worker

for(int i=0;i<attr.length();i++){ //显示所有属性的名和值

System.out.println(attr.getLoacalName(i)+attr.getValue(i));

}

}

public void endElement(StringnamespaceURI,String localName,String qName) throws SAXException{

System.out.println("-------endElement---------");

}

public void characters(char[] ch,intstart,int length) throws SAXException{

System.out.println("-------begin---------");

}

 

}

 

21.广播机制BroadcastReceiver

class TestReceiver extendsBroadcastReceiver{

public TestReceiver(){

 

 }

 public void onReceive(Contextcontext,Intent intent){

  //do something

 }

}

 

Manifest.xml中注册receiver

<receiverandroid:name=".TestReceiver">

<intent-filter>

<actionandroid:name="android.intent.action.EDIT">

</intent-fliter>

</reveiver>

 

<uses-permissionandroid:name="android.permission.RECEIVE_SMS">

//此种注册无论程序是否打开,在条件附合时都会进行反应

 

Intent intent=new Intent();

intent.setAction(Intent.ACTION_EDIT);

sendBoardcast(intent);     //发出消息  对比BroadcastReceiver中的actionintent中的action是否匹配  匹配则需要可以触发Receiver

 

 

//在程序中注册receiver

TestReceiver testreceiver=new TestReceiver();

IntentFilter filter=new IntentFilter();

filter.addAction("android.provider.Telepony.SMS_RECEIVED");

registerReceiver(testreceiver,filter);                          //getContext.this.registerReceiver(testreceiver,filter);

 

getContext.this.unregisterReceiver(testreceiver); //解除receiver

 

 

 

onReceive方法中获得消息的内容

Bundle bundle=intent.getExtras();

Object[]myOBJpdus=(Object[])bundle.get("pdus");

SmsMessage messages=newSmsMessage(myOBJpdus.length);

 

fot(int i=0;i<myOBJpdus.length;i++)

{

messages[i]=SmsMessage.createFromPdu((byte[])myOBJpdus[i]);

System.out.println(   messages[i].getDisplayMessageBody()     );   //输出短信内容

}

22.Wifi操作

WifiManager wifimanager=(WifiManager)xxxActivity.this.getSystemService(Context.WIFI_SERVICE);

wifimanager.setWifiEnabled(true);              //false为关闭

System.out.println("wifistate----->"+wifimanager.getWifiState());

Toast.makeText(xxxActivity.this,"当前WIFI状态为"+wifimanager.getWifiState(),Toast.LENGTH_SHORT);

记得要在Manifest.xml中获得相应的权限

 

23.Socket编程

基于TCP协议:

Server服务器端:

启动一个新的线程:newServerThread().start()

class ServerThread extends Thread{

 public void run(){

 ServerSocket serverSocket=newServerSocket(4567);   //生成一个服务器socket对象,监听4567端口

 Socketsocket=serverSocket.accept();                            //获得服务器端serverSocket接受客户端传来的socket

 InputStream inputStream=socket.getInputStream();          //从获得来的socket中取到输入流

 byte[] buffer=newbyte[4*1024];  /缓冲容器

 int temp=0;                                      

 while((temp=inputStream.read(buffer))!=-1)

 System.out.println(newString(buffer,0,temp));               //输出获得的内容

 }

}

 

Client客户端:

Socket socket=newSocket("192.168.1.104",4567);     //要发送信息到的IP地址,端口

InputStream inputStream =newFileInputStream("D:\a.txt");

OutputStreamoutputStream=socket.getOutputStream();        //获得要发送socketOutputStream来修改

byte[] buffer=new byte[4*1024];

int temp=0;

while((temp=inputStream.read(buffer))!=-1){

 outputStream.write(buffer,0,temp);

}

 

基于UDP协议:

Server服务器端:

public void run(){

        DatagramSocket socket=new DatagramSocket(4567);      //UDP要用DatagramSocket

byte[] data=new byte[1024]; 

 DatagramPacket packet=newDatagramPacket(data,data.length);

 socket.receive(packet);                                                         //等待客户端发送包

 

 String result=newString(packet.getData(),packet.getOffset(),packet.getLength());

}

 

Client客户端:

DatagramSocket socket=newDatagramSocket(4567);

InetAddress serverAddress=InetAddress.getByName("192.168.1.104");

String str="hello";

byte[] data=str.getBytes(); //string拆成字节数组

DatagramPacket packet=newDatagramPacket(data,data.length(),serverAddress,4567);

socket.send(packet);

 

TCP按流传递信息,UDP按包传递信息

24.Service

class TestService extends Service{

   public IBinder onBind(Intent intent){

 

   }

 public void  onCreate(){

 

   }

 public int onStartCommand(Intent intent,int flags,int startId){

 

   }

  

 public void  onDestory(){

 

   }

 

}

Manifest.xml中注册

<serviceandroid:name=".TestService"></service>

 

调用时候:

Intent intent=new Intent();

intent.setClass(TestServiceActivity.this,TestService.class);

startService(intent);        //stopService(intent);

 

 

25.Annimations动画效果

先创建一个AnimationSet

AnimationSet animationSet= newAnimationSet(true);

AlaphaAnimation  alpha=newAlaphaAnimation(1,0);

alpha.setDuration(1000);

animationSet.addAnimation(alpha);

imageView.StartAnimation(animationSet);

 

0 0
原创粉丝点击