2016-05-09 22 views
0

私のアプリのサイドメニューに通貨コンバータを追加したいと思います。しかし、私はclick()後の変換を取得することができません。 クリックして "計算"私は変換を取得していません。 私がクリックできない理由コードをご覧ください。私はyahoo apiを使用しました。OnClick()は通貨コンバータでは機能していません。

CurrencyConverter.java

import android.app.Fragment; 
import android.os.AsyncTask; 
import android.os.Bundle; 
import android.os.Handler; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.AdapterView; 
import android.widget.ArrayAdapter; 
import android.widget.Button; 
import android.widget.Spinner; 
import android.widget.TextView; 
import android.widget.Toast; 

import org.apache.http.HttpEntity; 
import org.apache.http.HttpResponse; 
import org.apache.http.client.ClientProtocolException; 
import org.apache.http.client.HttpClient; 
import org.apache.http.client.methods.HttpGet; 
import org.apache.http.impl.client.DefaultHttpClient; 
import org.json.JSONException; 
import org.json.JSONObject; 

import java.io.BufferedReader; 
import java.io.IOException; 
import java.io.InputStream; 
import java.io.InputStreamReader; 

import info.androidhive.customlistviewvolley.R; 


public class CurrencyConverter extends Fragment { 
    public CurrencyConverter() { 
    } 
    TextView t; 
    public int to; 
    public int from; 
    public String[] val; 
    public String s; 
    public Handler handler; 


    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
          Bundle savedInstanceState) { 


     View rootView = inflater.inflate(R.layout.currency_converter, container, false); 
     t= (TextView) rootView.findViewById(R.id.textView4); 
     Spinner s1 = (Spinner) rootView.findViewById(R.id.spinner1); 
     Spinner s2 = (Spinner) rootView.findViewById(R.id.spinner2); 
     ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(
       this.getActivity(), R.array.name, android.R.layout.simple_spinner_item); 
     adapter.setDropDownViewResource(android.R.layout.select_dialog_singlechoice); 
     val = getResources().getStringArray(R.array.value); 
     s1.setAdapter(adapter); 
     s2.setAdapter(adapter); 
     s1.setOnItemSelectedListener(new spinOne(1)); 
     s2.setOnItemSelectedListener(new spinOne(2)); 

     Button b = (Button) rootView.findViewById(R.id.button1); 
     b.setOnClickListener(new View.OnClickListener() { 
      public void onClick(View rootView) { 


//t.setText(exResult); 
       if (from == to) { 
        Toast.makeText(getActivity().getApplicationContext(), "Invalid", 4000).show(); 
       } else { 
        try { 
         // s = getJson("http://query.yahooapis.com/v1/public/yql?q=select%20*%20from%20yahoo.finance.xchange%20where%20pair%20in%20(%22"+val[from]+val[to]+"%22)&format=json&diagnostics=true&env=store%3A%2F%2Fdatatables.org%2Falltableswithkeys&callback="); 
         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(); 
        } 
       } 
      } 




     }); 
     return rootView; 
    } 

    public class calculate extends AsyncTask<String, String, String> { 
     @Override 
     protected void onPreExecute() { 
      super.onPreExecute(); 

     } 

     @Override 
     protected String doInBackground(String... args) { 

      try { 

       s = getJson("http://query.yahooapis.com/v1/public/yql?q=select%20*%20from%20yahoo.finance.xchange%20where%20pair%20in%20(%22"+val[from]+val[to]+"%22)&format=json&diagnostics=true&env=store%3A%2F%2Fdatatables.org%2Falltableswithkeys&callback="); 
       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(); 
      } 
      return s; 

     } 

     @Override 
     protected void onPostExecute(String exResult) { 
      // t = (TextView) rootView.findViewById(R.id.textView4); 
     // t.setText(exResult); 
     } 

     } 

    public String getJson(String url)throws ClientProtocolException, IOException { 

     StringBuilder build = new StringBuilder(); 
     HttpClient client = new DefaultHttpClient(); 
     HttpGet httpGet = new HttpGet(url); 
     HttpResponse response = client.execute(httpGet); 
     HttpEntity entity = response.getEntity(); 
     InputStream content = entity.getContent(); 
     BufferedReader reader = new BufferedReader(new InputStreamReader(content)); 
     String con; 
     while ((con = reader.readLine()) != null) { 
      build.append(con); 
     } 
     return build.toString(); 
    } 

     public class spinOne implements AdapterView.OnItemSelectedListener 
     { 
      int ide; 
      spinOne(int i) 
      { 
       ide =i; 
      } 
      public void onItemSelected(AdapterView<?> parent, View view, 
             int index, long id) { 
       if(ide == 1) 
        from = index; 
       else if(ide == 2) 
        to = index; 

      } 

      public void onNothingSelected(AdapterView<?> arg0) { 
       // TODO Auto-generated method stub 
      } 

    } 
} 

