2013-05-17 2 views
1

В моем приложении для Android у меня есть 3 диалоговых окна, в которых пользователь помещает информацию в 3 editTexts, и он отображает одну из данных на другой класс/страницу после случайного выбора какие данные выбрать.EditText.getText(). ToString() crashes

Это мой MainClass

public class MainActivity extends Activity { 
    //Variables are displayed in this area 
    String choices[] = new String[3]; 
    //EditText editText; 
    //EditText editText2; 
    //EditText editText3; 
    Button mainButton ; 

    Random rand = new Random(); 
    int finalChoice; 
    String displayChoice = ""; 
    EditText editText ; 
    EditText editText2; 
    EditText editText3; 
    EditText editText4; 
    String test; 
    int count = 3; 


//--------------------------- -------------------------------------------------------- 


    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 


     //Makes Button 

     setContentView(R.layout.activity_main); 
     declareTextBox(); 
     setButton(); 
     String choice1 = editText.getText().toString(); 
     String choice2 = editText2.getText().toString(); 
     String choice3 = editText3.getText().toString(); 

     choices[0] = choice1; //pass from click button to method. 
     choices[1] = choice2; 
     choices[2] = choice3; 

     finalChoice =rand.nextInt(2); 


    } 
    public void setButton() 
    { 
     final Button mainbutton = (Button) findViewById(R.id.mainButton); 

     mainbutton.setOnClickListener(new View.OnClickListener() { 
     public void onClick(View v) { 

      test = ((EditText) findViewById(R.id.editText4)).getText().toString(); 

     // count++; 
     //retChoice(); 
      // loadScreen(); 
     Intent i = new Intent(MainActivity.this, resultScreen.class); 
     i.putExtra("display" , displayChoice); 

     Intent intent = new Intent(MainActivity.this,loadingScreen.class); 

      //start the second Activity 
     MainActivity.this.startActivity(intent); 


      } 
     }); 

    } 
    public void declareTextBox() 
    { 
     editText = (EditText) findViewById(R.id.editText1); 
     editText2 = (EditText) findViewById(R.id.editText2); 
     editText3 = (EditText) findViewById(R.id.editText3); 

    } 
    public void getString(String finalChoice) 
    { 
     finalChoice = displayChoice; 
    } 


    public String retChoice() 
    { 


     displayChoice = choices[finalChoice]; 

     return displayChoice; 
    } 
    public void clearText() 
    { 
     editText.setOnClickListener(new View.OnClickListener() { 

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

       editText.setText(" "); 
       } 
      }); 

     editText2.setOnClickListener(new View.OnClickListener() { 

       @Override 
       public void onClick(View v) { 
        // TODO Auto-generated method stub 
        editText2.setText(" "); 
       } 
      }); 

     editText3.setOnClickListener(new View.OnClickListener() { 

       @Override 
       public void onClick(View v) { 
        // TODO Auto-generated method stub 
        editText3.setText(" "); 
       } 
      }); 

    } 
    public void getText2() 
    { 

    } 
    public void getText() 
    { 



    } 



    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     // Inflate the menu; this adds items to the action bar if it is present. 
     getMenuInflater().inflate(R.menu.main, menu); 
     return true; 
    } 
} 

Это мой дисплей Класс:

public class resultScreen extends Activity { 
    MainActivity ma = new MainActivity(); 
    //Method supposedly retrieves the string data from MainActivity Class but somehow displayed null instead. 
    //Find a way to keep the string variable when transfering from one class to another class. 
     String finalResult = ma.retChoice(); 
     public void onCreate(Bundle resultScreen){ 
     super.onCreate(resultScreen); 
     setContentView(R.layout.resultscreen); 
     //ma.displayChoice.toString(); 

     String str = finalResult; 

     TextView text = (TextView) findViewById(R.id.textView1); 
     text.setText(str); 

     final Button backbutton = (Button) findViewById(R.id.backButton); 
     backbutton.setOnClickListener(new View.OnClickListener() { 
     public void onClick(View v) 

     { 

     Intent intent = new Intent(resultScreen.this,MainActivity.class); 
     resultScreen.this.startActivity(intent);  


     } 
     }); 



     } 

} 

