2011-10-18 29 views
4
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を取得したい...もし誰かが私にそれを感謝することができますOnClickListener.onClickメソッドからメソッドを呼び出す方法は?

+2

ログメッセージやトースト通知メッセージを 'doSomething'メソッドに追加して、' doSomething'メソッドが確実に呼び出されるようにしてください。 – slayton

+0

@slaytonが言ったことは、良いテストか、単にurltext.setTextを設定しようとしていると言いました( "Hey、my click worked!");ページからのデータを取得する方法が意図したとおりに機能しない可能性があります – dymmeh

+0

urltext.setTextをテストするものに変更しますが、表示されません。 – androiddevs78

答えて

0

あなたのコードは正しいです、ちょうどあなたのための方法がないように見えるメソッドが呼ばれていることを知っている。 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() 


    } 
0

コードが正しい見えますが、エラーが設定されたリスナーのブロックの前に発生している場合は、ボタンクリックリスナーが設定され取得されないことがあります。

はこのような何かを行います。エラートラップにコードをラップして、エラーが発生しているかどうかを判断します。これはまた、特に外部リソースにアクセスするときには良いコーディング手法です。

また、呼び出されたメソッドが間違っていて、タスクを完了していない可能性があります。その手順にもトラップを入れてください。

0

私の悪い英語のために申し訳ありません。

実際には、現在のメソッドの名前を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"); 
    } 
} 

} 

私は、このアプローチは、すべての状況で動作しない場合がありますことを言及を忘れてしまいました。

3
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ステートメントで囲まれたステートメントをこれに変更します。これにより、適切なクラスがメソッドを呼び出すために参照されていることが保証されます。

0

私はパーティーに遅刻すると思いますが、他人を助けるかもしれません。

メインスレッドでネットワーク操作を実行することはできません。あなたのコードはシステムによって提起されたNetworkOnMainThreadExceptionで黙って失敗します。このコードを実行し、アプリケーションのLogCat出力をチェックすると、例外に気付くでしょう。

解決方法は、ワーカースレッドでネットワーク操作を行うことです。このユースケースではAsyncTaskを使用できます。

関連する問題