当前位置:编程学习 > wap >>

跪求求高手们帮忙看看问题在哪?

[color=#008000]//代码如下,ddms上显示NullPointerException ,问题出在哪?跪求答案!


/**

*/
package zhou.android.ListActivity;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
import android.app.ListActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.ListView;
import android.widget.SimpleAdapter;
/**
* @author Administrator
*
*/
public class ListActivityTest extends ListActivity {
    private ListView myListView = null; 
    private static final String TAG = "LOG_V";
/* (non-Javadoc)
  * @see android.app.Activity#onCreate(android.os.Bundle)
  */
@Override
protected void onCreate(Bundle savedInstanceState) {
  // TODO Auto-generated method stub
  super.onCreate(savedInstanceState);

  myListView = (ListView)findViewById(R.id.myListView);

  ArrayList<Map<String,String>> list = new ArrayList<Map<String,String>>();
  Map<String,String> map1 = new HashMap<String,String>();
  Map<String,String> map2 = new HashMap<String,String>();
  Map<String,String> map3 = new HashMap<String,String>();
  map1.put("user_name", "zhangsan");
  map1.put("user_ip", "192.168.0.1");
  map2.put("user_name", "lisi");
  map2.put("user_ip", "192.168.0.2");
  map3.put("user_name", "wangwu");
  map3.put("user_ip", "192.168.0.3");
  list.add(map1);
  list.add(map2);
  list.add(map3);

  SimpleAdapter listAdapter = new SimpleAdapter(this,list,R.layout.user,new String[]{"user_name","user_ip"},
    new int[] {R.id.user_name,R.id.user_ip});

  myListView.setAdapter(listAdapter);
  setContentView(myListView);
}

@Override
protected void onListItemClick(ListView l, View v, int position, long id) {
  // TODO Auto-generated method stub
  super.onListItemClick(l, v, position, id);
  Log.v(TAG,"id----------" + id);
  Log.v(TAG,"position-----------" + position);
}
}
 [/color] --------------------编程问答--------------------  把setContentView(myListView);放在
 myListView = (ListView)findViewById(R.id.myListView);前面试试。

--------------------编程问答--------------------
引用 1 楼 ameyume 的回复:
把setContentView(myListView);放在
 myListView = (ListView)findViewById(R.id.myListView);前面试试。

不是这个原因,是setContentView(myListView);的用法错误,setContentView的参数是一个layout,即layout的xml文件,楼主的参数是一个listview。 --------------------编程问答-------------------- 而且,也应该先把setContentView()放在findViewById前面,后面再重新设置自定义的setContentView(). --------------------编程问答--------------------
引用 3 楼 ameyume 的回复:
而且,也应该先把setContentView()放在findViewById前面,后面再重新设置自定义的setContentView().



不是啊,setContentView()是可以传入一个View类型的控件的:

          void  setContentView(int layoutResID) 
 Set the activity content from a layout resource. 
          void  setContentView(View view, ViewGroup.LayoutParams params) 
 Set the activity content to an explicit view. 
          void  setContentView(View view) 
 Set the activity content to an explicit view. 
--------------------编程问答--------------------   myListView = (ListView)findViewById(R.id.myListView);
这句调用在setContentView(myListView)之前了。

activity还没有inflate出来任何一个view,那么myListView必然是null值。我想myListView.setAdapter(listAdapter);这句已经开始报错了。

建议一,改为:  setContentView(R.layout.listview);
        myListView = (ListView)findViewById(R.id.myListView);

建议二, 改为: 
LayoutInflater inflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
myListView = (ListView)inflater.inflate(R.layout.listview, null);
setContentView(myListView);

(上面都是未经验证的代码,示意一下)。 --------------------编程问答--------------------
引用 5 楼 yyy025025025 的回复:
myListView = (ListView)findViewById(R.id.myListView);
这句调用在setContentView(myListView)之前了。

activity还没有inflate出来任何一个view,那么myListView必然是null值。我想myListView.setAdapter(listAdapter);这句已经开始报错了。

建议一,改……

谢谢指导!

是不是说,只有通过setContentView(R.layout.*)之后,findViewById(R.id.*)才起作用?为什么?它们之间的联系时什么?“inflate” ?

或者用另外一种方式,先  myListView = ListView(this); 然后setContentView(myListView),完全不用布局文件,是不是一般两者选一种? --------------------编程问答-------------------- 是不是说,只有通过setContentView(R.layout.*)之后,findViewById(R.id.*)才起作用?为什么?它们之间的联系时什么?“inflate” ?
ANS:setContentView里肯定是去解析xml,然后将这些布局加载到view上。当调用完setContentView之后,就代表程序已经生成了这个布局,那再去findViewById,就可以访问到布局中的控件了。

或者用另外一种方式,先 myListView = ListView(this); 然后setContentView(myListView),完全不用布局文件,是不是一般两者选一种?
ANS:你说的这种方式是用过代码来动态生成layout布局,是可以的,xml方式也好,代码方式也好,最终都要setContentView,不过xml方式比较直观,看你习惯哪种了(感觉android还是比较推崇xml方式的) --------------------编程问答-------------------- --------------------编程问答--------------------
引用 7 楼 dinjay 的回复:
是不是说,只有通过setContentView(R.layout.*)之后,findViewById(R.id.*)才起作用?为什么?它们之间的联系时什么?“inflate” ?
ANS:setContentView里肯定是去解析xml,然后将这些布局加载到view上。当调用完setContentView之后,就代表程序已经生成了这个布局,那再去findViewById,就可以访问到布局中的控件……


嗯嗯,明白了,严重感谢!
补充:移动开发 ,  Android
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,