2016-10-09 15 views
0

現在、場所の画面を持つアプリケーションを作成すると、地図マーカーが押されるとAlertDialogがポップアップして情報が表示されます。 AlertDialogのアイコンをURLからのその場所に関連付けられたイメージに設定したいとします。ローカルに保存するイメージの場所が多すぎます。(Android App)URLからダウンロードした画像としてAlertDialog .setIcon()を設定しようとしています

public Drawable pGraphic = null; 

public class LoadImageFromWeb extends AsyncTask<String, Void, Drawable> { 
    protected Drawable doInBackground(String... urls) { 


     try { 
      InputStream is = (InputStream) new URL(urls[0]).getContent(); 

      Drawable d = Drawable.createFromStream(is, "src name"); 
      BT_debugger.showIt(d.toString()); 
      return d; 
     } catch (Exception e) { 
      BT_debugger.showIt(e.toString()); 
      return null; 
     } 

    } 
    protected void onPostExecute(Drawable result) { 
     BT_debugger.showIt("Image Loaded"); 
     pGraphic = result; 


    } 
} 
//handleMarkerClick.. 
public void handleMarkerClick(final int markerIndex) { 

    BT_debugger.showIt(fragmentName + ":handleMarkerClick"); 

    //vars used in callout bubble... 
    BT_item tappedItem = null; 
    String latitude = ""; 
    String longitude = ""; 
    String title = ""; 
    String subTitle = ""; 
    String loadScreenWithItemId = ""; 
    String loadScreenWithNickname = ""; 
    String calloutTapChoice = ""; 
    Drawable pinGraphic = null; 

    //if marker index == -1 then the user tapped the device's location icon... 
    if(markerIndex == -1){ 
     BT_debugger.showIt(fragmentName + ":handleMarkerClick. Device location tapped"); 

     //use the graphic for the device location... 
     pinGraphic = getResources().getDrawable(R.drawable.bt_screen_map_marker_device); 

     //latitude/longitude is current location or last saved location... 
     if(mapView.isMyLocationEnabled()){ 

      Location deviceLoc = mapView.getMyLocation(); 
      latitude = String.valueOf(deviceLoc.getLatitude()); 
      longitude = String.valueOf(deviceLoc.getLongitude()); 

      //title, subTitle... 
      title = pokegoaus_appDelegate.rootApp.getRootDevice().getDeviceModel(); 
      subTitle = getString(R.string.mapUserLocationDescription) + "\nLatitude: " + latitude + "\nLongitude: " + longitude; 

     }else{ 

      //latitude/longitude is last current saved... 
      latitude = goaus_appDelegate.rootApp.getRootDevice().getDeviceLatitude(); 
      longitude = goaus_appDelegate.rootApp.getRootDevice().getDeviceLongitude(); 

      //title, subTitle... 
      title = goaus_appDelegate.rootApp.getRootDevice().getDeviceModel(); 
      subTitle = getString(R.string.mapUserLocationDescription) + "\nLatitude: " + latitude + "\nLongitude: " + longitude; 

     }//isMyLocationEnabled... 

    }else{ 

     //get the BT_item at this index... 
     tappedItem = childItems.get(markerIndex); 
     latitude = BT_strings.getJsonPropertyValue(tappedItem.getJsonObject(), "latitude", ""); 
     longitude = BT_strings.getJsonPropertyValue(tappedItem.getJsonObject(), "longitude", ""); 
     title = BT_strings.getJsonPropertyValue(tappedItem.getJsonObject(), "title", ""); 
     subTitle = BT_strings.getJsonPropertyValue(tappedItem.getJsonObject(), "subTitle", ""); 
     loadScreenWithItemId = BT_strings.getJsonPropertyValue(tappedItem.getJsonObject(), "loadScreenWithItemId", ""); 
     loadScreenWithNickname = BT_strings.getJsonPropertyValue(tappedItem.getJsonObject(), "loadScreenWithNickname", ""); 
     calloutTapChoice = BT_strings.getJsonPropertyValue(tappedItem.getJsonObject(), "calloutTapChoice", ""); 


     String pinColor = BT_strings.getJsonPropertyValue(tappedItem.getJsonObject(), "pinColor", "red"); 
     String locationImage = BT_strings.getJsonPropertyValue(tappedItem.getJsonObject(), "locationImage", ""); 
     new LoadImageFromWeb().execute("http://pheds.com.au/example1.png"); 


     BT_debugger.showIt(fragmentName + ":handleMarkerClick. Tapped: \"" + title + "\""); 

    }//not the device's location... 

    //are we showing the details button on this locations pup-up bubble? 
    boolean showDetailsButton = false; 
    if(loadScreenWithItemId.length() > 1 || loadScreenWithNickname.length() > 1){ 
     showDetailsButton = true; 
    } 

    //if we are showing directions we are not showing details bubble... 
    if(loadScreenWithItemId.equalsIgnoreCase("showDirections")){ 
     showDetailsButton = false; 
    } 

    //if we did not find load screen from id or nickname, look for a load sceen object... 
    if(!showDetailsButton){ 
     try{ 
      if(tappedItem != null){ 
       JSONObject obj = tappedItem.getJsonObject(); 
       if(obj.has("loadScreenObject")){ 
        showDetailsButton = true; 
       } 
      } 
     }catch(Exception e){ 
      showDetailsButton = false; 
     } 
    } 
    pinGraphic = pGraphic; 
    final AlertDialog myAlert = new AlertDialog.Builder(this.getActivity()).create(); 
    myAlert.setTitle(title); 
    myAlert.setMessage(subTitle); 
    myAlert.setIcon(pinGraphic); 
    myAlert.setCancelable(false); 
    myAlert.setButton2(getString(R.string.ok), new DialogInterface.OnClickListener() { 
      public void onClick(DialogInterface dialog, int which) { 
      myAlert.dismiss(); 
     } }); 

    //do we show details button? 
    if(showDetailsButton){ 
     myAlert.setButton(getString(R.string.details), new DialogInterface.OnClickListener() { 
       public void onClick(DialogInterface dialog, int which) { 
       myAlert.dismiss(); 
       showDetailsScreen(markerIndex); 
     } }); 
    } 

    //do we show the driving directions button? 
    if(loadScreenWithItemId.equalsIgnoreCase("showDirections") || calloutTapChoice.equalsIgnoreCase("showDirections")){ 
     myAlert.setButton(getString(R.string.mapDrivingDirections), new DialogInterface.OnClickListener() { 
       public void onClick(DialogInterface dialog, int which) { 
       myAlert.dismiss(); 
       showDirections(markerIndex); 
     } }); 
    } 

    //show... 
    myAlert.show(); 

} 

