2012-11-02 2 views
7

나는 안드로이드에 매우 익숙하다. 구글 맵스 나는 자동 완성 텍스트 상자에 텍스트를 입력 할 때 안드로이드에 자동 sugesstion을 표시하기 위해 다음과 같은 프로그램을 작성한다.하지만 URL에 대한 입력은 나오지만 출력은 보이지 않는다. 프로그램을 한 번보고 실수를하고있는 곳을 알려주십시오.안드로이드 : 안드로이드 장소에서 자동자가 진단 제공 Api?

ExampleApp.java 
package com.example.exampleapp; 

import java.io.IOException; 
import java.io.InputStreamReader; 
import java.net.HttpURLConnection; 
import java.net.MalformedURLException; 
import java.net.URL; 
import java.net.URLEncoder; 
import java.util.ArrayList; 

import org.json.JSONArray; 
import org.json.JSONException; 
import org.json.JSONObject; 

import android.app.Activity; 
import android.content.Context; 
import android.os.Bundle; 
import android.view.LayoutInflater.Filter; 
import android.view.View; 
import android.widget.AdapterView; 
import android.widget.AdapterView.OnItemClickListener; 
import android.widget.ArrayAdapter; 
import android.widget.AutoCompleteTextView; 

import android.widget.Filterable; 
import android.widget.Toast; 

public class ExampleApp extends Activity implements OnItemClickListener{ 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 

     AutoCompleteTextView autoCompView = (AutoCompleteTextView) findViewById(R.id.autocomplete); 
     autoCompView.setAdapter(new PlacesAutoCompleteAdapter(this, R.layout.list_item)); 
    } 

    @Override 
    public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) { 
     // TODO Auto-generated method stub 
     String str = (String) arg0.getItemAtPosition(arg2); 
     Toast.makeText(this, str, Toast.LENGTH_SHORT).show(); 
    } 


} 
class PlacesAutoCompleteAdapter extends ArrayAdapter<String> implements Filterable { 
    private ArrayList<String> resultList; 

    public PlacesAutoCompleteAdapter(Context context, int textViewResourceId) { 
     super(context, textViewResourceId); 
    } 
    private static final String PLACES_API_BASE = "https://maps.googleapis.com/maps/api/place"; 
    private static final String TYPE_AUTOCOMPLETE = "/autocomplete"; 
    private static final String OUT_JSON = "/json"; 

    private static final String API_KEY = ""; 
    @Override 
    public int getCount() { 
     return resultList.size(); 
    } 

    @Override 
    public String getItem(int index) { 
     return resultList.get(index); 
    } 

