2012-04-01 75 views
0

我有一个问题parseInt(),它抛出的错误:无法解析“空”为整数,也是我ViewFlipper不工作。这里是我的活动:parseInt函数和viewflipper布局问题

import javax.xml.parsers.SAXParser; 
    import javax.xml.parsers.SAXParserFactory; 

    import org.xml.sax.InputSource; 
    import org.xml.sax.XMLReader; 

    import android.app.Activity; 
    import android.graphics.Color; 
    import android.os.Bundle; 
    import android.util.Log; 
    import android.view.View; 
    import android.view.View.OnClickListener; 
    import android.widget.Button; 
    import android.widget.LinearLayout; 
    import android.widget.TextView; 
    import android.widget.ViewFlipper; 
    import xml.parser.dataset; 



    public class XmlParserActivity extends Activity implements OnClickListener { 


    private final String MY_DEBUG_TAG = "WeatherForcaster"; 
    // private dataset myDataSet; 
    private LinearLayout layout; 
    private int temp= 0; 

    /** Called when the activity is first created. */ 
    //the ViewSwitcher 
    private Button btn; 
    private ViewFlipper flip; 
// private TextView tv; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
      super.onCreate(savedInstanceState); 
      setContentView(R.layout.main); 
      layout=(LinearLayout)findViewById(R.id.linearlayout1); 
      btn=(Button)findViewById(R.id.btn); 
      btn.setOnClickListener(this); 
      flip=(ViewFlipper)findViewById(R.id.flip);        
      //when a view is displayed 
      flip.setInAnimation(this,android.R.anim.fade_in); 
      //when a view disappears 
      flip.setOutAnimation(this, android.R.anim.fade_out); 
     // String postcode = null; 

     // public String getPostcode { 
      //  return postcode; 
    // } 

        //URL newUrl = c; 

       // myweather.setText(c.toString()); 


      /* Create a new TextView to display the parsingresult later. */ 
      TextView tv = new TextView(this); 





      // run(0); 
      //WeatherApplicationActivity postcode = new WeatherApplicationActivity(); 
      try { 

        /* Create a URL we want to load some xml-data from. */ 
       URL url = new URL("http://new.myweather2.com/developer/forecast.ashx?uac=gcV3ynNdoV&output=xml&query=G41"); 

       //String url = new String("http://new.myweather2.com/developer/forecast.ashx?uac=gcV3ynNdoV&output=xml&query="+WeatherApplicationActivity.postcode); 



       //URL url = new URL(url); 
        //url.toString(); 
        //myString(url.toString() + WeatherApplicationActivity.getString(postcode)); 
        // url + WeatherApplicationActivity.getString(postcode); 
        /* Get a SAXParser from the SAXPArserFactory. */ 
        SAXParserFactory spf = SAXParserFactory.newInstance(); 
        SAXParser sp = spf.newSAXParser(); 

        /* Get the XMLReader of the SAXParser we created. */ 
        XMLReader xr = sp.getXMLReader(); 
        /* Create a new ContentHandler and apply it to the XML-Reader*/ 
        handler myHandler = new handler(); 
        xr.setContentHandler(myHandler); 

        /* Parse the xml-data from our URL. */ 
        xr.parse(new InputSource(url.openStream())); 
        /* Parsing has finished. */ 

        /* Our ExampleHandler now provides the parsed data to us. */ 
        dataset parsedDataSet = 
                    myHandler.getParsedData(); 

        /* Set the result to be displayed in our GUI. */ 
        tv.setText(parsedDataSet.toString()); 


      } catch (Exception e) { 
        /* Display any Error to the GUI. */ 
        tv.setText("Error: " + e.getMessage()); 
        Log.e(MY_DEBUG_TAG, "WeatherQueryError", e); 
      } 



      temp = Integer.parseInt(xml.parser.dataset.getTemp()); 


       if(temp <0){ 
        //layout.setBackgroundColor(Color.BLUE); 
        //layout.setBackgroundColor(getResources().getColor(R.color.silver)); 
        findViewById(R.id.flip).setBackgroundColor(Color.BLUE); 
       } 
       else if(temp > 0 && temp < 9) 
       { 
        //layout.setBackgroundColor(Color.GREEN); 
        //layout.setBackgroundColor(getResources().getColor(R.color.silver)); 
        findViewById(R.id.flip).setBackgroundColor(Color.GREEN); 
       } 
       else 
       { 
        //layout.setBackgroundColor(Color.YELLOW); 
        //layout.setBackgroundColor(getResources().getColor(R.color.silver)); 
        findViewById(R.id.flip).setBackgroundColor(Color.YELLOW); 
       } 


     /* Display the TextView. */ 
    this.setContentView(tv); 
    } 

    @Override 
    public void onClick(View arg0) { 
     // TODO Auto-generated method stub onClick(View arg0) { 

     // TODO Auto-generated method stub 
     flip.showNext(); 
     //specify flipping interval    
     //flip.setFlipInterval(1000);   
     //flip.startFlipping(); 
    } 

    }  

