2013-08-02 198 views
0

为什么我的应用程序崩溃,当我离开我的活动?更具体地讲:一切工作正常,直到我实现onSaveInstanceState()onRestoreInstanceState()onSaveInstanceState崩溃我的应用程序

下面是代码:

@Override 
protected void onSaveInstanceState (Bundle outState){ 


     outState.putString("d1",(((EditText) findViewById (R.id.request_detail1)).getText()).toString()); 
     outState.putString("d2",(((EditText) findViewById (R.id.request_detail2)).getText()).toString()); 
     outState.putString("d3",(((EditText) findViewById (R.id.request_detail3)).getText()).toString()); 
     outState.putString("d4",(((EditText) findViewById (R.id.request_detail4)).getText()).toString()); 
     outState.putString("inputNr", (((EditText) findViewById (R.id.poRequest)).getText()).toString()); 
     super.onSaveInstanceState(outState); 
    } 



@Override 
    protected void onRestoreInstanceState (Bundle savedInstanceState){ 
      super.onRestoreInstanceState(savedInstanceState); 
      ((TextView) findViewById (R.id.request_detail1)).setText(savedInstanceState.getString("d1")); 
      ((TextView) findViewById (R.id.request_detail2)).setText(savedInstanceState.getString("d2")); 
      ((TextView) findViewById (R.id.request_detail3)).setText(savedInstanceState.getString("d3")); 
      ((TextView) findViewById (R.id.request_detail4)).setText(savedInstanceState.getString("d4")); 
      ((EditText) findViewById (R.id.poRequest)).setText(savedInstanceState.getString("inputNr")); 

     } 

logcat的告诉我 08-02 05:23:09.791: E/AndroidRuntime(873): at net.frontend.androidapp.statusrequest.PurchaseOrderRequest.onSaveInstanceState(PurchaseOrderRequest.java:47)

的refered线 outState.putString("d1",(((EditText) findViewById (R.id.request_detail1)).getText()).toString());

我有点困惑,只要onSaveInstanceState()被调用,应用程序崩溃。

,这里是整个代码,万一我的错误是由别的

package net.frontend.androidapp.statusrequest; 

import org.ksoap2.SoapEnvelope; 
import org.ksoap2.serialization.SoapObject; 
import org.ksoap2.serialization.SoapSerializationEnvelope; 
import org.ksoap2.transport.HttpTransportSE; 

import android.app.Activity; 
import android.app.ProgressDialog; 
import android.content.Intent; 
import android.os.AsyncTask; 
import android.os.Build; 
import android.os.Bundle; 
import android.support.v4.app.NavUtils; 
import android.view.MenuItem; 
import android.view.View; 
import android.widget.EditText; 
import android.widget.TextView; 

public class PurchaseOrderRequest extends Activity { 

private static String preqnr=""; 


    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.purchase_order_request_activity); 
     if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { 
      // Show the Up button in the action bar. 
      getActionBar().setDisplayHomeAsUpEnabled(true); 
     } 
    } 

    @Override 
    public boolean onOptionsItemSelected(MenuItem item) { 
     switch (item.getItemId()) { 
     case android.R.id.home: 
      NavUtils.navigateUpFromSameTask(this); 
      return true; 
     } 
     return super.onOptionsItemSelected(item); 
    } 
