1.JSONObject是Android原生的json類,通過import org.json.JSONObject來導入。
創(chuàng)新互聯(lián)公司堅持“要么做到,要么別承諾”的工作理念,服務領(lǐng)域包括:網(wǎng)站建設(shè)、做網(wǎng)站、企業(yè)官網(wǎng)、英文網(wǎng)站、手機端網(wǎng)站、網(wǎng)站推廣等服務,滿足客戶于互聯(lián)網(wǎng)時代的汕城網(wǎng)站設(shè)計、移動媒體設(shè)計的需求,幫助企業(yè)找到有效的互聯(lián)網(wǎng)解決方案。努力成為您成熟可靠的網(wǎng)絡(luò)建設(shè)合作伙伴!
JsonObject需要添加gson jar包,通過com.google.gson.JsonObject來導入。
2.查看源碼,可以看到
JSONObject通過HashMap來保存鍵值對。
JsonObject使用LinkedTreeMap來保存鍵值對。
3.JSONObject:添加value為null的鍵值對,Map保存的時候會刪掉這一鍵值對;
JsonObject:添加value為null的鍵值對,Map會保留value值是null的鍵值對。
一、activity
1.一個activity就是一個類,繼承activity;
2.需要復寫onCreate()方法;
3.每一個activity都需要在AndroidMainfest.xml清單上進行配置;
4.為activity添加必要的控件。
二、布局
線性布局:LinearLayout
1.填滿父空間:fill_parent、match_parent
2.文本多大空間就有多大:warp_content
3.文字對齊方式:gravity
4.占屏幕的比例:layout_weight="1" ?水平方向,則width=0,垂直方向,則height=0
5.一行顯示,空間不夠會省略:singleLine="ture"? false會換行
6.背景:background="#ffffff"
7.水平布局:orientation="horizontal"
垂直布局:orientation="vertivcal"
表格布局:TableLayout
1.內(nèi)邊距:padding
2.外邊距:marginLeft\Start、Right\End、Top、Bottom
三、RelativeLayout相對布局
layout_above 將該控件的底部置于給定ID控件之上
layout_below 將該控件的頂部置于給定ID控件之下
layout_toLeftOf 將該控件的右邊緣和給定ID控件的左邊緣對齊
layout_toRightOf 將該控件的左邊緣和給定ID控件的右邊緣對齊
layout_alignBaseline 該控件的baseline和給定ID的控件的Baseline對齊
layout_alignBottom 該控件的底部邊緣和給定ID的控件的底部邊緣對齊
layout_alignLeft 該控件的左邊緣和給定ID的控件的左邊緣對齊
layout_alignRight 該控件的右邊緣和給定ID的控件的右邊緣對齊
layout_alignTop 該控件的頂部邊緣和給定ID的控件的頂部邊緣對齊
layout_alignparentBottom 如果該值為true,則該控件的底部和父控件的底部對齊layout_alignParentLeft 如果該值為true,則該控件的左邊和父控件的左邊對齊
layout_alignParentRight 如果該值為true,則該控件的右邊和父控件的右邊對齊
layout_alignParentTop 如果該值為true,則該控件的上邊和父控件的上邊對齊
layout_centerHorizontal 如果該值為true,則該控件將被置于水平方向的中央
layout_centerInParent 如果該值為true,則該控件將被置于父控件水平和垂直方向的中央
layout_centerVertival 如果該值為true,則該控件將被置于垂直方向的中央
四、一個Intent對象包含一組信息
1.Component name
2.Action
3.Data
4.Category
5.Extras
6.Flags
Intent intent = new Intent(this, SecondActivity.class);
startActivity(intent);? //startActivity方法
intent.putExtra("Key", "Value");? //鍵值對
intent = getIntent();
String value = intent.getStringExtra("Key");? ? //通過鍵提取數(shù)據(jù)
五、初級控件:EditText、TextView、Button
1.獲取EditText的值
String value = EditText.getText().toString();
2.將值放到Intent對象中
Intent intent = new Intent();
intent.putExtra("one",value )
intent.setCalss(Activity.this, OtherActivity.class);
3.使用這個Intent對象來啟動Otheractivity
Activity.this.startActivity(intent);
4.將監(jiān)聽器的對象綁定到按鈕對象上
button.setOnclickListener(new Listener());
5.得到Intent對象當中的值
Intent intent = getIntent();
String value1 = intent.getStringExtra("one");
int value2 = Integer.parseInt(value);
六、其他初級控件使用
①ImageView
②RadioGroup和RadioButton
setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener())
③Checkbox
setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener())
④Menu
1.當客戶點擊MENU按鈕的時候,調(diào)用onCreateOptionMenu()方法
public boolean onCreateOptionMenu(Menu menu){
menu.add(0,1,1,R.string.id);
}
2.當客戶點擊MENU內(nèi)部的具體某一個選項時,調(diào)用onOptionItemSelected()方法
public boolean onOptionItemSelected(MenuItem item){
if(item.getItemId() == 1){
finish();
}
return super.onOptionItemSelected(item);
}
七、Activity的生命周期
1.第一次創(chuàng)建時調(diào)用
protected void onCreat(Bundle saveInstanceState);
2.顯示出來時調(diào)用
protected void onStrat();
3.獲得用戶焦點時調(diào)用(可操作)
protected void onResume();
4.點擊彈出第二個Activity時調(diào)用
protected void onPause();
5.當?shù)谝粋€Activity不可見時調(diào)用
protected void onStop();
6.當返回第一個Activity時調(diào)用,代替OnCreate,因為沒被銷毀
protected void onRestart();
7.當返回第一個Activity時調(diào)用(先執(zhí)行onStop,在執(zhí)行,因為第二個Activity被銷毀,不能返回獲取,只能通過onCreat,onStart,onResume再創(chuàng)建)
protected void onDestory();
八、Task
1.Task是存放Activity的Stack棧。當點擊啟動第二個Activiry時,第一個Activtiy會被壓入Stack棧當中,第二個Activity會位于棧的頂部;當返回第一個Activtiy時,第二個Activity會被彈出Stack,第一個Activity會位于棧的頂部,以此類推。
注釋:當調(diào)用finish()時,當前的Activity會被Destory掉,棧中的Activity會消失。
2.當Activity都從Stack退出后,則就不存在Task。
九、高級控件
①進度條ProgressBar
水平進度條style="?android:attr/progressBarStyleHorizontal"
圓圈進度條style="?android:attr/progressBarStyle"
用戶可視的visibility="gone"
②列表ListView
十、其他控件
A.下拉菜單Spinner
1.創(chuàng)建一個ArrayAdapter:
ArrayAdapterCharSequence adapter = ArrayAdapter.createFromResource(
this, //指上下文對象
R.array.plant_array, //引用了在文件中定義的String數(shù)組
android.R.layout.simple_spinner_item);//用來指定Spinner的樣式,可替換自定義
adapter.setDropDownViewResource(
android.R.layout.simple_spinner_dropdown_item);//設(shè)置Spinner當中每個條目的樣式
2.得到Spinner對象,并設(shè)置數(shù)據(jù):
spinner=(spinner)findViewById(R.id.spinnerId);
spinner.setAdapter(adapter);
spinner.setPrompt("測試");//標題
3.創(chuàng)建監(jiān)聽器
class SpinnerOnSelectListener implements OnItemSelectedListener{
@override
public void onItemSelected(
AdapterView? adapterView,//整個列表對象
View view,//被選中的具體條目對象
int position,//位置
long id){ //id
String selected = adapterView.getItemAtPosition(position).toString();
}
@override
public void onNothingSelected(AdapterView? adapterView){
S.o.p("nothingSelected");
}
}
4.綁定監(jiān)聽器
spinner.setOnItemSelectedListener(new SpinnerOnSelectListener());
注:第二種動態(tài)設(shè)計
1.創(chuàng)建ArrayList對象
ListString list = new ArrayListString();
list.add("test1");
2. 調(diào)用方法
ArrayAdapter adapter = new ArrayAdapter(
this, //指上下文對象
R.layout.item, //引用了指定了下拉菜單的自定義布局文件
R.id.textViewId,//id
list);//數(shù)據(jù)
3.得到Spinner對象,并設(shè)置對象
spinner.setAdapter(adapter);
spinner.setPrompt("測試");//標題
3.創(chuàng)建監(jiān)聽器
class SpinnerOnSelectListener implements OnItemSelectedListener{
@override
public void onItemSelected(
AdapterView? adapterView,//整個列表對象
View view,//被選中的具體條目對象
int position,//位置
long id){ //id
String selected = adapterView.getItemAtPosition(position).toString();
}
@override
public void onNothingSelected(AdapterView? adapterView){
S.o.p("nothingSelected");
}
}
4.綁定監(jiān)聽器
spinner.setOnItemSelectedListener(new SpinnerOnSelectListener());
B.DatePicker和DatePickerDialog
1.聲明一個監(jiān)聽器,使用匿名內(nèi)部類
DatePickerDialog.OnDateSetListener onDateSetListener
= new DatePivkerDialog.OnDateSetListener(){
public void onDateSet(
DatePicker view,
int year,
int monthOfYear,
int dayOfMonth){
S.o.p(year+"-"+motnOfYear+"-"+dayOfMonth)
}
}
2.復寫onCreateDialog(int id)方法:
@override
protected Dialog onCreateDialog(int id){
switch(id){
case DATE_PICKER_ID:
return new DatePickerDialog(this,onDateSetListener,2019,11,25);
}
return null;
}
3.使用時調(diào)用showDialog()方法
showDialog(DATE_PICKER_ID);
C.AutoCompleteTextView
B.Widget
C.Animatin
十一、實現(xiàn)ContentProvider過程
1.定義一個CONTENT_URI常量
2.定義一個類,繼承ContentProvider
3.實現(xiàn)query、insert、update、delete、getType和onCreate方法
4.在AndroidManifest.xml當中進行聲明
假設(shè)準備好的xml是
string-array name="names"
item shanghai/item
item beijing/item
item hongkong/item
/string-array
string-array name="values"
item 021/item
item 010/item
item 00852/item
/string-array
假設(shè)要獲得 "shanghai"對應的值,可以參考以下函數(shù):
public String getAreaCode(String cityName) {
String[] names = getResources().getStringArray(R.array.names);
String[] values = getResources().getStringArray(R.array.values);
for (int i = 0; i names.length; i++) {
if (names[i].equals(cityName)) {
return values[i];
}
}
return null;
}
數(shù)據(jù)存儲在開發(fā)中是使用最頻繁的,Android平臺主要有5種實現(xiàn)數(shù)據(jù)存儲的方式。
第1種: 使用SharedPreferences存儲數(shù)據(jù)
SharedPreferences是Android平臺上一個輕量級的存儲類,主要是保存一些常用的配置比如窗口狀態(tài),一般在Activity中 重載窗口狀態(tài)onSaveInstanceState保存一般使用SharedPreferences完成,它提供了Android平臺常規(guī)的Long長 整形、Int整形、String字符串型的保存。
它的本質(zhì)是基于XML文件存儲key-value鍵值對數(shù)據(jù),通常用來存儲一些簡單的配置信息。
其存儲位置在/data/data/包名/shared_prefs目錄下。
SharedPreferences對象本身只能獲取數(shù)據(jù)而不支持存儲和修改,存儲修改是通過Editor對象實現(xiàn)。
實現(xiàn)SharedPreferences存儲的步驟如下:
一、根據(jù)Context獲取SharedPreferences對象
二、利用edit()方法獲取Editor對象。
三、通過Editor對象存儲key-value鍵值對數(shù)據(jù)。
四、通過commit()方法提交數(shù)據(jù)。
SharedPreferences對象與SQLite數(shù)據(jù)庫相比,免去了創(chuàng)建數(shù)據(jù)庫,創(chuàng)建表,寫SQL語句等諸多操作,相對而言更加方便,簡潔。但是SharedPreferences也有其自身缺陷,比如其職能存儲boolean,int,float,long和String五種簡單的數(shù)據(jù)類型,比如其無法進行條件查詢等。所以不論SharedPreferences的數(shù)據(jù)存儲操作是如何簡單,它也只能是存儲方式的一種補充,而無法完全替代如SQLite數(shù)據(jù)庫這樣的其他數(shù)據(jù)存儲方式。
1、存儲方式不同
HashMap內(nèi)部有一個HashMapEntryK, V[]對象,每一個鍵值對都存儲在這個對象里,當使用put方法添加鍵值對時,就會new一個HashMapEntry對象,具體實現(xiàn)如下:
[java] view plaincopy
@Override public V put(K key, V value) {
if (key == null) {
return putValueForNullKey(value);
}
int hash = secondaryHash(key);
HashMapEntryK, V[] tab = table;
int index = hash (tab.length - 1);
//先查找有沒有對應的key值,如果有,就改寫value,并返回改寫前的value值:oldValue
for (HashMapEntryK, V e = tab[index]; e != null; e = e.next) {
if (e.hash == hash key.equals(e.key)) {
preModify(e);
V oldValue = e.value;
e.value = value;
return oldValue;
}
}
// No entry for (non-null) key is present; create one
modCount++;
if (size++ threshold) {
//擴容,雙倍
tab = doubleCapacity();
index = hash (tab.length - 1);
}
addNewEntry(key, value, hash, index);
return null;
}
//創(chuàng)建對象存儲鍵值對
void addNewEntry(K key, V value, int hash, int index) {
table[index] = new HashMapEntryK, V(key, value, hash, table[index]);
}
ArrayMap的存儲中沒有Entry這個東西,他是由兩個數(shù)組來維護的
[java] view plaincopy
int[] mHashes;
Object[] mArray;
mHashes數(shù)組中保存的是每一項的HashCode值,mArray中就是鍵值對,每兩個元素代表一個鍵值對,前面保存key,后面的保存value,我們看看下面代碼的結(jié)果:
[java] view plaincopy
arraymap = new HashMapString, String();
a.put("a", "a_value");
a.put("b", "b_value");
執(zhí)行上面代碼后,arraymap中的存儲是這樣的
是不是能清楚地看到ArrayMap的存儲了,這種存儲在put代碼中如下:
[java] view plaincopy
mHashes[index] = hash;
mArray[index1] = key;
mArray[(index1)+1] = value;
2、添加數(shù)據(jù)時擴容時的處理不一樣
先來看看HashMap
[java] view plaincopy
if (size++ threshold) {
tab = doubleCapacity();
index = hash (tab.length - 1);
}
doubleCapacity進行雙倍擴容,它的代碼中有這么一句話
[java] view plaincopy
HashMapEntryK, V[] newTable = makeTable(newCapacity);
最終,這個newTable將作為擴容后的新對象返回,那么makeTable做了什么呢,如下:
[java] view plaincopy
private HashMapEntryK, V[] makeTable(int newCapacity) {
@SuppressWarnings("unchecked") HashMapEntryK, V[] newTable
= (HashMapEntryK, V[]) new HashMapEntry[newCapacity];
table = newTable;
threshold = (newCapacity 1) + (newCapacity 2); // 3/4 capacity
return newTable;
}
我們清楚地看到,這里進行了new操作,重新創(chuàng)建對象,開銷很大。
那么ArrayMap呢,看看:
[java] view plaincopy
//如果容量不夠
ize = mHashes.length) {
final int n = mSize = (BASE_SIZE*2) ? (mSize+(mSize1))
: (mSize = BASE_SIZE ? (BASE_SIZE*2) : BASE_SIZE);
if (DEBUG) Log.d(TAG, "put: grow from " + mHashes.length + " to " + n);
final int[] ohashes = mHashes;
final Object[] oarray = mArray;
//分配數(shù)組
allocArrays(n);
if (mHashes.length 0) {
if (DEBUG) Log.d(TAG, "put: copy 0-" + mSize + " to 0");
//特別注意這,是copy,而不是new,效率提升
System.arraycopy(ohashes, 0, mHashes, 0, ohashes.length);
System.arraycopy(oarray, 0, mArray, 0, oarray.length);
}
//釋放無用空間,收縮數(shù)組
freeArrays(ohashes, oarray, mSize);
}
ArrayMap用的是copy數(shù)據(jù),所以效率相對要高。
3、ArrayMap提供了數(shù)組收縮的功能,在clear或remove后,會重新收縮數(shù)組,是否空間
4、ArrayMap采用二分法查找;
以上就是android開發(fā)中,HashMap與ArrayMap的區(qū)別,大家在涉及到內(nèi)存方面的實現(xiàn),可根據(jù)實際情況選擇這兩種不同的方式。
舉個實例:
[
["5","\u9760\u7a97",false,true,
[
["2","1h",false,false],
["3","2h",true,true],
["4","3h",false,false],
["5","4h",false,false],
["6","5h",false,false]]],
["4","\u65e7\u91d1\u5c71",false,false,
[
["1","\u65e7\u91d1\u5c71",false,false]
]
]
]
這樣的JSON數(shù)據(jù)不是鍵值對的格式
解決方法 : public static void downAreaTable(JsonArray jsonData) {PadUtil.areaTables = null;JsonArray array2;JsonArray array3;JsonArray array4;int len = jsonData.getAsJsonArray().size();if (len 0) {areaTables = new HashMapTable, Area();for (int i = 0; i len; i++) {array2 = jsonData.getAsJsonArray().get(i).getAsJsonArray();Area area = new Area(Integer.parseInt(array2.get(0).getAsString()), array2.get(1).getAsString(), array2.get(1).getAsString(), array2.get(2).getAsBoolean()); array3 = array2.get(4).getAsJsonArray(); for (int j = 0; j array3.size(); j++) {array4 = array3.get(j).getAsJsonArray();Table table = new Table(Integer.parseInt(array4.get(0).getAsString()), array4.get(1).getAsString(),array4.get(1).getAsString(), area, array4.get(2).getAsBoolean());areaTables.put(table, area);}}}}
分享題目:android鍵值對,安卓按鍵值
路徑分享:http://sd-ha.com/article18/hooidp.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站設(shè)計、網(wǎng)站改版、微信公眾號、企業(yè)網(wǎng)站制作、小程序開發(fā)、靜態(tài)網(wǎng)站
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)