这是我dataset

package xml.parser; 



public class dataset { 

static String temp = null; 

// private int extractedInt = 0; 


public static String getTemp() { 
    return temp; 
} 
public void setTemp(String temp) { 
    this.temp = temp; 
} 

这是我的处理程序:

public void characters(char ch[], int start, int length) { 
if(this.in_temp){ 
      String setTemp = new String(ch, start, length); 
      // myParsedDataSet.setTempUnit(new String(ch, start, length)); 
     // myParsedDataSet.setTemp; 
      } 

对于dataset和处理程序,我只粘贴,涉及到temp代码因为我知道他们在我拿出if语句时工作。但即使如此,我的ViewFlipper不会工作。 这是我main.xml

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:orientation="vertical" 
android:layout_width="fill_parent" 
android:layout_height="fill_parent" 
android:id="@+id/linearlayout1" 
> 
<TextView 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:textSize="25dip" 
    android:text="Flip Example" 
/> 
    <TextView 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:textSize="25dip" 
     android:id="@+id/tv" 
    /> 
<Button 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:textSize="25dip" 
    android:text="Flip" 
    android:id="@+id/btn" 
    android:onClick="ClickHandler" 
/> 
<ViewFlipper 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:id="@+id/flip"> 
    <LinearLayout 
     android:orientation="vertical" 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent" 
    > 
     <TextView 
      android:layout_width="fill_parent" 
      android:layout_height="wrap_content" 
      android:textSize="25dip" 
      android:text="Item1a" 
     /> 


    </LinearLayout> 
    <TextView 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:textSize="25dip" 
     android:id="@+id/tv2" 
    /> 

</ViewFlipper> 
</LinearLayout> 

这是我Logcat

04-01 18:02:24.744: E/AndroidRuntime(7331): FATAL EXCEPTION: main 
04-01 18:02:24.744: E/AndroidRuntime(7331): java.lang.RuntimeException: Unable to start activity ComponentInfo{xml.parser/xml.parser.XmlParserActivity}: java.lang.NumberFormatException: unable to parse 'null' as integer 
04-01 18:02:24.744: E/AndroidRuntime(7331):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1830) 
04-01 18:02:24.744: E/AndroidRuntime(7331):  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1851) 
04-01 18:02:24.744: E/AndroidRuntime(7331):  at android.app.ActivityThread.access$1500(ActivityThread.java:132) 
04-01 18:02:24.744: E/AndroidRuntime(7331):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1038) 
04-01 18:02:24.744: E/AndroidRuntime(7331):  at android.os.Handler.dispatchMessage(Handler.java:99) 
04-01 18:02:24.744: E/AndroidRuntime(7331):  at android.os.Looper.loop(Looper.java:150) 
04-01 18:02:24.744: E/AndroidRuntime(7331):  at android.app.ActivityThread.main(ActivityThread.java:4293) 
04-01 18:02:24.744: E/AndroidRuntime(7331):  at java.lang.reflect.Method.invokeNative(Native Method) 
04-01 18:02:24.744: E/AndroidRuntime(7331):  at java.lang.reflect.Method.invoke(Method.java:507) 
04-01 18:02:24.744: E/AndroidRuntime(7331):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:849) 
04-01 18:02:24.744: E/AndroidRuntime(7331):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:607) 
04-01 18:02:24.744: E/AndroidRuntime(7331):  at dalvik.system.NativeStart.main(Native Method) 
04-01 18:02:24.744: E/AndroidRuntime(7331): Caused by: java.lang.NumberFormatException: unable to parse 'null' as integer 
04-01 18:02:24.744: E/AndroidRuntime(7331):  at java.lang.Integer.parseInt(Integer.java:356) 
04-01 18:02:24.744: E/AndroidRuntime(7331):  at java.lang.Integer.parseInt(Integer.java:332) 
04-01 18:02:24.744: E/AndroidRuntime(7331):  at xml.parser.XmlParserActivity.onCreate(XmlParserActivity.java:118) 
04-01 18:02:24.744: E/AndroidRuntime(7331):  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1072) 
04-01 18:02:24.744: E/AndroidRuntime(7331):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1794) 

