Проблемы с разметкой parseInt и viewflipper - PullRequest
0 голосов
/ 01 апреля 2012

У меня проблема с parseInt(), выдает ошибку: невозможно проанализировать 'null' как целое число , также мой 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)

Ответы [ 2 ]

1 голос
/ 01 апреля 2012

Проверьте, является ли ваш parseddatadset нулевым, и, если да, добавьте "0" в поле from String, прежде чем вставить его как целое число.

Может быть реализовано следующим образом -

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

Я бы порекомендовал использовать переменную boolean, и если это приведет к ложному (! = 0), то только проанализируйте его, в противном случае вы знаете, что это parseddataset пусто. В вашем случае, когда вы используете xml.parser.dataset.getTemp(), проверьте, его длина равна 0 и разбирается, если false.

1 голос
/ 01 апреля 2012

Прямо сейчас вы пытаетесь разобрать как int a null String (вы вызываете статический метод из dataset, который вернет null, потому что объект, который он возвращает (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);?!

...