Android基礎學習筆記
07-07
1.一個Android Project的文件作用
推薦閱讀:
用eclipse生成一個Android Project,配置好後,生成了很多文件
src文件夾中是自己編寫的源文件
gen文件夾下的R.java是ADT自動生成的文件,主要內容是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<Buttonandroid: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類Button mybutton=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/Implement選onCreate) 在AndroidManifest.xml中添加Activity{ 其中要添加android:name=".otherActivity" (前面有一個" . ",加上包名剛好找到) android:label="@string/other" (在string.xml中設置了<string name="other">hahaha</string>) } 在layout中添加一個other.xml文件,添加布局,新增一個button,在onCreate方法中setContentView(R.layout.other);繼續,創造聯繫兩個Activity的Intent 在與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(new MyButtonListener());在otherActivity類名中進行獲得傳遞的參數值Intent intent=getIntent(); //先獲得Intent對象 String value=intent.getStringExtra("Tags"); //把傳過來的值獲得 調用viewtext的setText方法進行設置顯示其中關鍵的方法: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(Menu menu)方法然後用menu.add(0,1,1,string)來添加MENU選項要編寫每個選項實現的功能要重寫onOptionsItemSelected(MenuItem item)方法其中關鍵方法:menu.add(int groupId,int ItemId,int order,string description) int id= item.getItemId(); //返回點擊的Item的id值7.彈出對話框在Manifest.xml中添加Activity的時候多加一個android:theme="@android:style/Theme.Dialog"8.RadioGroup RadioButton控制項添加RadioGroup控制項時有一個屬性 android:orientation="vertival" "horizontal"為RadioGroup添加一個setOnCheckedChangeListenerrg.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {@Overridepublic void onCheckedChanged(RadioGroup group, int checkedId) {// TODO Auto-generated method stubif(male.getId()==checkedId){System.out.println("click male");}else if(female.getId()==checkedId){System.out.println("click female");}}});關鍵方法:radioButton1.getId()9.CheckBox控制項swim.setOnCheckedChangeListener(new RadioGroup.OnCheckedListener(){ public void OnCheckedChange(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=newArrayList<HashMap<String,String>>();HashMap<String,String> map1=newHashMap<String,String>();map1.put("user_name","user1"); map1.put("user_ip","192.168.9.1");list.add(map1);ListView有一個onListItemClick(ListView l,View v,int position,long id) 方法可以複寫來獲得點擊控制項的位置,id等關鍵方法:android:id="@id/android:list"setListAdapter(adapter);new SimpleAdapter(blablabla)13.Activity的布局控制項的一些屬性android:idandroid:gravity //控制項中的內容相對於控制項本身的位置android:layout_width layout_heightandroid:background="#aa0000" //背景顏色RGB ="@android:drawable/editbox_background" android默認的文本框顏色android:textsize="35pt" //字體大小 pt磅android:paddingLeft/Top/Right/Bottom="20dip" //dip是與手機屏幕大小無關的單位,也可以用pxandroid:margin //外邊距android:weight="1" //這個控制項相對於別的控制項的大小android:singleLine="true" //是否把內容顯示在同一行layout有LinearLayout TableLayout RelativeLayoutLinearLayout android:orientation="vertical" horizontalTableLayout中 android:stretchColumns="1" 內容填不滿時候拉伸的列號標籤里加<TableRow> </TableRow>RelativeLayout中的控制項屬性有 android:layout_above="@id/xxx" below toLeftOf toRightOf //把當前控制項放在XXX的上下左右android:layout_alignBaseline="@id/xxx"alignBottom alignLeft alignRight alignTop //同時把兩個控制項的上/下/左/右邊緣對齊,類似嵌套android:layout_alignParentBottom alignParentLeft alignParentRight alignParentTop //和父控制項對齊邊緣,值為true falseandroid:layout_centerHorizontal centerInParent centerVertical //值為true false14.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("Begin Thread"); 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中加入線程沒有調用newThread的start()方法,直接用了run()方法,其實handler和main還是在同一線程中,並未分開執行,如果要分開執行,需要用HandlerThread類來進行//先創建一個HandlerThread對象 一個線程HandlerThread handlerThread=new HandlerThread("handler_thread"); //這裡括弧的參數是要生成新的線程的名字!!!!handlerThread.start(); //一個HandlerThread中有一個LooperHandler myhand=new Handler(handlerThread.getLooper()); //Handler類有一個以looper為參數的構造函數 //這樣,新創建的Handler就在一個新的線程中了//Message msg=myHandler.obtainMessage();//msg.sendToTarget();15.BundleBundle 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資料庫寫一個類繼承SQLiteOpenHelperpublic class DBHelper extends SQLiteOpenHelper {public DBHelper(Context context,String name,CursorFactory factory,int version) {// TODO Auto-generated constructor stubsuper(context,name,factory,version); //複寫構造函數}public void onCreate(SQLiteDatabase db) { //複寫OnCreate方法// TODO Auto-generated method stubSystem.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 stubSystem.out.println("Update a database");}}生成一個繼承來的類DBHelper dbHelper=new DBHelper(工程類的名字.this,"資料庫名",null,1); //SQLiteOpenHelper是一個資料庫的管理類SQLiteDatabase db=dbHelper.getWritableDatabase(); //這個時候生成了SQLiteDatabase對象才調用了OnCreate,創建了資料庫ContentValues values=new ContentValues(); //插入和更新都要靠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=?", new String[]{"1"}, null, null, null); 表名 選中的列 限制條件 條件域 groupBy having orderBywhile(cur.moveToNext){String name = cur.getString(cur.getColumnIndex("name"));System.out.println("query--->" + name);}17.網路文本讀取讀取文本文件:即把一個文本內容全部取出首先,生成一個URL對象URL url=new URL(urlStr);再生成一個HttpURLConnection對象HttpURLConnection urlConn=(HttpURLConnection)url.openConnection();返迴文件中的內容urlConn.getInputStream(); //返回一個InputStream對象new InputStreamReader(urlConn.getInputStream()); //返回一個Reader對象BufferedReader br=new BufferedReader(newInputStreamReader(urlConn.getInputStream())); //內容存在了一個BufferedReaderStringBuffer sb=new StringBuffer(); String line=null;因為BufferedReader有getLine功能while((line=br.getLine())!=null){sb.append(line);}18.下載文件並且放入SD卡中首先需要在Manifest.xml中添加兩個許可權<uses-permission android:name="android.permission.INTERNET"/><uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>下載文件需要地址urlStr,存文件需要路徑path和保存的文件名fileNameURL url=new URL(urlStr);HttpURLConnection urlConn=(HttpURLConnection)url.openConnection(); //生成打開鏈接對象InputStream is=urlConn.getInputStream(); //從打開鏈接獲得輸入內容//創建存儲路徑String SDPATH=Environment.getExternalStorageDirectory()+"/"; //SD卡存儲路徑File dir=new File(SDPATH+path);dir.mkdir(); //生成文件夾File file=new File(SDPATH+path+"/"+fileName); //生成文件file.createNewFile();OutputStream outputStream=new FIleOutputStream(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系統的聯繫人信息Cursor cur=getConentResolver().query(People.CONTENT_URI,null,null,null,null);startManagingCursor(cur);ListAdapter listAdapter=new SimpleCursorAdapter(this,andorid.layout.lay,cur,new String[]{People.NAME},new int[]{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對象XMLReader reader=factory.newSAXParser().getXMLReader();//用factory生成一個SAXParser對象,getXMLReader方法得到Reader//為XMLReader設置ContentHandlerreader.setContentHandler(new MyContentHandler()); //MyContentHandler是自定義的繼承自DefaultHandler的類,下面有類定義reader.parse(new InputSource(new StringReader(resultString)));class MyContentHandler extends DefaultHandler{ String name,address,sex,status,money; String tagName; public void startDocument() throws SAXException{ System.out.println("-------begin---------"); } public void endDocument() throws SAXException{ System.out.println("-------end---------"); }//當開始讀取標籤時候public void startElement(String namespaceURI,String localName,String qName,Attributes attr) throws SAXException{tagName=localName; //後面在遍歷其中子標籤的時候有用System.out.println("-------begin Element---------");if(localName="worker") //如果標籤的名字是workerfor(int i=0;i<attr.length();i++){ //顯示所有屬性的名和值System.out.println(attr.getLoacalName(i)+attr.getValue(i));}}public void endElement(String namespaceURI,String localName,String qName) throws SAXException{System.out.println("-------end Element---------");}public void characters(char[] ch,int start,int length) throws SAXException{System.out.println("-------begin---------");}}21.廣播機制BroadcastReceiverclass TestReceiver extends BroadcastReceiver{public TestReceiver(){}public void onReceive(Context context,Intent intent){ //do something}}在Manifest.xml中註冊receiver<receiver android:name=".TestReceiver"><intent-filter><action android:name="android.intent.action.EDIT"></intent-fliter></reveiver><uses-permission android:name="android.permission.RECEIVE_SMS">//此種註冊無論程序是否打開,在條件附合時都會進行反應Intent intent=new Intent();intent.setAction(Intent.ACTION_EDIT);sendBoardcast(intent); //發出消息 對比BroadcastReceiver中的action 和intent中的action是否匹配 匹配則需要可以觸發Receiver//在程序中註冊receiverTestReceivertestreceiver=newTestReceiver();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=new SmsMessage(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("wifi state----->"+wifimanager.getWifiState());Toast.makeText(xxxActivity.this,"當前WIFI狀態為"+wifimanager.getWifiState(),Toast.LENGTH_SHORT);記得要在Manifest.xml中獲得相應的許可權23.Socket編程基於TCP協議:Server伺服器端:啟動一個新的線程:new ServerThread().start()class ServerThread extends Thread{public void run(){ServerSocket serverSocket=new ServerSocket(4567); //生成一個伺服器socket對象,監聽4567埠Socket socket=serverSocket.accept(); //獲得伺服器端serverSocket接受客戶端傳來的socketInputStream inputStream=socket.getInputStream(); //從獲得來的socket中取到輸入流byte[] buffer=new byte[4*1024];/緩衝容器int temp=0; while((temp=inputStream.read(buffer))!=-1)System.out.println(new String(buffer,0,temp)); //輸出獲得的內容}}Client客戶端:Socket socket=new Socket("192.168.1.104",4567); //要發送信息到的IP地址,埠InputStream inputStream =new FileInputStream("D:a.txt");OutputStream outputStream=socket.getOutputStream(); //獲得要發送socket的OutputStream來修改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要用DatagramSocketbyte[] data=new byte[1024];DatagramPacket packet=new DatagramPacket(data,data.length);socket.receive(packet); //等待客戶端發送包String result=new String(packet.getData(),packet.getOffset(),packet.getLength());}Client客戶端:DatagramSocket socket=new DatagramSocket(4567);InetAddress serverAddress =InetAddress.getByName("192.168.1.104");String str="hello";byte[] data=str.getBytes();//把string拆成位元組數組DatagramPacket packet=new DatagramPacket(data,data.length(),serverAddress,4567);socket.send(packet);TCP按流傳遞信息,UDP按包傳遞信息推薦閱讀:
※善於學習方能立於不敗之地
※作為父母,你真的需要學習
※我很著急,可孩子對待學習總是不急
※學習對聯,有它不求人
※富蘭克林的自我管理(值得學習借鑒)