    @Override 
    public android.widget.Filter getFilter() { 
     Filter filter = new Filter() { 
      protected FilterResults performFiltering(CharSequence constraint) { 
       FilterResults filterResults = new FilterResults(); 
       if (constraint != null) { 
        // Retrieve the autocomplete results. 
        resultList = autocomplete(constraint.toString()); 

        // Assign the data to the FilterResults 
       // filterResults.values = resultList; 
        // filterResults.count = resultList.size(); 
       } 
       return filterResults; 
      } 

      private ArrayList<String> autocomplete(String input) { 
       ArrayList<String> resultList = null; 

       HttpURLConnection conn = null; 
       StringBuilder jsonResults = new StringBuilder(); 
       try { 
        StringBuilder sb = new StringBuilder(PLACES_API_BASE + TYPE_AUTOCOMPLETE + OUT_JSON); 
        sb.append("?sensor=false&key=" + API_KEY); 
        sb.append("&components=country:uk"); 
        sb.append("&input=" + URLEncoder.encode(input, "utf8")); 

        URL url = new URL(sb.toString()); 
        conn = (HttpURLConnection) url.openConnection(); 
        InputStreamReader in = new InputStreamReader(conn.getInputStream()); 

        // Load the results into a StringBuilder 
        int read; 
        char[] buff = new char[1024]; 
        while ((read = in.read(buff)) != -1) { 
         jsonResults.append(buff, 0, read); 
        } 
       } catch (MalformedURLException e) { 
        // Log.e(LOG_TAG, "Error processing Places API URL", e); 
        return resultList; 
       } catch (IOException e) { 
        //Log.e(LOG_TAG, "Error connecting to Places API", e); 
        return resultList; 
       } finally { 
        if (conn != null) { 
         conn.disconnect(); 
        } 
       } 

       try { 
        // Create a JSON object hierarchy from the results 
        JSONObject jsonObj = new JSONObject(jsonResults.toString()); 
        JSONArray predsJsonArray = jsonObj.getJSONArray("predictions"); 

        // Extract the Place descriptions from the results 
        resultList = new ArrayList<String>(predsJsonArray.length()); 
        for (int i = 0; i < predsJsonArray.length(); i++) { 
         resultList.add(predsJsonArray.getJSONObject(i).getString("description")); 
        } 
       } catch (JSONException e) { 
        // Log.e(LOG_TAG, "Cannot process JSON results", e); 
       } 

       return resultList; 
      } 
      protected void publishResults(CharSequence constraint, FilterResults results) { 
       if (results != null) { 
        notifyDataSetChanged(); 
       } 
       else { 
        notifyDataSetInvalidated(); 
       } 
      } 

      @Override 
      public boolean onLoadClass(Class arg0) { 
       // TODO Auto-generated method stub 
       return false; 
      }}; 
     return (android.widget.Filter) filter; 
    } 
} 

FilterResults.java 

package com.example.exampleapp; 

import java.util.ArrayList; 

public class FilterResults { 

    protected ArrayList<String> values; 
    protected int count; 

} 


i write the above code but the application closed .please see once and let me know where i am doing mistake in the above code ? 
Thanks in Advance.......... 
+0

어떻게 도와 드릴까요? – user1787493

+0

안녕하세요, my.problem은 해결되지 않습니다 ... 오류가 발생합니까? – ckpatel

답변

10

다음은 비슷한 문제점이있을 때 사용한 코드 조각입니다. D' nt가 전체 코드를 하나의 java 파일에 담았다는 제안을드립니다. 코드에서 사용하는 각기 다른 작업에 대해 별도의 메소드/클래스를 만듭니다. 추적을 쉽게하는 데 도움이됩니다.

여기 내 PlacesAutoCompleteAdapter.java 파일입니다.

package com.inukshk.adapter; 

import java.util.ArrayList; 

import android.content.Context; 
import android.widget.ArrayAdapter; 
import android.widget.Filter; 
import android.widget.Filterable; 

import com.inukshk.CreateInukshk.CreateInukshk; 

public class PlacesAutoCompleteAdapter extends ArrayAdapter<String> implements 
     Filterable { 
    private ArrayList<String> resultList; 

    public PlacesAutoCompleteAdapter(Context context, int textViewResourceId) { 
     super(context, textViewResourceId); 
    } 

    @Override 
    public int getCount() { 
     return resultList.size(); 
    } 

    @Override 
    public String getItem(int index) { 
     return resultList.get(index); 
    } 

    @Override 
    public Filter getFilter() { 
     Filter filter = new Filter() { 
      @Override 
      protected FilterResults performFiltering(CharSequence constraint) { 
       FilterResults filterResults = new FilterResults(); 
       if (constraint != null) { 
        // Retrieve the autocomplete results. 

        resultList = CreateInukshk.autocomplete(constraint 
          .toString()); 

        // Assign the data to the FilterResults 
        filterResults.values = resultList; 
        filterResults.count = resultList.size(); 
       } 
       return filterResults; 
      } 

      @Override 
      protected void publishResults(CharSequence constraint, 
        FilterResults results) { 
       if (results != null && results.count > 0) { 
        notifyDataSetChanged(); 
       } else { 
        notifyDataSetInvalidated(); 
       } 
      } 
     }; 
     return filter; 
    } 
} 

여기에 OnCreate() 내에서해야 할 일

여기는 앱에서 사용한 정적 문자열입니다.

