【问题标题】:Application stops when clicked on Button单击按钮时应用程序停止
【发布时间】:2013-02-20 23:37:23
【问题描述】:

每当我单击提交按钮时,我都会收到错误消息“不幸的是,应用程序已停止工作。”请你帮帮我。

代码-

    public void onClick(View v) {
            TextView t = (TextView) findViewById(R.id.textView4);   
            if(from == to)
            {
                Toast.makeText(getApplicationContext(), "Invalid", 4000).show();

            }


            else
            {                                       
                  try {
                     s = getJson("URL");                        
                    JSONObject jObj;
                    jObj = new JSONObject(s);
                    String exResult = jObj.getJSONObject("query").getJSONObject("results").getJSONObject("rate").getString("Rate");
                    t.setText(exResult);
                    } catch (JSONException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                    catch (ClientProtocolException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    } catch (IOException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }                                                    
                }   

            }                               
    });
}

LogCat -

03-15 12:06:17.508: E/AndroidRuntime(877): 致命异常: main 03-15 12:06:17.508: E/AndroidRuntime(877): android.os.NetworkOnMainThreadException 03-15 12:06:17.508: E/AndroidRuntime(877): 在 android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1117) 03-15 12:06:17.508: E/AndroidRuntime(877): 在 java.net.InetAddress.lookupHostByName(InetAddress.java:385) 03-15 12:06:17.508: E/AndroidRuntime(877): 在 java.net.InetAddress.getAllByNameImpl(InetAddress.java:236) 03-15 12:06:17.508: E/AndroidRuntime(877): 在 java.net.InetAddress.getAllByName(InetAddress.java:214) 03-15 12:06:17.508: E/AndroidRuntime(877): at org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:137) 03-15 12:06:17.508: E/AndroidRuntime(877): at org.apache.http.impl.conn.AbstractPoolEntry.open(AbstractPoolEntry.java:164) 03-15 12:06:17.508: E/AndroidRuntime(877): at org.apache.http.impl.conn.AbstractPooledConnAdapter.open(AbstractPooledConnAdapter.java:119) 03-15 12:06:17.508: E/AndroidRuntime(877): at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:360) 03-15 12:06:17.508: E/AndroidRuntime(877): 在 org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:555) 03-15 12:06:17.508: E/AndroidRuntime(877): 在 org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:487) 03-15 12:06:17.508: E/AndroidRuntime(877): 在 org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:465) 03-15 12:06:17.508: E/AndroidRuntime(877): 在 myandroid.myfirstmodule.sconverter.getJson(sconverter.java:163) 03-15 12:06:17.508: E/AndroidRuntime(877): 在 myandroid.myfirstmodule.sconverter$1.onClick(sconverter.java:96) 03-15 12:06:17.508: E/AndroidRuntime(877): 在 android.view.View.performClick(View.java:4084) 03-15 12:06:17.508: E/AndroidRuntime(877): 在 android.view.View$PerformClick.run(View.java:16966) 03-15 12:06:17.508: E/AndroidRuntime(877): 在 android.os.Handler.handleCallback(Handler.java:615) 03-15 12:06:17.508: E/AndroidRuntime(877): 在 android.os.Handler.dispatchMessage(Handler.java:92) 03-15 12:06:17.508: E/AndroidRuntime(877): 在 android.os.Looper.loop(Looper.java:137) 03-15 12:06:17.508: E/AndroidRuntime(877): 在 android.app.ActivityThread.main(ActivityThread.java:4745) 03-15 12:06:17.508: E/AndroidRuntime(877): at java.lang.reflect.Method.invokeNative(Native Method) 03-15 12:06:17.508: E/AndroidRuntime(877): 在 java.lang.reflect.Method.invoke(Method.java:511) 03-15 12:06:17.508: E/AndroidRuntime(877): 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786) 03-15 12:06:17.508: E/AndroidRuntime(877): 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553) 03-15 12:06:17.508: E/AndroidRuntime(877): at dalvik.system.NativeStart.main(Native Method)

【问题讨论】:

  • 点击第二个按钮有什么问题?
  • 我不认为将 submitfinal 的 onClick 放在按钮 b 的 onCLick 内是正确的做法。为什么需要这样做?
  • 你想达到什么目的...?
  • 当我点击第二个按钮时,我会自动移动到上一页。
  • ok..我首先使用 yahoo api 获取数据(第一次点击时..效果很好),然后处理该数据以将其与用户在文本框中输入的文本相乘(通过点击第二个按钮...自动移到上一页)

标签: android onclick textview


【解决方案1】:

你为什么不在这样的布局中实现onclick事件:

<Button
    android:id="@+id/button2"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="Click Here"
    android:onClick="btnClicked" />

然后定义方法btnClicked()。我认为这样你就可以通过自定义方法使用这个 onClickListener。您甚至可以对 button1 使用相同的方法,并在其中确定调用了哪个按钮。

【讨论】:

  • 嗨,我已经修改了我的代码。现在,我只使用一个提交按钮。该过程应该以这种方式进行: (i) 用户将在 textbox1 中输入数字,例如 x。单击提交时,将获取数据,例如 y 并显示在 textview1 上。 (ii) 然后同时,它应该将 x 和 y 相乘并显示在 textview2 上。我为它编写了代码,但又一次,我回到了上一页......请帮助。
  • 然后在此处添加编辑帖子的新代码。我不认为你跟着我和kdroider,因为我写的你可以修改按钮的xml,而kdroider给了你实现方法的方法。
  • 嗨,您可能是对的……但说真的,我不明白您的意思是什么?我对android编程有点陌生,所以你能详细说明你在第一个答案中所说的内容吗?
  • 在每个按钮的布局中实现android:onClick=(您可能希望使用相同的名称。此名称为您提供了要调用的方法。该方法在您的 main_activity 中定义,例如,使用 kdroider 提供给您的代码来确定按下了哪个按钮。之后,只有您知道之后需要做什么。
  • 嗨,你和 kdroider 说的完全一样,但最终在 buttonClickListener 上出现 3 个错误,说 "Illegal modifier for parameter buttonClickListener; only final is allowed" 。接下来我该怎么办?
【解决方案2】:

您可能会尝试将第二个按钮的侦听器从 else 块中移出。 我认为将一个侦听器放在另一个侦听器中并不是一个好习惯

【讨论】:

  • 嗨,我已经修改了我的代码。现在,我只使用一个提交按钮。该过程应该以这种方式进行: (i) 用户将在 textbox1 中输入数字,例如 x。单击提交时,将获取数据,例如 y 并显示在 textview1 上。 (ii) 然后同时,它应该将 x 和 y 相乘并显示在 textview2 上。我为它编写了代码,但又一次,我回到了上一页......请帮助。
【解决方案3】:

我不确定您在代码中的具体目标是什么。但我不认为将 submitfinal 的 onClick 放在按钮 b 的 onCLick 内是正确的做法。您需要单独处理它们。如果你想在一个 onClickListener 中这样做,你可以这样做:

  int x, y, product; 
  public OnClickListener buttonClickListener = new OnClickListener() {
        @Override
        public void onClick(View v) {
                switch (v.getId()) {

            case <button b id>: 
                //fetch values of x and y
                                    x = Integer.parseInt(yourtextbox1.getText().toString());
                                    y = Integer.parseInt(yourtextbox2.getText().toString());
            break;
            case <button submit final id>: 
                //multiply x and y
                       product = x*y;
                    //display the product
                       yourtextbox3.setText(product);
            break;
            }
     };

 b.setOnClickListener(buttonClickListener);
 submitFinal.setOnClickListener(buttonClickListener);

编辑:

在您当前的代码中,移动以下行:

 t = (TextView) findViewById(R.id.textView4);    
 displayfinal = (TextView) findViewById(R.id.textView3);

在您的 onclick 侦听器之外。

希望对您有所帮助。

【讨论】:

  • 嗨,我已经修改了我的代码。现在,我只使用一个提交按钮。该过程应该以这种方式进行: (i) 用户将在 textbox1 中输入数字,例如 x。单击提交时,将获取数据,例如 y 并显示在 textview1 上。 (ii) 然后同时,它应该将 x 和 y 相乘并显示在 textview2 上。我为它编写了代码,但又一次,我回到了上一页......请帮助。
  • 没有兄弟,我仍然有 3 个错误,你在 buttonClickListener(我们创建的对象)上建议我说“参数 buttonClickListener 的非法修饰符;只允许 final”和 2 个 buttonClickListener 上的两个错误说“ buttonClickListener 无法解析为变量”。接下来我该怎么办?
  • 嗨,朋友,非常感谢您的帮助...我很想解决这个问题,所以我一直在问我的朋友,终于找到了解决方案。我得到了预期的输出,但很抱歉没有尝试 urs...无论如何,再次感谢您的帮助
  • 没问题。如果我能给出正确答案,请点击复选标记接受我的答案,否则,发布您的答案并接受您自己的答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-03
  • 1970-01-01
相关资源
最近更新 更多