CurrencyConverter.xml

<?xml version="1.0" encoding="utf-8"?> 
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:background="#FFFFFF" 
    > 
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:orientation="vertical" 
     android:background="#FFFFFF"> 

     <TextView 
      android:id="@+id/textView1" 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      android:text="@string/one" 
      android:textAppearance="?android:attr/textAppearanceLarge" /> 

     <Spinner 
      android:id="@+id/spinner1" 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" /> 

     <TextView 
      android:id="@+id/textView2" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:text="@string/in" 
      android:textAppearance="?android:attr/textAppearanceLarge" /> 

     <Spinner 
      android:id="@+id/spinner2" 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" /> 

     <TextView 
      android:id="@+id/textView3" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:text="@string/equal" 
      android:textAppearance="?android:attr/textAppearanceLarge" /> 




     <RelativeLayout 
      android:id="@+id/relativeLayout1" 
      android:layout_width="match_parent" 
      android:layout_height="122dp" 
      android:gravity="center" 
      android:background="#ffffff"> 



      <RelativeLayout 
       android:id="@+id/relativeLayout2" 
       android:layout_width="match_parent" 
       android:layout_height="120dp" 
       android:gravity="center" 
       android:background="#ffffff"> 
       <TextView 
        android:id="@+id/textView4" 
        android:layout_width="wrap_content" 
        android:layout_height="wrap_content" 
        android:layout_alignParentLeft="true" 
        android:layout_alignParentTop="true" 
        android:text="@string/result" 
        android:textSize="35dp" 
        /> 
      </RelativeLayout> 



     </RelativeLayout> 

     <Button 
      android:id="@+id/button1" 
      android:layout_marginTop="10dp" 
      android:layout_width="fill_parent" 
      android:layout_height="wrap_content" 
      android:text="@string/calculate" /> 
    </LinearLayout> 
</ScrollView> 

image of main menu & after click currency converter

エラー:

05-09 17:33:30.425 2238-2238/? E/AndroidRuntime: FATAL EXCEPTION: main 
               Process: info.androidhive.customlistviewvolley, PID: 2238 
               java.lang.NullPointerException: Attempt to invoke virtual method 'int java.lang.String.length()' on a null object reference 
                at org.json.JSONTokener.nextCleanInternal(JSONTokener.java:116) 
                at org.json.JSONTokener.nextValue(JSONTokener.java:94) 
                at org.json.JSONObject.<init>(JSONObject.java:156) 
                at org.json.JSONObject.<init>(JSONObject.java:173) 
                at info.androidhive.customlistviewvolley.model.CurrencyConverter$1.onClick(CurrencyConverter.java:74) 
                at android.view.View.performClick(View.java:4756) 
                at android.view.View$PerformClick.run(View.java:19749) 
                at android.os.Handler.handleCallback(Handler.java:739) 
                at android.os.Handler.dispatchMessage(Handler.java:95) 
                at android.os.Looper.loop(Looper.java:135) 
                at android.app.ActivityThread.main(ActivityThread.java:5221) 
                at java.lang.reflect.Method.invoke(Native Method) 
                at java.lang.reflect.Method.invoke(Method.java:372) 
                at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:899) 
                at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694) 
05-09 17:33:30.430 1233-1513/? W/ActivityManager: Force finishing activity info.androidhive.customlistviewvolley/.MainActivity 

答えて

0

更新回答:

CurreencyConverter.java

import android.app.Fragment; 
import android.os.AsyncTask; 
import android.os.Bundle; 
import android.os.Handler; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.AdapterView; 
import android.widget.ArrayAdapter; 
import android.widget.Button; 
import android.widget.Spinner; 
import android.widget.TextView; 
import android.widget.Toast; 

import org.apache.http.HttpEntity; 
import org.apache.http.HttpResponse; 
import org.apache.http.client.ClientProtocolException; 
import org.apache.http.client.HttpClient; 
import org.apache.http.client.methods.HttpGet; 
import org.apache.http.impl.client.DefaultHttpClient; 
import org.json.JSONException; 
import org.json.JSONObject; 