private static final String PLACES_API_BASE = "https://maps.googleapis.com/maps/api/place"; 
    private static final String TYPE_AUTOCOMPLETE = "/autocomplete"; 
    private static final String OUT_JSON = "/json"; 
    private static final String API_KEY = "YOUR API KEY"; 

마지막으로 여기서는 어댑터에서 사용할 방법입니다.

public static ArrayList<String> autocomplete(String input) { 

     ArrayList<String> resultList = null; 

     HttpURLConnection conn = null; 
     StringBuilder jsonResults = new StringBuilder(); 
     try { 
      StringBuilder sb = new StringBuilder(PLACES_API_BASE 
        + TYPE_AUTOCOMPLETE + OUT_JSON); 
      sb.append("?sensor=false&key=" + API_KEY); 
      // sb.append("&components=country:uk"); 
      sb.append("&input=" + URLEncoder.encode(input, "utf8")); 

      URL url = new URL(sb.toString()); 
      conn = (HttpURLConnection) url.openConnection(); 
      InputStreamReader in = new InputStreamReader(conn.getInputStream()); 

      // Load the results into a StringBuilder 
      int read; 
      char[] buff = new char[1024]; 
      while ((read = in.read(buff)) != -1) { 
       jsonResults.append(buff, 0, read); 
      } 
     } catch (MalformedURLException e) { 
      Log.e(TAG, "Error processing Places API URL", e); 
      return resultList; 
     } catch (IOException e) { 
      Log.e(TAG, "Error connecting to Places API", e); 
      return resultList; 
     } finally { 
      if (conn != null) { 
       conn.disconnect(); 
      } 
     } 

     try { 
      // Create a JSON object hierarchy from the results 
      JSONObject jsonObj = new JSONObject(jsonResults.toString()); 
      JSONArray predsJsonArray = jsonObj.getJSONArray("predictions"); 

      // Extract the Place descriptions from the results 
      resultList = new ArrayList<String>(predsJsonArray.length()); 
      for (int i = 0; i < predsJsonArray.length(); i++) { 
       resultList.add(predsJsonArray.getJSONObject(i).getString(
         "description")); 
      } 

     } catch (JSONException e) { 
      Log.e(TAG, "Cannot process JSON results", e); 
     } 

     return resultList; 
    } 

편집 :

난 당신이 아래와 같이 list_item.xml를 지정 같아요.

<?xml version="1.0" encoding="utf-8"?> 
<TextView xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="wrap_content" android:layout_height="wrap_content" /> 

희망이 당신을 도울 것입니다.

UPDATE :

You have to manually attach the debugger while the emulator says "Waiting for debugger to attach". In Netbean's menu bar, click "Debug", then "Attach Debugger...". You have to select your package from the "Process" drop down list, and then click "Attach". That should do it. 
This works in Netbeans 7 anyway. 

또는 당신은 또한 것은 아래에 시도 할 수 있습니다.

You have two choices: connect a debugger, or kill the process. 

Looking at your logcat, you have at least two different desktop applications that are trying to connect to each application process, which is where the "Ignoring second debugger" messages are coming from. 

This would happen if you were, say, running Eclipse with the ADT plugin, and the stand-alone DDMS at the same time. I don't know what you're running or what the netbeans plugin does, but I would start by figuring out if you have two different things fighting for control. 

편집 됨 :HOW TO GET TEXT OF AutoCompleteTextView

는이 코드를 작성합니다.

autoCompView.setOnItemClickListener(new OnItemClickListener() { 

      @Override 
      public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, 
        long arg3) { 
       // TODO Auto-generated method stub 
       YOURTEXT = autoCompView.getText().toString(); 
       //new AsyncGetAutoPlace().execute(autoCompView.getText() 
       //  .toString().trim()); 
      } 
     }); 
+0

필터를 어떻게 호출 할 수 있습니까? – user1787493

+0

FilterResults 어떻게 호출 할 수 있습니까? – user1787493

+0

내가 넘겨 줄 수 있도록 sugesstion을주세요. – user1787493