И это моя загрузка класс экрана сразу после основной нажимается кнопка

public class loadingScreen extends Activity{ 

protected void onCreate(Bundle loadingScreen) { 
    // TODO Auto-generated method stub 

    super.onCreate(loadingScreen); 
    setContentView(R.layout.loadingscreen); 


    //If sound clip 20 sec long we don't want to carryit outside next class 


    // A timer thread looking for "run" method 
    Thread timer = new Thread() 
    { 
     public void run() { 
      try { 

       //this is how many mil sec 
       sleep(8000); 


      } catch (InterruptedException e) { 
       e.printStackTrace(); 

      } finally { 
       Intent intent = new Intent(loadingScreen.this, resultScreen.class); 
       loadingScreen.this.startActivity(intent); 
       loadingScreen.this.finish(); 

      } 

     } 
    }; 
    timer.start(); 
} 

}

Мое приложение разбивается на несколько секунд на экране загрузки, когда программа пытается отобразить данные на экране результатов.

Вот мой LogCat

05-17 22:32:54.446: D/AndroidRuntime(1181): Shutting down VM 
05-17 22:32:54.446: W/dalvikvm(1181): threadid=1: thread exiting with uncaught exception (group=0x40a70930) 
05-17 22:32:54.636: E/AndroidRuntime(1181): FATAL EXCEPTION: main 
05-17 22:32:54.636: E/AndroidRuntime(1181): java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{com.example.choiceprototest/com.example.choiceprototest.resultScreen}: java.lang.NullPointerException 
05-17 22:32:54.636: E/AndroidRuntime(1181):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2106) 
05-17 22:32:54.636: E/AndroidRuntime(1181):  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2230) 
05-17 22:32:54.636: E/AndroidRuntime(1181):  at android.app.ActivityThread.access$600(ActivityThread.java:141) 
05-17 22:32:54.636: E/AndroidRuntime(1181):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1234) 
05-17 22:32:54.636: E/AndroidRuntime(1181):  at android.os.Handler.dispatchMessage(Handler.java:99) 
05-17 22:32:54.636: E/AndroidRuntime(1181):  at android.os.Looper.loop(Looper.java:137) 
05-17 22:32:54.636: E/AndroidRuntime(1181):  at android.app.ActivityThread.main(ActivityThread.java:5039) 
05-17 22:32:54.636: E/AndroidRuntime(1181):  at java.lang.reflect.Method.invokeNative(Native Method) 
05-17 22:32:54.636: E/AndroidRuntime(1181):  at java.lang.reflect.Method.invoke(Method.java:511) 
05-17 22:32:54.636: E/AndroidRuntime(1181):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793) 
05-17 22:32:54.636: E/AndroidRuntime(1181):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560) 
05-17 22:32:54.636: E/AndroidRuntime(1181):  at dalvik.system.NativeStart.main(Native Method) 
05-17 22:32:54.636: E/AndroidRuntime(1181): Caused by: java.lang.NullPointerException 
05-17 22:32:54.636: E/AndroidRuntime(1181):  at com.example.choiceprototest.MainActivity.retChoice(MainActivity.java:101) 
05-17 22:32:54.636: E/AndroidRuntime(1181):  at com.example.choiceprototest.resultScreen.<init>(resultScreen.java:18) 
05-17 22:32:54.636: E/AndroidRuntime(1181):  at java.lang.Class.newInstanceImpl(Native Method) 
05-17 22:32:54.636: E/AndroidRuntime(1181):  at java.lang.Class.newInstance(Class.java:1319) 
05-17 22:32:54.636: E/AndroidRuntime(1181):  at android.app.Instrumentation.newActivity(Instrumentation.java:1054) 
05-17 22:32:54.636: E/AndroidRuntime(1181):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2097) 
05-17 22:32:54.636: E/AndroidRuntime(1181):  ... 11 more 
05-17 22:33:03.385: I/Process(1181): Sending signal. PID: 1181 SIG: 9 
05-17 22:33:05.435: E/Trace(1204): error opening trace file: No such file or directory (2) 