回答

1

现在你试图解析为int一个null字符串(您呼叫从dataset将在静态方法因为它返回的对象(temp)被设置为null)你可能想解析为int XML解析的结果,所以不是:

temp = Integer.parseInt(xml.parser.dataset.getTemp()); 

使用parsedDataSet变量:

temp = Integer.parseInt(parsedDataSet.getTemp()); 

例子:

//.... 
    dataset parsedDataSet; 
    try { 
     URL url = new URL(
       "http://new.myweather2.com/developer/forecast.ashx?uac=gcV3ynNdoV&output=xml&query=G41"); 
     SAXParserFactory spf = SAXParserFactory.newInstance(); 
     SAXParser sp = spf.newSAXParser(); 
     XMLReader xr = sp.getXMLReader(); 
     handler myHandler = new handler(); 
     xr.setContentHandler(myHandler); 
     xr.parse(new InputSource(url.openStream())); 
     parsedDataSet = myHandler.getParsedData(); 
     tv.setText(parsedDataSet.toString()); 
    } catch (Exception e) { 
     tv.setText("Error: " + e.getMessage()); 
     Log.e(MY_DEBUG_TAG, "WeatherQueryError", e); 
    } 

    temp = Integer.parseInt(parsedDataSet.getTemp()); 
    //... 

我也看你的代码中的其他错误:

- 在xml解析器中,你会实际上在结果中设置了解析的字符串?

// I guess that myParsedDataSet is another dataset object that you return with 
// myHandler.getParsedData(), do you set the temp variable in that class?? // myParsedDataSet.setTemp(setTemp); 
if(this.in_temp){ 
      String setTemp = new String(ch, start, length); 
      // myParsedDataSet.setTempUnit(new String(ch, start, length)); 
     // myParsedDataSet.setTemp; 
      } 

- 同样您解析XML,从parseInt检查值,然后用this.setContentView(tv);更换活动的主要布局?!

+0

因为getTemp()方法在数据集中,所以不起作用... – user1234167 2012-04-01 17:39:44

+0

@ user1234167从你的代码中''parsedDataSet'是'dataset'的一个实例,你有这样一行:'dataset parsedDataSet = myHandler.getParsedData() ;所以调用该方法不应该是一个问题。在输入try-catch块之前声明你的'parsedDataSet',并在该块中只将结果赋值给'parsedDataSet'。 – Luksprog 2012-04-01 17:43:23

+0

你能否给我举一个例子,说明我真的很困惑 – user1234167 2012-04-01 18:13:53

1

检查您的parseddatadset是否为空,如果在将字符串作为整数进行粘贴之前在其中添加“0”。

可以实现如下 -

String checknull=parseddataset.toString(); 
if(checknull.length()==0) 
    checknull += "0"; 

我会建议使用boolean可变的,如果它导致假(!= 0),那么仅分析它,否则你就知道它parseddataset是空的。在你使用xml.parser.dataset.getTemp()的情况下,检查它的长度是否为0,如果是false,则解析。

+0

嘿,我已经试过了,我仍然得到相同的错误 – user1234167 2012-04-01 18:23:42

+0

事实上,我刚刚改变了这一点:static String temp =“0”;并且它现在成为0度 – user1234167 2012-04-01 18:25:53

+0

显然现在当你使临时静态和等于'0'时只显示'String temp = 0',并且如果它将从解析器读取任何东西,则'0'将被“解析的值”替换,否则它将仅为“0”。所以如果你仍然得到'0',这意味着该文件没有得到解析。对不起,没有注意到临时温度的声明,否则会给出初始化字符串温度0的答案。无论如何,这个'String temp = 0'应该可以解决问题。 :D – Exorcist 2012-04-01 18:47:42