android键值对,安卓按键值

android中jsonobject和jsonobject的区别

1.JSONObject是Android原生的json类,通过import org.json.JSONObject来导入。

创新互联公司坚持“要么做到,要么别承诺”的工作理念,服务领域包括:网站建设、做网站、企业官网、英文网站、手机端网站、网站推广等服务,满足客户于互联网时代的汕城网站设计、移动媒体设计的需求,帮助企业找到有效的互联网解决方案。努力成为您成熟可靠的网络建设合作伙伴!

JsonObject需要添加gson jar包,通过com.google.gson.JsonObject来导入。

2.查看源码,可以看到

JSONObject通过HashMap来保存键值对。

JsonObject使用LinkedTreeMap来保存键值对。

3.JSONObject:添加value为null的键值对,Map保存的时候会删掉这一键值对;

JsonObject:添加value为null的键值对,Map会保留value值是null的键值对。

Android基础知识

一、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.内边距: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");    //通过键提取数据

五、初级控件: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.将监听器的对象绑定到按钮对象上

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按钮的时候,调用onCreateOptionMenu()方法

public boolean onCreateOptionMenu(Menu menu){

menu.add(0,1,1,R.string.id);

}

2.当客户点击MENU内部的具体某一个选项时,调用onOptionItemSelected()方法

public boolean onOptionItemSelected(MenuItem item){

if(item.getItemId() == 1){

finish();

}

return super.onOptionItemSelected(item);

}

七、Activity的生命周期

1.第一次创建时调用

protected void onCreat(Bundle saveInstanceState);

2.显示出来时调用

protected void onStrat();

3.获得用户焦点时调用(可操作)

protected void onResume();

4.点击弹出第二个Activity时调用

protected void onPause();

5.当第一个Activity不可见时调用

protected void onStop();

6.当返回第一个Activity时调用,代替OnCreate,因为没被销毁

protected void onRestart();

7.当返回第一个Activity时调用(先执行onStop,在执行,因为第二个Activity被销毁,不能返回获取,只能通过onCreat,onStart,onResume再创建)

protected void onDestory();

八、Task

1.Task是存放Activity的Stack栈。当点击启动第二个Activiry时,第一个Activtiy会被压入Stack栈当中,第二个Activity会位于栈的顶部;当返回第一个Activtiy时,第二个Activity会被弹出Stack,第一个Activity会位于栈的顶部,以此类推。

注释:当调用finish()时,当前的Activity会被Destory掉,栈中的Activity会消失。

2.当Activity都从Stack退出后,则就不存在Task。

九、高级控件

①进度条ProgressBar

水平进度条style="?android:attr/progressBarStyleHorizontal"

圆圈进度条style="?android:attr/progressBarStyle"

用户可视的visibility="gone"

②列表ListView

十、其他控件

A.下拉菜单Spinner

1.创建一个ArrayAdapter:

ArrayAdapterCharSequence adapter = ArrayAdapter.createFromResource(

this, //指上下文对象

R.array.plant_array, //引用了在文件中定义的String数组

android.R.layout.simple_spinner_item);//用来指定Spinner的样式,可替换自定义

adapter.setDropDownViewResource(

android.R.layout.simple_spinner_dropdown_item);//设置Spinner当中每个条目的样式

2.得到Spinner对象,并设置数据:

spinner=(spinner)findViewById(R.id.spinnerId);

spinner.setAdapter(adapter);

spinner.setPrompt("测试");//标题

3.创建监听器

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.绑定监听器

spinner.setOnItemSelectedListener(new SpinnerOnSelectListener());

注:第二种动态设计

1.创建ArrayList对象

ListString list = new ArrayListString();

list.add("test1");

2. 调用方法

ArrayAdapter adapter = new ArrayAdapter(

this, //指上下文对象

R.layout.item, //引用了指定了下拉菜单的自定义布局文件

R.id.textViewId,//id

list);//数据

3.得到Spinner对象,并设置对象

spinner.setAdapter(adapter);

spinner.setPrompt("测试");//标题

3.创建监听器

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.绑定监听器