画像がダウンロードされているようです。しかし、私はダウンロードしたイメージをどのように扱い、私のAlertDialogで使用するのかは不明です。 LoadImageFromWebがAsyncTaskクラスであるため、結果をDrawableとして使用する方法がわかりません。事前に

おかげ

Kristanホールズ

無原罪のアプリを

答えて

1

あなたがダウンロードするDrawableのを待っていないように思えます。すぐにAlertDialogのアイコンとして設定します。

ウェブから画像をダウンロードして表示するには、Glideを使用する方がよいでしょう。標準的なAsyncTaskよりずっと効率的で使いやすいです。 は、ここでは、グライドでそれを行うだろう方法です -

Glide.with(this) 
    .load("http://pheds.com.au/example1.png") 
    .into(new SimpleTarget<GlideDrawable>(drawableWidth, drawableHeight) { 
     @Override 
     public void onResourceReady(GlideDrawable resource, GlideAnimation<? super GlideDrawable> glideAnimation) { 
      myAlert.setIcon(resource); 
     } 
    }); 

編集: インポート以下 - このような

import com.bumptech.glide.Glide; 
import com.bumptech.glide.load.resource.drawable.GlideDrawable; 
import com.bumptech.glide.request.animation.GlideAnimation; 
import com.bumptech.glide.request.target.SimpleTarget; 
+0

は、アイブ氏は、グライドのreadmeの指示に従いました。 ive added –

+0

compile 'com.github.bumptech.glide:glide:3.7.0' 'com.android.support:support-v4:24.2.1'と同期プロジェクトをコンパイルします。私のプロジェクトにコードを追加し、シンボル「Glide」を解決できません。 。私はインポートグライドを追加することについて何も見ません。 。その欠けていると思っています –

+0

私は必要な輸入品で私の答えを編集しました。 – Tofira

0

まず使用setFeatureDrawable(int型FEATUREID、Drawableの描画可能):

Dialog dialog = new Dialog(context); 
dialog.requestWindowFeature(Window.FEATURE_LEFT_ICON); 
dialog.setFeatureDrawable(Window.FEATURE_LEFT_ICON, drawableFromUrl(YOUR_URL)); 
dialog.setContentView(R.layout.custom_dialog); 
dialog.setTitle("Dialog Title"); 
dialog.show(); 

イメージを取得するには、これを使用してください(https://stackoverflow.com/a/9490060/4198633):

public static Drawable drawableFromUrl(String url) throws IOException { 
    Bitmap x; 

    HttpURLConnection connection = (HttpURLConnection) new URL(url).openConnection(); 
    connection.connect(); 
    InputStream input = connection.getInputStream(); 

    x = BitmapFactory.decodeStream(input); 
    return new BitmapDrawable(x); 
} 

そして、あなたはもちろん、これが必要になります:

<uses-permission android:name="android.permission.INTERNET" /> 
関連する問題