EditText.getText().toString() 崩溃

2022-01-12 00:00:00 crash android java eclipse android-edittext

在我的 android 应用程序中,我有 3 个对话框,用户在其中将信息放入 3 个 editTexts 中,它会在随机选择要选择的数据后将其中一个数据显示到另一个类/页面上.

In my android application , I have 3 dialogue boxes in which the user puts info into 3 editTexts and it will display the one of the data onto another class/page after it randomly picks which data to choose.

这是我的主类

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


      }
        });



        }

}

这是我点击主按钮后的加载屏幕类

And this is my loading screen class right after the main button is clicked

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 上显示数据时,我的应用程序在加载屏幕几秒钟后崩溃.

My app crashes a few seconds into the loading screen when the program attempts to display the data on the resultScreen.

这是我的 logCat

Here's my 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)

谢谢各位.

推荐答案

我相信我看到了问题所在.您正在尝试访问您的 Array,但它是一个实例变量而不是静态变量,因此当您退出 Activity 时它会被终止.您可以将它们放在静态类中并以这种方式访问​​它们,也可以通过 Intent 传递 String 变量,具体取决于您的需要.

I believe I see the problem. You are trying to access your Array but it is an instance variable instead of static so it is being killed off when you exit your Activity. You can either put them in a static class and access them that way or pass a String variable through your Intent, depending on what you need.

如果您在离开 MainActivity 时拥有所需的 String 值,那么我可能会通过您的 Intent 传递它.如果该值取决于您的其他 Activity 之一中的某些内容,那么我会考虑将其放在一个单独的类中,但看起来这不是您在这里需要的

If you have the value of the String you need when you leave MainActivity then I would probably just pass it through your Intent. If the value depended on something in one of your other Activities then I would consider putting it in a separate class but it doesn't look like that's what you need here

编辑

你已经在这里做了,有点

You are already doing it here, kind of

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

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

但是您没有启动会获得 String

But you aren't starting the Activity that would get the String

i.putExtra("display" , displayChoice);

该行将传递一个 Stringkey "displpay"displayChoice 的值,虽然我认为该值是一个空 String 在那一点上,但你没有启动那个 Activity.我不知道你的流程应该如何工作,但基本上你会做这样的事情

that line would pass a String with key "displpay" and value of displayChoice, although I think that value is an empty String at that point, but you don't start that Activity. I'm lost on how your flow is suppose to work but basically you would do something like this

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

然后在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"

相关文章