spinner.setOnItemSelectedListener(new SpinnerOnSelectListener());

B.DatePicker和DatePickerDialog

1.声明一个监听器,使用匿名内部类

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.使用时调用showDialog()方法

showDialog(DATE_PICKER_ID);

C.AutoCompleteTextView

B.Widget

C.Animatin

十一、实现ContentProvider过程

1.定义一个CONTENT_URI常量

2.定义一个类,继承ContentProvider

3.实现query、insert、update、delete、getType和onCreate方法

4.在AndroidManifest.xml当中进行声明

android xml资源数组的问题 xml文件内容如下,我要怎么获取item键值对中name这个

假设准备好的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

假设要获得 "shanghai"对应的值,可以参考以下函数:

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;

}

在android中简单描述数据存储的具体位置在哪里

数据存储在开发中是使用最频繁的,Android平台主要有5种实现数据存储的方式。

第1种: 使用SharedPreferences存储数据

SharedPreferences是Android平台上一个轻量级的存储类,主要是保存一些常用的配置比如窗口状态,一般在Activity中 重载窗口状态onSaveInstanceState保存一般使用SharedPreferences完成,它提供了Android平台常规的Long长 整形、Int整形、String字符串型的保存。

它的本质是基于XML文件存储key-value键值对数据,通常用来存储一些简单的配置信息。

其存储位置在/data/data/包名/shared_prefs目录下。

SharedPreferences对象本身只能获取数据而不支持存储和修改,存储修改是通过Editor对象实现。

实现SharedPreferences存储的步骤如下:

一、根据Context获取SharedPreferences对象

二、利用edit()方法获取Editor对象。

三、通过Editor对象存储key-value键值对数据。

四、通过commit()方法提交数据。

SharedPreferences对象与SQLite数据库相比,免去了创建数据库,创建表,写SQL语句等诸多操作,相对而言更加方便,简洁。但是SharedPreferences也有其自身缺陷,比如其职能存储boolean,int,float,long和String五种简单的数据类型,比如其无法进行条件查询等。所以不论SharedPreferences的数据存储操作是如何简单,它也只能是存储方式的一种补充,而无法完全替代如SQLite数据库这样的其他数据存储方式。

Android开发中ArrayMap与HashMap有哪些不同

1、存储方式不同

HashMap内部有一个HashMapEntryK, V[]对象,每一个键值对都存储在这个对象里,当使用put方法添加键值对时,就会new一个HashMapEntry对象,具体实现如下:

[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;

}

//创建对象存储键值对

void addNewEntry(K key, V value, int hash, int index) {

table[index] = new HashMapEntryK, V(key, value, hash, table[index]);

}

ArrayMap的存储中没有Entry这个东西,他是由两个数组来维护的

[java] view plaincopy

int[] mHashes;

Object[] mArray;

mHashes数组中保存的是每一项的HashCode值,mArray中就是键值对,每两个元素代表一个键值对,前面保存key,后面的保存value,我们看看下面代码的结果:

[java] view plaincopy

arraymap = new HashMapString, String();

a.put("a", "a_value");

a.put("b", "b_value");

执行上面代码后,arraymap中的存储是这样的

是不是能清楚地看到ArrayMap的存储了,这种存储在put代码中如下:

[java] view plaincopy

mHashes[index] = hash;

mArray[index1] = key;

mArray[(index1)+1] = value;

2、添加数据时扩容时的处理不一样

先来看看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操作,重新创建对象,开销很大。

那么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;

//分配数组

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);

}

//释放无用空间,收缩数组

freeArrays(ohashes, oarray, mSize);

}

ArrayMap用的是copy数据,所以效率相对要高。

3、ArrayMap提供了数组收缩的功能,在clear或remove后,会重新收缩数组,是否空间

4、ArrayMap采用二分法查找;

以上就是android开发中,HashMap与ArrayMap的区别,大家在涉及到内存方面的实现,可根据实际情况选择这两种不同的方式。

Android里不是键值对格式的JSON怎么解析

举个实例:

[

["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数据不是键值对的格式

解决方法 : 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://azwzsj.com/article/hooidp.html