【问题标题】:How to call method from OnClickListener.onClick method ?如何从 OnClickListener.onClick 方法调用方法?
【发布时间】:2011-10-18 21:05:35
【问题描述】:
import java.io.InputStreamReader;
import java.io.Reader;
import java.net.URL;
import java.net.URLEncoder;

import com.google.gson.Gson;

import android.app.Activity;
import android.os.Bundle;

import android.view.View;

import android.widget.EditText;
import android.widget.ImageButton;
import android.widget.TextView;   

public class SampleActivity extends Activity {

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        ImageButton button = (ImageButton) findViewById(R.id.imageButton1);        
        button.setOnClickListener(new View.OnClickListener()   {             
           public void onClick(View v)  {               
            try {
                doSomething();
            } catch (Exception e) {
                // TODO Auto-generated catch block
                e.printStackTrace();                    
            }               
           }  
         });
       }
    public  void doSomething() throws Exception {
        EditText search2 = (EditText)findViewById(R.id.editText1);
        TextView urltext = (TextView)findViewById(R.id.textView1);
        String google = "http://ajax.googleapis.com/ajax/services/search/web?v=1.0&q=";
        String search = search2.toString() + "site:mysite.com";
        String charset = "UTF-8";

        URL url = new URL(google + URLEncoder.encode(search, charset));
        Reader reader = new InputStreamReader(url.openStream(), charset);
        GoogleResults results = new Gson().fromJson(reader, GoogleResults.class);
       String voidurlresult = results.getResponseData().getResults().get(0).getUrl().toString();
       urltext.setText(voidurlresult);           
    }
}

请看一下上面的代码.....代码有什么问题。当我单击按钮时,我什么也得不到。当我单击按钮时,我想获取第一个 google 结果的 url ...如果有人可以帮助我,我将不胜感激

【问题讨论】:

  • 尝试向doSomething 方法添加日志消息或toast 通知消息,以确保doSomething 方法被调用。
  • @slayton 所说的将是一个很好的测试,或者只是尝试设置 urltext.setText("嘿,我的点击成功了!");您从页面获取数据的方法可能没有按预期工作
  • 我将 urltext.setText 更改为一些东西来测试它,但它没有出现......
  • 我从stackoverflow.com/questions/3727662/… 获得了最多的代码,如果这可以帮助我有人帮助我!

标签: android parsing


【解决方案1】:
button.setOnClickListener(new View.OnClickListener()   {             
       public void onClick(View v)  {               
        try {
            SampleActivity.this.doSomething();
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();                    
        }               
       }  
     });

将 try 语句中的语句更改为此。这将确保引用正确的类来调用该方法。

【讨论】:

    【解决方案2】:

    您的代码是正确的,只是看起来您无法知道该方法正在被调用。考虑在您的 doSomething() 方法中添加某种通知,以便您知道该方法是否被调用。

    做这样的事情:

    public  void doSomething() throws Exception {
    
            // Show toast when method is called:
            Toast.makeText(this, "doSomething() is getting called", Toast.LENGTH_LONG).show();
    
            // the rest of doSomthing()
    
    
        }
    

    【讨论】:

      【解决方案3】:

      虽然代码看起来正确,但如果在设置侦听器块之前发生错误,则可能未设置按钮单击侦听器。将您的代码包装在错误陷阱中以确定是否发生错误。这也是一种很好的编码习惯——尤其是在访问外部资源时。

      也可能是被调用的方法出错了,没有完成任务。你也应该在那个过程中设置一个陷阱。

      【讨论】:

        【解决方案4】:

        对不起,我的英语不好。

        实际上,您可以通过 StackTrace 获取当前方法的名称。

        这是一个示例:

        public class Test {
        
         public static void main(String args[]) {
            trace(Thread.currentThread().getStackTrace());
            new Test().doit();
            trace(Thread.currentThread().getStackTrace());
         }
        
         public void doit() {
            trace(Thread.currentThread().getStackTrace());
            doitagain();
         }
        
         public void doitagain() {
            trace(Thread.currentThread().getStackTrace());
         }
        
         public static void trace(StackTraceElement e[]) {
           boolean doNext = false;
           for (StackTraceElement s : e) {
               if (doNext) {
                  System.out.println(s.getMethodName());
                  return;
               }
               doNext = s.getMethodName().equals("getStackTrace");
           }
         }
        
        }
        

        我忘了提到这种方法可能不适用于所有情况。

        【讨论】:

          【解决方案5】:

          我想我迟到了,但它可能会帮助其他人。

          您不能在主线程上执行网络操作。您的代码以系统引发的NetworkOnMainThreadException 静默失败。如果您运行此代码并检查应用程序的 LogCat 输出,您会注意到异常。

          解决方案是在工作线程上进行网络操作。在此用例中,您可以使用 AsyncTask

          【讨论】:

            猜你喜欢
            • 2021-12-21
            • 2020-01-18
            • 2012-01-09
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2018-02-06
            相关资源
            最近更新 更多