此文仅用于记录在学习android开发中所遇到的种种错误,细节决定成败。
1、变量定义位置及作用域错误
如果在onCreate方法中定义如下:
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
TextView tv =(TextView) findViewById(R.id.textView);
}
则此tv变量只能在onCreate方法内部使用,其他外部方法则无法引用此变量。
如果在onCreate方法外部定义如下:
public class MainActivity extends Activity {
TextView tv = (TextView) findViewById(R.id.textView);
@Override
protected void onCreate(Bundle savedInstanceState) {
}
则运行时报错,因为在打开该Activity后尚未执行onCreate方法前,无法通过findViewById方法绑定资源文件
解决方法如下:
public class MainActivity extends Activity {
private TextView tv; //在此处声明变量,但不能与布局资源中的控件绑定
private SeekBar seekBar;
private Button button;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);//只有当加载了布局资源后,才可以对变量进行绑定
tv = (TextView) findViewById(R.id.textView);//此处进行绑定
seekBar = (SeekBar) findViewById(R.id.seekBar);
button = (Button) findViewById(R.id.button);
button.setOnClickListener(new OnClickListener() {
});
seekBar.setOnSeekBarChangeListener(new OnSeekBarChangeListener() { //此时可以在该Activity中任意方法中调用这些变量
});
}
2、上下文context的用法
之前不知道上下文context该怎么用,有时候用this,有时候要写全类名,也没深究过。
今天写项目练习时候,多少明白了一些context的用法,记录之。
btn_login.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
String userName = et_userName.getText().toString().trim(); //获取输入用户名
String userPass = et_userPass.getText().toString().trim(); //获取输入密码
if ((userName != "") && (userPass != "")) {
execLogin(userName, userPass);
} else {
Toast.makeText(<span style="color:#ff0000;">MainActivity.this</span>, "账号密码不能为空", 2000).show();
}
}
private void execLogin(String userName, String userPass) {
// TODO Auto-generated method stub
}
});
如果在此处的Toast中使用this而不是MainActivity.this,则会报错。因为此处this指代的是onClickListener,但Toast只能显示在Activity中。
3、JSONArray转List<Map<String,String>>时的循环错误
下面代码是将服务器返回的JSONArray数据转换为List<Map<String,String>>格式数据进行ListView的绑定显示。
服务器返回数据格式示例:
{
{ a : aaa , b : bbb }
{ c
: ccc
, d
: ddd
}
}
即,一个JSONArray中有若干JSONObject
private List<HashMap<String, String>> jsonArrayToMapList(String result) {
List<HashMap<String, String>> mapList = new ArrayList<>();
<span style="color:#ff0000;">// HashMap<String, String> map = new HashMap<>();</span>
try {
JSONArray ja = new JSONArray(result);
System.out.println("ja.length()=" + ja.length());
for (int i = 0; i < ja.length(); i++) {
<span style="color:#ff0000;"> HashMap<String, String> map = new HashMap<>();</span>
JSONObject jo = ja.getJSONObject(i);
Iterator<String> mIterator = jo.keys();
while (mIterator.hasNext()) {
String key = String.valueOf(mIterator.next());
String value = (String) jo.get(key);
}
map.put(key, value);
}
mapList.add(map);
}
} catch (JSONException e) {
e.printStackTrace();
}
System.out.println(mapList.toString());
return mapList;
}
错误现象:最终存到List中的map数据全都一样
错误分析:开始时将Map<String,String>实例化在for循环之外了,所以无论循环多少次,map只能被赋值一次,所以最终存到list中的map值都一样。
正确方法:将List实例化在所有循环体之外,因为它无需多次实例化;但Map必须实例化在循环体之内,即每次循环都要实例化一个新的map用于存储数据。