import java.io.BufferedReader; 
import java.io.IOException; 
import java.io.InputStream; 
import java.io.InputStreamReader; 

import info.androidhive.customlistviewvolley.R; 


public class CurrencyConverter extends Fragment { 
    public CurrencyConverter() { 
    } 
    TextView t; 
    public int to; 
    public int from; 
    public String[] val; 
    public String s; 
    String exResult; 
    public Handler handler; 


    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
          Bundle savedInstanceState) { 


     View rootView = inflater.inflate(R.layout.currency_converter, container, false); 
     t= (TextView) rootView.findViewById(R.id.textView4); 
     Spinner s1 = (Spinner) rootView.findViewById(R.id.spinner1); 
     Spinner s2 = (Spinner) rootView.findViewById(R.id.spinner2); 
     ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(
       this.getActivity(), R.array.name, android.R.layout.simple_spinner_item); 
     adapter.setDropDownViewResource(android.R.layout.select_dialog_singlechoice); 
     val = getResources().getStringArray(R.array.value); 
     s1.setAdapter(adapter); 
     s2.setAdapter(adapter); 
     s1.setOnItemSelectedListener(new spinOne(1)); 
     s2.setOnItemSelectedListener(new spinOne(2)); 

     Button b = (Button) rootView.findViewById(R.id.button1); 
     b.setOnClickListener(new View.OnClickListener() { 
      public void onClick(View View) { 



       if (from == to) { 
        Toast.makeText(getActivity().getApplicationContext(), "Invalid", 4000).show(); 
       } else { 
        new calculate().execute(); 

       } 
      } 

     }); 
     return rootView; 
    } 

    public class calculate extends AsyncTask<String, String, String> { 
     @Override 
     protected void onPreExecute() { 
      super.onPreExecute(); 

     } 

     @Override 
     protected String doInBackground(String... args) { 

      try { 

       s = getJson("http://query.yahooapis.com/v1/public/yql?q=select%20*%20from%20yahoo.finance.xchange%20where%20pair%20in%20(%22"+val[from]+val[to]+"%22)&format=json&diagnostics=true&env=store%3A%2F%2Fdatatables.org%2Falltableswithkeys&callback="); 
       JSONObject jObj; 
       jObj = new JSONObject(s); 
       exResult = jObj.getJSONObject("query").getJSONObject("results").getJSONObject("rate").getString("Rate"); 


      } 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(); 
      } 
      return exResult; 

     } 
     @Override 
     protected void onPostExecute(String exResult) { 

      t.setText(exResult); 
     } 



     } 

    public String getJson(String url)throws IOException { 

     StringBuilder build = new StringBuilder(); 
     HttpClient client = new DefaultHttpClient(); 
     HttpGet httpGet = new HttpGet(url); 
     HttpResponse response = client.execute(httpGet); 
     HttpEntity entity = response.getEntity(); 
     InputStream content = entity.getContent(); 
     BufferedReader reader = new BufferedReader(new InputStreamReader(content)); 
     String con; 
     while ((con = reader.readLine()) != null) { 
      build.append(con); 
     } 
     return build.toString(); 
    } 

     public class spinOne implements AdapterView.OnItemSelectedListener 
     { 
      int ide; 
      spinOne(int i) 
      { 
       ide =i; 
      } 
      public void onItemSelected(AdapterView<?> parent, View view, 
             int index, long id) { 
       if(ide == 1) 
        from = index; 
       else if(ide == 2) 
        to = index; 

      } 

      public void onNothingSelected(AdapterView<?> arg0) { 
       // TODO Auto-generated method stub 
      } 

    } 
} 
1

接続していないUIスレッドからStringを呼び出そうとしています。考えられる回避策の1つとして、グローバル変数を作成してそれに割り当てることができます。

@Override 
     protected void onPostExecute(String exResult) { 
      // t = (TextView) rootView.findViewById(R.id.textView4); 
     // t.setText(exResult); 
      globalString = exResult; 
     } 

その後、このコードを使用することができます。ライフサイクルはAsyncTaskAndroid Threadsをお読みください。

+0

は私が間違っているつもりのコードを投稿してください取得できませんでした。 – Neeraj

+0

はゼロから始めることができます。まず、jObj =新しいJSONObject(s)。 この行は、初期化されていない変数を参照しています。 –

+0

はい、あなたは正しいですが、doInBackground()のonClick()をコールする必要がありますか教えてください。 – Neeraj

関連する問題