編輯:關於Android編程
調整字體大小,字符集,配置android sdk的位置
>創建模擬器:
next-next-next-Empty Activity-next-finish
打開應用程序的AndroidManifest.xml文件,修改minsdkVersion值為8.
>L01_HelloWorld:指明當前工程的名稱
>src:存放我們編寫的java代碼
>XxxActivity:一個XxxActivity對應著一個可以與用戶交互的應用程序的界面。
>繼承於Activity
>重寫onCreate()方法。在方法內:
super .onCreate(savedInstanceState); 調用父類的此方法,進行必要的初始化操作
setContentView(R.layout. activity_main); 加載布局文件
>gen : 系統自動生成的文件目錄。裡面包含著以應用程序包名命名的一個包 ,包含著R.java
>R類:實際上代表著res文件目錄,通過R類,可以實現代碼和應用程序之間的調用。
R類的內部結構是系統自動生成的,一般我們不去操作
>assets:資產目錄
>bin:編譯以後的classes.dex 文件,apk文件都保存在此目錄下
>libs:存放第三方的jar包
res:全稱:resource:資源,代表著當前應用程序的資源目錄。內部保存著layout/drawable / values-strings/values-style
>drawable-xxx:提供了不同分辨率的圖片,供不同分辨率的手機所使用。
>layout:布局文件。對應著每一個應用程序界面的布局,布局文件就聲明在此文件目錄下。
文件都是xml格式
>values-strings.xml:聲明當前應用程序需要的字符串數據。可以在功能清單文件和布局文件中使用
>values-style.xml:當前應用程序的樣式和主題都聲明在此
AndroidManifest.xml:功能清單文件。類似於web工程中的web.xml文件
>指明當前應用程序的包名、可以適配的sdk的最低版本、當前應用程序的版本號、權限
:指明當前應用程序的名稱label,圖標icon,主題Theme
對應著一個用戶界面的Activity。每一個應用程序的Activity的子類,都需要在此功能清單文件中注冊。
可以聲明屬性:name /label /theme / launchmode
< intent-filter>
< action android:name ="android.intent.action.MAIN" />
< category android:name ="android.intent.category.LAUNCHER" />
此處的intent-filter的作用:
action:當前的action的值指明了當前的Activity是當前應用的主界面
category:使得當前的應用程序可以顯示在系統的桌面應用中
2). 應用APK的
3). Android系統的
4). SDK的
2). DDMS: eclipse中的debug調試工具:
3). Log: 日志工具類
結論:
1.如果給視圖組件設置具體的長度或者寬度時,我們要選擇使用dp為單位,而不要選擇px為單位。
2.如果設置視圖組件的字體的大小,我們選擇sp,而不用dp.
完成步驟:
1.創建一個安卓工程,修改AndroidManifest.xml中的minsdkVersion.
2.完成布局文件:xxx.xml文件。
3.完成業務邏輯:
1)在XxxActivity的onCreate方法中加載布局文件:setContentView(R.layout.xxx);
2)獲取界面上對應的視圖對象: findViewById(R.id.xxx)
3)在試圖對象上綁定指定的監聽器: button.setOnClickListener(listener);
必須重寫監聽器的抽象方法: onClick()
補充:
模擬器經常掉線,可以考慮的修改措施:
第1層次:reset adb
第2層次:將掉線的模擬器關閉,重新開啟
第3層次:關閉掉線的模擬器,關閉eclipse,打開任務管理器將adb.exe進程刪掉。然後重啟Eclipse和模擬器
關於IntentFilter
關於Activity的啟動模式:LaunchMode
在AndroidManifest.xml中的的屬性中設置啟動模式。
1). 功能描述:
1) 點擊”打電話”: 進入撥號界面
2) 長按”打電話”: 直接撥打電話
3) 點擊”發短信”: 進入編輯短信界面
_____________________________________________
4) 長按”發短信”: 直接將短信發送出去
2). 技術點:
① 布局的搭建。在ViewGroup中還可以嵌套ViewGroup
② 給必要的視圖對象設置點擊或長按的監聽事件
③ 如何在當前應用中調用其它應用。 需要使用隱式意圖。
④ 數據的攜帶。putExtra(String key,Xxx value) (--->Xxx getXxxExtra(String key)) ,setData(Uri uri);
⑤ 權限的聲明:需要在功能清單文件中,設置當前應用的權限。
3). 總結:
1). 實現一個簡單功能的應用的步驟:
①創建一個應用,修改一下minsdkVersion
②完成布局的搭建
③回到Activity中,加載布局文件:setContentView(R.layout.xxx)
④獲取並初始化視圖對象 並對必要的視圖對象設置監聽
⑤完成監聽需要做的相應的功能
2). 使用隱式意圖啟動系統應用的界面
首先打開要啟動的某一個應用的界面A,通過logcat,使用ActivityManager進行過濾,查看打開的當前界面的信息:當前的Activity類以及所聲明的包名。
其次,找到應用程序的源碼,在其功能清單文件中,搜索當前的Activity,找到其聲明的
繼承樹結構:
2). EditText : 可編輯的文本視圖
3). Button : 按鈕
4). ImageView : 圖片視圖
5). CheckBox : 多選框
6). RadioGroup/RadioButton : 單選框
b. 水平
2). SeekBar
從代碼角度,設置view的可見性:
2). AlertDialog
a. 一般的
方法鏈的的使用:
new AlertDialog.Builder(this)
.setTitle("")
.setMessage("")
.setPositiveButton("確定",listener)
.setNegativeButton("取消",listener)
.show();
//自動的dismiss.
b.帶單選列表的
new AlertDialog.Builder( this)
.setTitle( "請選擇背景顏色" )
. setSingleChoiceItems( String[] arr,listener)
.show();
//需要手動的dismiss.
c.自定義布局的
//1.創建對應指定布局文件的View對象
final View view = View.inflate (this , R.layout.dialog_login , null);
//2.將view填充到AlertDialog中
new AlertDialog.Builder( this)
.setView(view)
.setPositiveButton( "確認" ,listener)
.setNegativeButton("取消",null)
.show();
3). ProgressDialog
a. 圓形進度
final ProgressDialog dialog = ProgressDialog.show( this, "數據加載" ,"數據正在加載..." );
//創建一個分線程(繼承的方式)
new Thread(){
public void run() {
//停留3秒鐘
try {
Thread. sleep(3000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//使得當前的dialog消失
dialog.dismiss();
}
}.start();
b. 水平進度
//創建一個ProgressDialog
final ProgressDialog dialog = new ProgressDialog(this );
//設置其為水平的格式
dialog.setProgressStyle(ProgressDialog. STYLE_HORIZONTAL);
//顯示
dialog.show();
//創建一個分線程,模擬數據的下載(實現的方式)
new Thread(new Runnable(){
@Override
public void run() {
int count = 200;
//設置dialog的最大值
dialog.setMax(count);
//模擬數據的下載
for(int i = 0;i < count;i++){
//方式一:
//dialog.setProgress(dialog.getProgress() + 1);
//方式二:
dialog.incrementProgressBy(1);
try {
Thread. sleep(10);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
//設置dialog消失
dialog.dismiss();
}
}).start();
4). DatePickerDialog 和 TimePickerDialog
2). 根據id查找View對象:findViewById(int id)
>this.findViewById(int id):this代表當前的Activity對象。實際上是在Activity所加載的布局文件中找指定id的視圖組件。
>XxxActivity.this.findViewById(int id):通常使用在Activity的內部類中,表示調用的是外部類XxxActivity所對應的布局文件中find指定的id的視圖對象
>view.findViewById(int id):在指定的view所對應的布局文件中查找指定的id的視圖對象
view的創建方式:View view = View.inflate(this,R.layout.xxx,null);
3). 更新視圖
layout_gravity(對外):在子view中聲明此屬性,指明此子view相對於父視圖的相對位置
gravity(對內):①使用在EditText或者TextView中,指明其內部的文本內容當對於自己的位置
②在父視圖中使用此屬性,表明其內部的子view相對於自己的位置
2). 只針對RelativeLayout
針對於兄弟視圖之間:
與父視圖之間:
3). 只針對LinearLayout
1.orientation(方向) horizontal (水平方向)/ vertical(垂直方向)
2.layout_weight(權重) 我們可以設置不同子view在父View中的權重。
分類:簡單視圖列表 和 復雜視圖列表
繼承結構:
2). 使用
a. ArrayAdapter : 顯示簡單文本列表
b. SimpleAdpater :顯示復雜列表
c. BaseAdpater(抽象的父類): 顯示復雜列表
//如何將集合中指定位置的數據裝配到指定的position位置的item裡面
@Override
public View getView(int position, View convertView, ViewGroup parent) {
//Log.e("TAG", "getView() position:" + position + ",convertView :" + convertView);
if(convertView == null){
//創建item布局對應的View對象
convertView = View.inflate(BaseAdapterActivity.this, R.layout. item_ba, null);
Log. e("TAG", "創建新的view對象。position : " + position);
} else{
Log. e("TAG", "復用現有的view對象。position : " + position);
}
//從View對象中取出需要裝配數據的結構
ImageView iv_ba_icon= (ImageView) convertView.findViewById(R.id.iv_ba_icon );
TextView tv_ba_name = (TextView) convertView.findViewById(R.id.tv_ba_name );
TextView tv_ba_content = (TextView) convertView.findViewById(R.id.tv_ba_content );
//從集合中取出指定位置的數據
FoodInfo foodInfo = data.get(position);
//裝配數據
iv_ba_icon.setImageResource(foodInfo.getIcon());
tv_ba_name.setText(foodInfo.getName());
tv_ba_content.setText(foodInfo.getContent());
return convertView;
}
3). 給ListView的Item設置監聽
//給ListView設置點擊的監聽事件
lv_main.setOnItemClickListener(listener);
//給ListView設置長按的監聽事件
lv_main.setOnItemLongClickListener( listener );
4). ListView的優化(第一層次)
ListView的優化主要針對的就是getView()方法的優化
getView()的作用:如何將集合中指定位置的數據裝配到指定的position位置的item裡面
優化前:如果當前的ListView一共需要顯示1萬條數據,那麼當每次調用getView()方法時,都會創建一個View對象。效率是比較低的。
優化:假設屏幕上初始化時能顯示10個item項,那麼屏幕上最多可以顯示11個item項。
優化以後,我們只需要最多創建11個View對象即可。後需要顯示的view復用已經創建好的View對象。
主題:Theme

