我已经获得了将XML数据解析为基本列表视图然后进入文本视图的任务,但问题是在编辑有意为练习提供的代码时,一旦我按下“登录”按钮,我的应用程序就会停止关于主要活动。感谢高级读者阅读此内容,我真的很茫然,我一直试图将它调整好几个小时。
我想知道是否有人能找到问题。
package com.example.beaconhomesproject;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.ArrayList;
import android.app.Activity;
import android.content.Intent;
import android.os.AsyncTask;
import android.os.Bundle;
import android.sax.Element;
import android.sax.EndElementListener;
import android.sax.EndTextElementListener;
import android.sax.RootElement;
import android.util.Xml;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.ListView;
public class Bill extends Activity {
private ArrayList<BillListView> bill;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_bill);
// Download
new DownloadBillListTask()
.execute("http://www.fcet.staffs.ac.uk/pfb1/IMWTAssignment/bills.xml");
// Adds a CLick Listener to the list view
ListView listView = (ListView) findViewById(R.id.bill_list);
listView.setOnItemClickListener(new ListView.OnItemClickListener() {
// Opens a new Activity when an item is clicked
@Override
public void onItemClick(AdapterView<?> parent, View view,
int position, long id) {
Intent intent = new Intent(view.getContext(), `enter code here`BillDetails.class);
intent.putExtra("BillListView", bill.get(position));
startActivity(intent);
}
});
}
// get xml
public ArrayList<BillListView> ParseBillsFromXML(String XMLURL) {
final ArrayList<BillListView> values = new ArrayList<BillListView>();
final BillListView LeBill = new BillListView();
// Convert our string into a URL
URL feedUrl;
try {
feedUrl = new URL(XMLURL);
} catch (MalformedURLException e) {
throw new RuntimeException(e);
}
// Get the RootElement of our XML file which is Students
RootElement root = new RootElement("Bills");
Element bill = root.getChild("bill"); // Then list our element we want,
// so a single Student
// Our End Element Listener event fires when we get the end of a
// complete Student tag
bill.setEndElementListener(new EndElementListener() {
@Override
public void end() {
values.add(LeBill.copy());
}
});
// All of the End Text Element Listeners get the body of the child tags
// of a bill
bill.getChild("date").setEndTextElementListener(
new EndTextElementListener() {
@Override
public void end(String body) {
LeBill.setDate(body);
}
});
bill.getChild("type").setEndTextElementListener(
new EndTextElementListener() {
@Override
public void end(String body) {
LeBill.setType(body);
}
});
bill.getChild("price").setEndTextElementListener(
new EndTextElementListener() {
@Override
public void end(String body) {
LeBill.setPrice(body);
}
});
// Now we have set up all our event listeners, we can start to parse the
// document
try {
Xml.parse(feedUrl.openConnection().getInputStream(),
Xml.Encoding.UTF_8, root.getContentHandler());
} catch (Exception e) {
throw new RuntimeException(e);
}
// We can then return all our returns values after parsing
return values;
}
// This is an inner class which runs Asynchronously (In the background)
// It needs to be told the three types it accepts
// String is the type that is passed to doInBackground
// Void is the type that is used if we report any progress (We don't in this
// case so its Void!)
// ArrayList<Student> is the data type that is returned from our background
// task and is passed to final function
class DownloadBillListTask extends
AsyncTask<String, Void, ArrayList<BillListView>> {
// This is the code that runs in the background - We can't update any UI
// in this function!
// String... basically means we are passing in a list of strings but we
// don't specify how many!
@Override
protected ArrayList<BillListView> doInBackground(String... arg0) {
// This calls our Parse function above
return ParseBillsFromXML(arg0[0]);
}
// This executes back on the UI thread so we can actually update the UI
// here
@Override
protected void onPostExecute(ArrayList<BillListView> result) {
// Save our result to our class level students ArrayList
bill = result;
// Set the list view to display the list we just downloaded!
ListView listView = (ListView) findViewById(R.id.bill_list);
ArrayAdapter<BillListView> adapter = new ArrayAdapter<BillListView>(
getBaseContext(), android.R.layout.simple_list_item_1,
result);
listView.setAdapter(adapter);
}
}
public void movemain(View view) {
Intent intent = new Intent(this, MainActivity.class);
startActivity(intent);
}
}
XML:
<ImageView
android:id="@+id/waterlogo"
android:layout_width="100dp"
android:layout_height="80dp"
android:layout_alignParentTop="true"
android:layout_centerHorizontal="true"
android:contentDescription="@string/welcome"
android:scaleType="fitXY"
android:src="@drawable/water" />
<View
android:id="@+id/viewyview"
android:layout_width="fill_parent"
android:layout_height="2dp"
android:background="#e47c0b"
android:layout_below="@id/waterlogo"/>
<ListView
android1:id="@+id/bill_list"
android1:layout_width="match_parent"
android1:layout_height="match_parent"
android1:layout_alignTop="@+id/viewyview" />
<Button
android:id="@+id/backbutton"
android:layout_width="100dip"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_alignParentTop="true"
android:background="@android:color/transparent"
android:gravity="center"
android:onClick="moveback"
android:text="@string/back"
android:textColor="#e47c0b" />
</RelativeLayout>
Log cat:
>04-22 14:39:14.965: E/AndroidRuntime(1053): FATAL EXCEPTION: AsyncTask #3
>04-22 14:39:14.965: E/AndroidRuntime(1053): java.lang.RuntimeException: An error occured while executing doInBackground()
>04-22 14:39:14.965: E/AndroidRuntime(1053): at android.os.AsyncTask$3.done(AsyncTask.java:299)
>04-22 14:39:14.965: E/AndroidRuntime(1053): at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:352)
>04-22 14:39:14.965: E/AndroidRuntime(1053): at java.util.concurrent.FutureTask.setException(FutureTask.java:219)
>04-22 14:39:14.965: E/AndroidRuntime(1053): at java.util.concurrent.FutureTask.run(FutureTask.java:239)
>04-22 14:39:14.965: E/AndroidRuntime(1053): at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:230)
>04-22 14:39:14.965: E/AndroidRuntime(1053): at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1080)
>04-22 14:39:14.965: E/AndroidRuntime(1053): at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:573)
>04-22 14:39:14.965: E/AndroidRuntime(1053): at java.lang.Thread.run(Thread.java:856)
>04-22 14:39:14.965: E/AndroidRuntime(1053): Caused by: java.lang.RuntimeException: android.sax.BadXmlException: Line 1: Root element name does not match. Expected: 'Bills', Got: 'bills'
>04-22 14:39:14.965: E/AndroidRuntime(1053): at com.example.beaconhomesproject.Bill.ParseBillsFromXML(Bill.java:103)
>04-22 14:39:14.965: E/AndroidRuntime(1053): at com.example.beaconhomesproject.Bill$DownloadBillListTask.doInBackground(Bill.java:128)
>04-22 14:39:14.965: E/AndroidRuntime(1053): at com.example.beaconhomesproject.Bill$DownloadBillListTask.doInBackground(Bill.java:1)
>04-22 14:39:14.965: E/AndroidRuntime(1053): at android.os.AsyncTask$2.call(AsyncTask.java:287)
>04-22 14:39:14.965: E/AndroidRuntime(1053): at java.util.concurrent.FutureTask.run(FutureTask.java:234)
>04-22 14:39:14.965: E/AndroidRuntime(1053): ... 4 more
>04-22 14:39:14.965: E/AndroidRuntime(1053): Caused by: android.sax.BadXmlException: Line 1: Root element name does not match. Expected: 'Bills', Got: 'bills'
>04-22 14:39:14.965: E/AndroidRuntime(1053): at android.sax.RootElement$Handler.startRoot(RootElement.java:145)
>04-22 14:39:14.965: E/AndroidRuntime(1053): at android.sax.RootElement$Handler.startElement(RootElement.java:116)
>04-22 14:39:14.965: E/AndroidRuntime(1053): at org.apache.harmony.xml.ExpatParser.startElement(ExpatParser.java:143)
>04-22 14:39:14.965: E/AndroidRuntime(1053): at org.apache.harmony.xml.ExpatParser.appendBytes(Native Method)
>04-22 14:39:14.965: E/AndroidRuntime(1053): at org.apache.harmony.xml.ExpatParser.parseFragment(ExpatParser.java:513)
>04-22 14:39:14.965: E/AndroidRuntime(1053): at org.apache.harmony.xml.ExpatParser.parseDocument(ExpatParser.java:474)
>04-22 14:39:14.965: E/AndroidRuntime(1053): at org.apache.harmony.xml.ExpatReader.parse(ExpatReader.java:321)
>04-22 14:39:14.965: E/AndroidRuntime(1053): at org.apache.harmony.xml.ExpatReader.parse(ExpatReader.java:279)
>04-22 14:39:14.965: E/AndroidRuntime(1053): at android.util.Xml.parse(Xml.java:84)
>04-22 14:39:14.965: E/AndroidRuntime(1053): at com.example.beaconhomesproject.Bill.ParseBillsFromXML(Bill.java:100)
>04-22 14:39:14.965: E/AndroidRuntime(1053): ... 8 more
答案 0 :(得分:1)
这是你的问题:
14:39:14.965: E/AndroidRuntime(1053): Caused by: java.lang.RuntimeException: android.sax.BadXmlException: Line 1: Root element name does not match. Expected: 'Bills', Got: 'bills'
所以:
RootElement root = new RootElement("bills");