@Override 
    protected void onSaveInstanceState (Bundle outState){ 


     outState.putString("d1",(((EditText) findViewById (R.id.request_detail1)).getText()).toString()); 
     outState.putString("d2",(((EditText) findViewById (R.id.request_detail2)).getText()).toString()); 
     outState.putString("d3",(((EditText) findViewById (R.id.request_detail3)).getText()).toString()); 
     outState.putString("d4",(((EditText) findViewById (R.id.request_detail4)).getText()).toString()); 
     outState.putString("inputNr", (((EditText) findViewById (R.id.poRequest)).getText()).toString()); 
     super.onSaveInstanceState(outState); 
    } 
    @Override 
    protected void onRestoreInstanceState (Bundle savedInstanceState){ 
     super.onRestoreInstanceState(savedInstanceState); 
     ((TextView) findViewById (R.id.request_detail1)).setText(savedInstanceState.getString("d1")); 
     ((TextView) findViewById (R.id.request_detail2)).setText(savedInstanceState.getString("d2")); 
     ((TextView) findViewById (R.id.request_detail3)).setText(savedInstanceState.getString("d3")); 
     ((TextView) findViewById (R.id.request_detail4)).setText(savedInstanceState.getString("d4")); 
     ((EditText) findViewById (R.id.poRequest)).setText(savedInstanceState.getString("inputNr")); 

    } 
    public void showDetail(View view){ 

     Intent intent = new Intent(this, OrderDetails.class); 
     startActivity(intent); 
    } 
    public void checkStatus (View view) { 

     EditText edit = (EditText) findViewById (R.id.poRequest); 

      String s= edit.getText().toString(); 
      if (s.equals("")){ 
       // give error message 
      } 
      else{ 

       long lineNr=Long.parseLong(s); 

       new BackgroundWorker().execute(lineNr); 
      } 

    } 


    public class BackgroundWorker extends AsyncTask<Long, Void, String[]> { 

        private String METHOD_NAME = "parser" ; 
       private String NAMESPACE = "http://statusrequest.androidapp.webservice.backend.net"; 
       private String SOAP_ACTION = NAMESPACE + METHOD_NAME; 
       private static final String URL = "http://10.35.105.31:8080/SAPInterfaceWebservice/services/XMLTransfromer?wsdl"; 
       ProgressDialog pd = new ProgressDialog(PurchaseOrderRequest.this); 

        @Override 
        protected String[] doInBackground(Long... lineNr) { 
         String[] failure = new String [1]; 
         long lineNumber = lineNr[0]; 
         try 
        { 
        SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME); 
        request.addProperty("lineNr", lineNumber); 
        publishProgress(); 
        SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11); 
        envelope.dotNet = true; 
        envelope.setOutputSoapObject(request); 
        HttpTransportSE androidHttpTransport = new HttpTransportSE(URL); 
        androidHttpTransport.call(SOAP_ACTION,envelope); 
        Object result = envelope.getResponse(); 
        String hString = result.toString(); 
        String[] details = hString.split(","); 

        preqnr=details[0].substring(1); 
        return details; 
        } catch (Exception E) { 
        E.printStackTrace(); 
        failure[0]="ERROR: " + E.getClass().getName() + " : " + E.getMessage(); 
        } 
        return failure; 
        }  

        @Override 
        protected void onPostExecute(String[] result) { 

         ((TextView) findViewById (R.id.request_detail1)).setText("PO_Number: " +result[0].substring(1)); 
         ((TextView) findViewById (R.id.request_detail2)).setText("Result: " +result[1]); 
         ((TextView) findViewById (R.id.request_detail3)).setText("Result: " +result[2]); 
         ((TextView) findViewById (R.id.request_detail4)).setText("Result: " +result[3]); 
         pd.dismiss();  
        } 

        @Override 
        protected void onPreExecute() { 

         pd.setMessage("Sending..."); 
         pd.show(); 

        } 

        @Override 
        protected void onProgressUpdate(Void... values) { 


         } 

       } 
    public static String getPreqnr() { 
     return preqnr; 
     } 

    } 

引起那么我做错造成应用程序崩溃?

如果您需要任何进一步的信息,我错过指出,请留下评论,我会添加它们。

谢谢你的帮助!

+0

嘿,只要尝试把super.onSaveInstanceState(outState);作为onSaveInstanceState的第一行。并在onRestoreInstanceState执行检查,如果(savedInstanceState!= null){//做必需的东西} – SKK

+0

@Santhosh我曾尝试过这个,应用程序仍然崩溃。即使如此,我将使用'if(savedInstanceState!= null){//做必要的事情}'部分。但据我现在,甚至没有得到恢复部分:(但谢谢你:) –

回答

1

什么类型的对象是ID为“R.id.request_detail1”一个看法?在onSaveInstanceState中,您将它转换为EditText,但在onRestoreInstanceState中,您将它转换为TextView。

如果它是一个TextView,然后第一投将导致异常。

+0

哦,这让我感到非常愚蠢......谢谢。现在应用程序不再崩溃了。但它仍然行不通...?任何暗示? (即使它超出了实际问题的范围) –

+0

什么不起作用?请更具体一些。 –

+0

哦,是的确定:如果我回到活动,request_detail和poRequest字段是空的。没有错误发生。当我导航到儿童活动时,我在这些领域获得了信息。当我回到此活动时,信息不会显示。 –