1

私のAndroidアプリケーションには、ユーザーが3つのeditTextに情報を入力する3つのダイアログボックスがあり、選択するデータをランダムに選択した後、データの1つを別のクラス/ページに表示します。

これは私のメインクラスです

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();
}

}

プログラムがresultScreenにデータを表示しようとすると、ロード画面に数秒でアプリがクラッシュします。

ここに私の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)

みんなありがとう。

4

2 に答える 2

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その行はwithkey "displpay"と value を渡し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"
于 2013-05-17T22:46:33.500 に答える
0

UIThread内で長いプロセスを実行しているため、ANR:「Application Not Responding」があるため、アプリがクラッシュしていると思います。(onCreate() メソッドは UIThread のフォームです)

スリープ状態のスレッドまたは 1 つのハンドラー (メッセージ付き) の Asyntack として使用します。

さらに必要な場合は、明日コードを編集できます。

于 2013-05-17T21:31:18.210 に答える