1.技術點:
1) ListView (或GridView) + Adapter (ArrayAdapter/SimpleAdapter/ BaseAdapter) + data (集合、數組) + Item Layout
2) 涉及ListView的優化,即getView()方法的優化
3) Adapter通過將內存中的數據進行裝配,顯示在ListView中。
內存中的數據是如何獲取的?① 直接在代碼中寫明。 ② 通過指定的方法,調用本地文件 ③通過聯網獲取數據
4)ArrayAdapter處理的是List
比較內部文件與外部文件存儲?
>文件不大,訪問較為頻繁,比較重要=>手機內部存儲
>數據如果是私有的,不希望其它應用訪問,考慮使用手機內部存儲
>是否需要隨著應用的卸載而被刪除。不需要,使用手機外部存儲的路徑2的方式
應用一:
技術點:
1.GridView + Adapter
2.設置GridView的點擊和長按事件
3.AlertDialog的使用
4.使用SharedPreferences存儲
1) 使用的是Java提供的API:HttpURLConnection
1.要訪問資源的路徑: GET請求: http://192.168.10.165:8080/Web_server/index.jsp?username=Tom&age=10
POST請求:http://192.168.10.165:8080/Web_server/index.jsp
2. URL url = new URL(path)
3.獲取連接對象: HttpURLConnection conn = url.openConnection();
4.設置參數: conn.setConnectionTimeout(); conn.setReadTimeout(); 請求方法:setRequestMethod(); setDoInput();setDoOutput()
如果是POST請求,需要填充請求參數:
conn.getOutputStream().write(byte[]);
5.連接: conn.connect();
6.獲取響應碼: conn.getResponseCode() == 200 404 500
7.獲取服務器端發送過來的數據: conn.getInputStream() BitmapFactory.decode(InputStream is)
8.資源的關閉:流的關閉,連接的關閉:conn.disconnect();
2) android內置的API:HttpClient
1.創建了一個客戶端的對象: DefaultHttpClient
2.設置請求參數: HttpConnectionParams
3.提供一個GET請求的對象/ POST請求的對象: (包含請求路徑)
GET請求: http://192.168.10.165:8080/Web_server/index.jsp?username=Tom&age=10
POST請求:http://192.168.10.165:8080/Web_server/index.jsp
GET請求: new HttpGet(path)
POST請求: new HttpPost(path); 設置請求體: httpPost.setEntity();
4. 得到HttpResponse : client.execute(httpGet/ httpPost)
5. 獲取響應狀態行中的響應碼:httpResponse.getStatusLine() .getStatusCode()
6. 獲取包含響應數據的entity : httpResponse.getEntity()
7. 解析數據: EntityUtils.toString(entity,charset)
8. 使用響應數據
9.資源的關閉: client.getConnectionManager.shutDown();
3 ) 第三方框架:Volley / XUtils
1. 創建一個RequestQueue (先進先出的特點)
2. 創建請求對象: StringRequest/JsonRequest/ImageRequest (重寫 onResponse(String result ) / onErrorResponse())
如果是一個POST請求,還需要重寫getParams(),返回一個包含請求數據的map即可。
3.將請求對象添加到隊列裡: queue.add(request);
技術點:
1. 顯示一個水平的ProgressDialog:如何創建,如何設置最大值(setMax()),如何讓進度條增長( setProgress(getProgress() + len) /incrementProgressBy(len) ),消失(dismiss())
2.能夠創建指定目錄下的一個文件。(存儲在本地: context.getFilesDir() (路徑:data/data/應用包名/files/.. ) 存儲在sd卡:① context.getExternalFilesDir() (路徑: storage/sdcard/Android/data/應用包名/files/...) ② Environment.getExternalStorageDirectory() (路徑:storage/sdcard/ )
創建一個文件的方式:File file = new File(...., "");
3.使用分線程Thread + runOnUiThread();
4.如何啟動另外一個應用的Activity。
5.權限的使用:
4). 相關API
Web中的JDBC (Java DataBase Connectivity)技術:使用Java程序操作數據庫的一門技術。
Driver(驅動):類似於SQLiteOpenHelper類
Connection(數據庫連接):類似於SqliteDatabase類
PreparedStatement:類似於SqliteDatabase類
ResultSet(結果集):類似於Cursor類
5). Android單元測試
1. 添加配置信息
<uses-libraryandroid:name="android.test.runner" />
</application>
<instrumentationandroid:name="android.test.InstrumentationTestRunner"
android:targetPackage="com.atguigu.t4_storage”/>
2. 編寫測試類
class StudentTest extends AndroidTestCase 6). 練習總結
技術點:
1.布局的設計:ListView + LinearLayout (權重:weight)
2.數據庫的使用: SQLiteOpenHelper + SqliteDatabase + Cursor 結構實現對數據庫的CRUD(增、刪、改、查)操作。
將CRUD的相關操作封裝在BlackNumberDAO類中
3.Android單元測試的使用
4.數據的顯示:實際上調用的就是BlackNumberDAO類中的查詢操作,將查詢到的數據保存在List
如何實現線程間通信呢? (分線程如何傳送數據給主線程)
方式一: Thread + runOnUiThead()
方式二: Thread + Handler + Message
方式三: AsyncTask (實現了對Thread 和 Handler的封裝,提供了一個線程池)
雖然handleMessage()方法的優先級比較低,但是是我們主要使用的方式。
c. 移除消息
?移除指定what標識的消息:removeMessages(int what)
移除所有未執行的消息: removeCallbacksAndMessages(null)
理解MessageQueue 和 Looper:(大家在編寫代碼時,不會顯示的去使用這兩個類的,但是如果談消息機制的原理,就離不了這兩個類)
2). 相關API
實現聯網請求功能的3步:
第1步:主線程:顯示提示列表 : onPreExecute();
第2步:分線程:聯網下載數據 : doInBackground()
第3步:主線程:更新視圖: onPostExecute()
面試題:同步和異步的區別?
2). json數據格式
3). 如何解析json?
API:
* 1. 將json格式的字符串{}轉換為Java對象, 使用原生API
2. 將json格式的字符串[]轉換為Java對象的List, 使用原生API
3. 將json格式的字符串{}轉換為Java對象, 使用GSON
4. 將json格式的字符串[]轉換為Java對象的List, 使用GSON
5. 將Java對象轉換為 json字符串{}, 使用GSON
6. 將Java對象的List轉換為 json字符串[], 使用GSON
1-4:將 json格式的字符串( json對象、json數組)轉換為java對象、java對象構成的List。 =>通常使用在客戶端
5-6:java對象、java對象構成的List轉換為 json格式的字符串( json對象、json數組) =>通常使用在服務器端
*
總結:哪些位置用到了反射?(,面試題)
1.一個ActivityA中啟動另外一個ActivityB時,另外的這個ActivityB對象,就是系統通過反射的方式幫我們創建的
startActivity(new Intent(this,activityB.class)); --ActivityB的全路徑名已經在AndroidManifest.xml中聲明過了
--拓展:進而startService()等相關的要訪問的組件,都是系統幫我們創建的。
2.在使用setContentView(R.layout.activity_main);讓Activity關聯某一個布局文件。
布局文件中涉及到的各個標簽所對應的布局本身和具體的子View的對象,也是系統幫我們自動創建的。
3. new Gson().fromJson(String json,Class clazz); 底層通過反射將json中的相關數據裝配到clazz所對應的運行時類的對象中
技術點:
1.使用FrameLayout實現組件的重疊
2. ListView + BaseAdatper的使用
3. 聯網的操作: HttpURLConnection HttpClient Volley
4. JSON格式數據的解析
5. 使用異步任務(AsyncTask)實現圖片的下載
6.體會一下聯網的三個步驟
7.圖片的三級緩存的使用
8.關於圖片的閃動問題的解決
9.權限:聯網的權限;寫入sd卡的權限
2).事件發生的順序:
注意:?對屏幕的任何一個操作, 系統都會自動創建一個MotionEvent對象來對應這個操作,記錄用戶行為
3). API:
操作事件:
事件的分發:從外到內:調用Activity的dispatchTouchEvent() --->ViewGroup 的dispatchTouchEvent()--->某個點擊的view
的dispatchTouchEvent()
事件的消費:從裡到外:調用綁定在某個點擊的view對象的監聽器上,調用監聽器的onTouch() ---->調用view對象的onTouchEvent() ---->ViewGroup 的onTouchEvent() --->調用Activity的onTouchEvent()
一旦在消費的過程中,某一個方法返回true,表示消費了此事件。則不再繼續向外傳遞。
4).事件分發和處理流程
2). API:
注意點:1.正常情況下,當我們長按某一個key時,會調用-onKeyDown() - onKeyDown()- .... - onKeyLongPress() -- onKeyDown()-
... - onKeyUp().
2.我們發現有些按鍵在長按時,並沒有觸發onKeyLongPress()方法,如何實現這個方法的調用:
1)將onKeyDown()方法返回值改為return true
2)在返回之前,調用event.startTracking()
3.一般情況下,針對於KeyEvent來講,也就針對於onKeyUp()進行操作,對返回鍵(KeyEvent. KEYCODE_BACK)設置單次點擊不能退
出應用的操作。
技術點:
1.通過調用MotionEvent的getRawX() 和 getRawY(),獲取焦點的坐標
2.通過調用View的getLeft() getRight() getTop() getBottom() 方法,獲取具體的界面上的一個view的坐標
3.通過調用View的layout(l,t,r,b)重新給view定位
4.調用子視圖view的getParent()獲取父視圖。
針對於KeyEvent:
1.在onKeyUp()方法中修改返回值,不讓其直接調用:super .onKeyUp(keyCode, event)
2.設置一個boolean型變量:第一次點擊時,修改boolean型變量的值,使其第二次點擊時,調用super .onKeyUp(keyCode, event)
3.發送一個延遲的空消息,將boolean變量修改為最初的值。
4.為了保證不出現內存洩漏的問題,在onDestroy()中,移除所有未處理的消息
2).區別Service與Thread?
3.Service的定義
4.Service的啟動與停止
注意:每次startService都會調用Service的onStartCommand()
針對於綁定的方式,如果onBind()方法返回值非空,則會調用啟動者(比如:activity)
中的ServiceConnection中的onServiceConnected()方法。
2)
對照著ppt實現AIDL的功能即可
1.使用本地服務,實現在應用對應的Activity銷毀時,音樂文件依然可以播放。同時,當我們再進入操作界面時,此時的
Activity是一個新的對象,但是,我們仍然可以操作之前開啟的服務。
2.這裡我們將音樂播放的功能,在服務裡實現。
應用二:掛斷電話功能
反射的使用:
//1.通過反射獲取系統服務的管理器
Class clazz = Class.forName( "android.os.ServiceManager");
//2.獲取其內部指定的方法
Method method = clazz.getDeclaredMethod( "getService" , String. class);
//3.調用方法:操作電話服務
IBinder iBinder = (IBinder) method.invoke(null ,Context.TELEPHONY_SERVICE );
應用三:實現黑名單電話的自動掛斷
技術點:
1.對來電相應狀態的監聽,我們在服務中實現
2.TelephonyManager 和 PhoneStateListener 的使用
3.手機來電的三種狀態:空閒狀態、響鈴狀態、接通狀態
2).相關API
3). 常見廣播:
2. 發送廣播
1. 針對於開機廣播,創建一個開機廣播的接收器。配置action,提供權限
2.一旦開機,對應廣播接收器的onReceive()方法就開始執行。
3.在此回調方法內,設置startService()的方法,開啟黑名單電話攔截的服務
1.針對於來短信這個有序廣播來說,我們創建一個對應的廣播接收器。配置action,提供權限
2.針對於有序廣播來說,設置最高的優先級:Integer.MAX_VALUE
3.一來短信,對應的接收器的onReceive()開始執行,短信的數據就封裝在onReceive()方法形參的intent中
4.從intent中將短信號碼和短信內容取出來。判斷短信號碼是否為黑名單號碼。若是,執行abortBroadcast()方法。
2). ContentProvider是什麼?
2. 相關API:
1). ContentProvider: 內容提供者類
2). ContentResolver: 內容解析器類 :
3).Uri: 包含一個具有一定格式的字符串所對應資源的類
4).
5). ContentUris: 操作uri的工具類
3. 自定義ContentProvider
技術點:
1.如何啟動一個帶回調的Activity。 startActivityForResult() ---> setResult() ---->onActivityResult()
2.顯示列表數據: ListView + BaseAdapter + List
2). View動畫的使用
1. 公用功能
2. 如何指定坐標(中心點, 起始點, 目標點)
2.1 java代碼上:
2.2 xml格式:
3). 使用Drawable 動畫
第1步: 在res-drawable目錄下創建相應的xml格式的文件:
第2步:在具體的組件中配置:
第3步:使用具體的button設置監聽的回調方法。在回調方法中:(AnimationDrawable對象只需要提供一個即可)
技術點:
1.設置圖片為整體布局的background屬性,同時聲明當前Activity的主題:全屏顯示
2.設置旋轉、縮放、透明度動畫的集並作用在LinearLayout上。
3.自定義圓形進度條
4.設置動畫的監聽,在動畫結束的時候啟動一個新的Activity
5.設置不同的Activity之間切換的動畫
6.將系統提供的sample應用:ApiDemos的工程導入eclipse中。
應用二:
1.布局的設置:使用到了FramLayout顯示圖片的疊加
2.如何實現旋轉動畫,同時注意設置repeatCount:設置為無限循環。當掃描完成時,需要清除動畫
3.使用異步任務實現數據的掃描
4.使用Drawable動畫,顯示圖層效果。
2). 自定義圖形
3). 定義多狀態圖形圖片
接著在具體的view組件上,以background屬性的方式添加上
b. selector+drawable
4). 9Patch圖片:
a. 理解
b. 制作
>拖拉上和左的線條,用於將圖片分成9個區域。
>默認情況下,只有1區是可以顯示內容的
>拖拉下和右的線條,指定可以顯示內容的區域大小
好處: 保證圖片在放大以後,不失真!
4. 應用練習
技術點:
1. 9patch圖片的制作
2. PopupWindow的創建,加載指定的布局,顯示在指定位置,消失
3. 給ListView設置onScrollListener()
4. 設置PopupWindow顯示的動畫
5. 給視圖對象設置監聽
6. selector + shape的使用
Android自定義view之仿支付寶芝麻信用儀表盤示例
自定義view練習 仿支付寶芝麻信用的儀表盤對比圖:首先是自定義一些屬性,可自己再添加,挺基礎的,上代碼<?xml version=1.0 encoding
Android開發-DesignDemo-AndroidStudio(九)FloatingActionButton(1)
簡單對比FloatingActionButton和ImageButton的區別:左邊是ImageButton,右邊是FloatingActionButton:activi
(Android review)dialog的使用
一、基本知識點常見的dialog基本代碼:AlertDialog.Builder builder = new AlertDialog.Builder(this);Aler
Android popupwindow 示例程序一
經過多番測試實踐,實現了popupwindow 彈出在指定控件的下方。代碼上有注釋,有需要注意的地方。popupwindow 有自已的布局,裡面控件的監聽實現都有。接下來