Спасибо, ребята.

+2

сообщение сообщение об ошибке ... – jlordo

+0

Что находится в строке 101 «MainActivity»? – codeMagic

+0

Кроме того, его трудно следить за тем, что именно вы здесь делаете, но если вы хотите передать значения «String», просто передайте их через «Intent» – codeMagic

ответ

2

Я считаю, что вижу проблему. Вы пытаетесь получить доступ к своему Array, но это переменная экземпляра вместо статичной, поэтому она отключается при выходе из вашего Activity. Вы можете поместить их в статический класс и получить к ним доступ таким образом или передать переменную String через ваш Intent, в зависимости от того, что вам нужно.

Если у вас есть значение String, то вам нужно, когда вы оставите MainActivity, тогда я бы, скорее всего, просто пропустил его через ваш Intent. Если значение зависит от чего-то в одном из ваших других Activities, то я считал бы положить его в отдельный класс, но это не похоже, что это то, что вам нужно здесь

Редактировать

Вы уже делаете это здесь, вид

Intent i = new Intent(MainActivity.this, resultScreen.class); 
    i.putExtra("display" , displayChoice); 

    Intent intent = new Intent(MainActivity.this,loadingScreen.class); 

Но вы не начинать Activity что бы получить String

i.putExtra("display" , displayChoice); 

эта линия будет передавать String с key "displpay" и значением displayChoice, хотя я думаю, что это пустое String в этот момент, но вы не запустите это Activity.Я потерял от того, как поток, предполагают, чтобы работать, но в принципе вы могли бы сделать что-то вроде этого

String displayChoice = "testValue"; // some arbitrary value--whatever you need to send 
Intent i = new Intent(MainActivity.this, resultScreen.class); // create the Intent 
i.putExtra("display" , displayChoice); // add the extra 
startActivity(i); //start the Activity 

затем, чтобы получить значение внутри resultScreen в onCreate()

Intent recIntent = getIntent(); // get the Intent that started this Activity 
String value = recIntent.getStringExtra("display"); // get the value using the key 
// value now equals "testValue" 
+0

Спасибо CodeMagic, что действительно помогло. Можете ли вы привести пример о том, как передать эти строки через мои намерения? Я попытаюсь найти решение через Google или этот сайт. Благодаря! – htjohn

+0

Я сделал быстрое редактирование. Надеюсь, это может вам помочь. Как я уже сказал, я немного потерял ваш поток, но это должно дать вам хорошее представление о том, как передать нужные вам значения и как получить значение. – codeMagic

+0

Хорошо, спасибо. Я ценю это! – htjohn

0

Я думаю, что ваш чат приложения, потому что у вас есть ANR: «Приложение не отвечает», потому что вы работаете с длинными перечнями внутри UIThread. (метод onCreate() формирует UIThread)

Используйте скорее как Asyntack для вашей спальной нити или одного обработчика (с сообщениями).

Если вам нужно больше, я могу изменить код завтра.

+0

. Я сомневаюсь, что это проблема, я не вижу ничего, что занимает больше, чем полсекунды для выполнения. Нить не делает ничего кроме сна, кроме того, что это нить, поэтому она не может вызвать ANR. –

+0

@RaymondP: У меня есть небольшое сомнение, но также начинаем поток, который ничего не делает в методе onCreate(), не является обычным явлением. – Jarvis

+0

Я думаю, что он сработает, когда я соединяю строки с editText.getText(). ToString(); Потому что когда я сделал выбор строки1 = «random userInput»; он работал нормально. Но когда я сделал String choice1 = editText.getText(). ToString(); он сразу же падает. Я не знаю, почему он продолжает терпеть крах. – htjohn

Смежные вопросы