尝试在我的应用中实现启动画面后,我遇到了强制关闭问题。
问题发生在第76行lv.setAdapter(adapter);
但是我不确定为什么。
非常感谢任何输入。
09-19 15:20:53.687: E/AndroidRuntime(25177): FATAL EXCEPTION: main
09-19 15:20:53.687: E/AndroidRuntime(25177): java.lang.NullPointerException
09-19 15:20:53.687: E/AndroidRuntime(25177): at com.example.project1.MainActivity$MyTask.onPostExecute(MainActivity.java:76)
09-19 15:20:53.687: E/AndroidRuntime(25177): at com.example.project1.MainActivity$MyTask.onPostExecute(MainActivity.java:1)
09-19 15:20:53.687: E/AndroidRuntime(25177): at android.os.AsyncTask.finish(AsyncTask.java:631)
09-19 15:20:53.687: E/AndroidRuntime(25177): at android.os.AsyncTask.access$600(AsyncTask.java:177)
09-19 15:20:53.687: E/AndroidRuntime(25177): at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:644)
09-19 15:20:53.687: E/AndroidRuntime(25177): at android.os.Handler.dispatchMessage(Handler.java:99)
09-19 15:20:53.687: E/AndroidRuntime(25177): at android.os.Looper.loop(Looper.java:137)
09-19 15:20:53.687: E/AndroidRuntime(25177): at android.app.ActivityThread.main(ActivityThread.java:4931)
09-19 15:20:53.687: E/AndroidRuntime(25177): at java.lang.reflect.Method.invokeNative(Native Method)
09-19 15:20:53.687: E/AndroidRuntime(25177): at java.lang.reflect.Method.invoke(Method.java:511)
09-19 15:20:53.687: E/AndroidRuntime(25177): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:791)
09-19 15:20:53.687: E/AndroidRuntime(25177): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:558)
09-19 15:20:53.687: E/AndroidRuntime(25177): at dalvik.system.NativeStart.main(Native Method)
来源:
public class MainActivity extends Activity {
Context context;
ArrayList<String> aa = new ArrayList<String>();
ListView lv;
final String URL = "http://news.google.com";
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//setContentView(R.layout.activity_main);
setContentView(R.layout.splash);
lv= (ListView) findViewById(R.id.listView1);
new MyTask().execute(URL);
}
private class MyTask extends AsyncTask<String, Void, String> {
ProgressDialog prog;
String title = "";
@Override
protected void onPreExecute() {
prog = new ProgressDialog(MainActivity.this);
prog.setMessage("Loading....");
prog.show();
}
@Override
protected String doInBackground(String... params) {
try {
Document doc = Jsoup.connect(params[0]).get();
Element tableHeader = doc.select("tr").first();
for (Element element : tableHeader.children()) {
aa.add(element.text().toString());
}
title = doc.title();
} catch (IOException e) {
e.printStackTrace();
}
return title;
}
@Override
protected void onPostExecute(String result) {
super.onPostExecute(result);
prog.dismiss();
ArrayAdapter<String> adapter = new ArrayAdapter<String>(MainActivity.this,android.R.layout.simple_list_item_1,aa);
lv.setAdapter(adapter);
}
}
}
答案 0 :(得分:1)
R.id.listView1
中是否有名为splash.xml
的视图?您似乎已将setContentView()
调用更改为初始屏幕,但您的列表视图位于更“主”页面上。
答案 1 :(得分:1)
由于您使用lv
更改了null
,因此layout
setContentView()
不是为了击败死马。也许我可以更好地解释为什么这是因为我不确定你是否完全理解Views
中Activity
的工作方式。
当您致电setContentView()
时,它会膨胀您在此功能中设置的xml layout
文件。初始化View
文件中不的任何layout
将返回null
,当您尝试在其上设置方法时,会NPE
例如setAdapter()
。
您似乎仍然认为您仍然可以初始化另一个ListView
文件中的layout
...您不能。您只能使用Views
setContentView()
或layout
膨胀View
文件并将其添加到当前夸大的`布局。
解决此问题的一种方法是再次在setContentView()
中致电onPostExecute()
,然后初始化您的ListView
并设置Adapter
。我通常不建议在一个setContentView()
中多次拨打Activity
,但在您的情况下,它可能是您目前所拥有的最简单的。
所以它可能看起来像这样
@Override
protected void onPostExecute(String result) {
super.onPostExecute(result);
prog.dismiss();
ArrayAdapter<String> adapter = new ArrayAdapter<String>(MainActivity.this,android.R.layout.simple_list_item_1,aa);
setContentView(R.layout.activity_main);
lv = (ListView) findViewById(R.id.listView1);
lv.setAdapter(adapter);
答案 2 :(得分:0)
lv
此处可能为null。您是否在调试器中验证了在将其设置为(ListView) findViewById(R.id.listView1);
时正确设置?
答案 3 :(得分:0)
空指针异常表明lv可能存在问题。 您已更改xml的名称。验证splash.xml中是否存在 R.id.listview1