EditText.getText().toString() 崩溃

Posted

技术标签:

【中文标题】EditText.getText().toString() 崩溃【英文标题】:EditText.getText().toString() crashes 【发布时间】:2013-05-13 03:30:51 【问题描述】:

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

这是我的主类

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 ComponentInfocom.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)

谢谢各位。

【问题讨论】:

发布错误信息... MainActivity 的第 101 行是什么? 另外,很难理解你在这里所做的事情,但如果你想传递 String 值,只需将它们传递给 Intent 【参考方案1】:

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

如果您在离开MainActivity 时拥有所需的String 的值,那么我可能会将其传递给您的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);

该行将通过Stringkey "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

然后在onCreate()中获取resultScreen中的值

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"

【讨论】:

感谢 codeMagic,这真的很有帮助。你能举例说明如何通过我的意图传递这些字符串吗?我会尝试通过谷歌或这个网站搜索解决方案。谢谢! 我做了一个快速编辑。希望这可以帮助你。正如我所说,我对你的流程有点迷茫,但这应该让你很好地了解如何传递你需要的值以及如何获得值【参考方案2】:

我认为您的应用程序崩溃是因为您有一个 ANR:“应用程序无响应”,因为您在 UIThread 内运行了很长的过程。 (onCreate() 方法来自 UIThread)

宁可用作睡眠线程或一个处理程序(带有消息)的 Asyntack。

如果你需要更多,我明天可以编辑你的代码。

【讨论】:

我怀疑这是一个问题,我没有看到任何需要超过半秒才能执行的内容。除了睡眠之外,该线程没有做任何事情,除了它是一个线程,因此它不会导致 ANR。 @RaymondP:我有点怀疑,而且在onCreate()方法中启动一个什么都不做的线程也不常见.. 我认为当我将字符串连接到 editText.getText().toString(); 时它会崩溃;因为当我做 String choice1 = "random userInput" ;它工作得很好。但是当我做 String choice1 = editText.getText().toString();它立即崩溃。我不知道为什么它总是崩溃。 @htjohn 请发布您的 logcat 输出,至少应该显示一些内容。 @Jarvis 这实际上是暂停代码执行而不获得 ANR 的正常方式。人们将它用于启动画面。

以上是关于EditText.getText().toString() 崩溃的主要内容,如果未能解决你的问题,请参考以下文章

EditText 文本用作文件名

Retrofit进行post提交json数据

Android EditText获取光标位置并插入字符删除字符

冲刺

怎么将edittext的内容发表到listview

EditText 无法失焦与失焦后键盘不收缩解决方案