質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Kotlin

Kotlinは、ジェットブレインズ社のアンドリー・ブレスラフ、ドミトリー・ジェメロフが開発した、 静的型付けのオブジェクト指向プログラミング言語です。

Q&A

解決済

1回答

1389閲覧

Webから画像をダウンロードし、BottomNavigationViewのMenuItemのアイコンに設定したい

hatahata-tt

総合スコア5

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Kotlin

Kotlinは、ジェットブレインズ社のアンドリー・ブレスラフ、ドミトリー・ジェメロフが開発した、 静的型付けのオブジェクト指向プログラミング言語です。

0グッド

0クリップ

投稿2020/04/09 04:11

編集2020/04/09 09:35

前提・実現したいこと

タイトルそのままになってしまいますが、picassoなどを使ってWebから画像をダウンロードし、BottomNavigationViewのMenuItemのアイコンに設定したいです。

発生している問題・エラーメッセージ

開発中のアプリをエミュレータを立ち上げて確認しようとしていますが、以下のエラーによりアプリが落ちてしまい困っています。。

2020-04-09 18:32:37.189 23279-23279/com.example.abb E/AndroidRuntime: FATAL EXCEPTION: main Process: com.example.abb, PID: 23279 java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.abb/com.example.abb.MainActivity}: java.lang.IllegalStateException: Method call should not happen from the main thread. at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3333) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3477) at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:83) at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135) at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2043) at android.os.Handler.dispatchMessage(Handler.java:106) at android.os.Looper.loop(Looper.java:216) at android.app.ActivityThread.main(ActivityThread.java:7464) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:549) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:955) Caused by: java.lang.IllegalStateException: Method call should not happen from the main thread. at com.squareup.picasso.Utils.checkNotMain(Utils.java:121) at com.squareup.picasso.RequestCreator.get(RequestCreator.java:416) at com.example.abb.MainActivity.onCreate(MainActivity.kt:28) at android.app.Activity.performCreate(Activity.java:7990) at android.app.Activity.performCreate(Activity.java:7979) at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1309) at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3308) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3477)  at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:83)  at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135)  at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95)  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2043)  at android.os.Handler.dispatchMessage(Handler.java:106)  at android.os.Looper.loop(Looper.java:216)  at android.app.ActivityThread.main(ActivityThread.java:7464)  at java.lang.reflect.Method.invoke(Native Method)  at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:549)  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:955) 

該当のソースコード

kotlin

1class MainActivity : AppCompatActivity() { 2 3 override fun onCreate(savedInstanceState: Bundle?) { 4 super.onCreate(savedInstanceState) 5 setContentView(R.layout.activity_main) 6 7 var url = "http://i.imgur.com/DvpvklR.png" 8 9 var bitmap: Bitmap = Picasso.get().load(url).get() 10 var drawable = BitmapDrawable(resources, bitmap) 11 12 val navView: BottomNavigationView = findViewById(R.id.nav_view) 13 var a: Menu = navView.menu 14 val b: MenuItem = a.findItem(R.id.navigation_home) 15 16 b.setIcon(drawable) 17 18 val navController = findNavController(R.id.nav_host_fragment) 19 // Passing each menu ID as a set of Ids because each 20 // menu should be considered as top level destinations. 21 val appBarConfiguration = AppBarConfiguration(setOf( 22 R.id.navigation_home, R.id.navigation_dashboard, R.id.navigation_notifications)) 23 setupActionBarWithNavController(navController, appBarConfiguration) 24 navView.setupWithNavController(navController) 25 } 26 27}

試したこと

非同期制御が必要なのかと思い、runBlockingを使って試してみてましたが非同期処理の基礎を理解できていなくエラーが解消できずです。

補足情報(FW/ツールのバージョンなど)

kotlin
picasso

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

jimbe

2020/04/09 05:22

> 試してみてましたがエミュレータは起動せず 部分では無く, 実行しようとされたコード全体をご提示されては如何でしょうか. また, 「エミュレータの起動」と「エミュレータで開発中のアプリの実行」とは別と思いますが, エミュレータ自身が起動しなかったのでしょうか. それともエミュレータは起動したがアプリが実行されなかった(インストールの失敗 or 実行時に例外が発生?) のでしょうか.
hatahata-tt

2020/04/09 09:37

コメントありがとうございます。 コード全体とエラーメッセージの詳細につきまして追記いたしました。 エミュレータは起動したのですがエミュレータ上で開発中のアプリを実行しようとするとエラーにより落ちてしまっていました。。
guest

回答1

0

ベストアンサー

テストコードです. Android Studio の EmptyActivity から修正しています.
コルーチンに付きましてはまだ私も扱えないため, 非同期部分に付きましては Picasso に任せてみました.
Target の弱参照によって動作が不安定な記事が多く見受けられましたので, Activity に実装しました.

Android 9 でテストしたため, AndroidManifests.xmlに
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
及び
application タグ内 android:usesCleartextTraffic="true"
を追加しています.

kotlin

1//package com.teratail.q252401 2 3import android.graphics.Bitmap 4import android.graphics.drawable.Drawable 5import androidx.appcompat.app.AppCompatActivity 6import android.os.Bundle 7import android.util.Log 8import android.widget.ImageView 9import com.squareup.picasso.Picasso 10import com.squareup.picasso.Target 11import java.lang.Exception 12 13class MainActivity : AppCompatActivity(), Target { 14 override fun onCreate(savedInstanceState: Bundle?) { 15 super.onCreate(savedInstanceState) 16 setContentView(R.layout.activity_main) 17 Picasso.get().load("http://i.imgur.com/DvpvklR.png").into(this) 18 } 19 override fun onPrepareLoad(placeHolderDrawable: Drawable?) { 20 Log.d("MainActivity","onPrepareLoad") 21 } 22 override fun onBitmapFailed(e: Exception, errorDrawable: Drawable?) { 23 Log.d("MainActivity","onBitmapFailed", e) 24 } 25 override fun onBitmapLoaded(bitmap: Bitmap, from: Picasso.LoadedFrom?) { 26 Log.d("MainActivity","onBitmapLoaded") 27 val view = findViewById<ImageView>(R.id.imageview) 28 view.setImageBitmap(bitmap) 29 } 30}

activity_main.xml

xml

1<?xml version="1.0" encoding="utf-8"?> 2<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" 3 xmlns:app="http://schemas.android.com/apk/res-auto" 4 xmlns:tools="http://schemas.android.com/tools" 5 android:layout_width="match_parent" 6 android:layout_height="match_parent" 7 tools:context=".MainActivity"> 8 9 <ImageView 10 android:id="@+id/imageview" 11 android:layout_width="wrap_content" 12 android:layout_height="wrap_content" 13 android:text="Hello World!" 14 app:layout_constraintBottom_toBottomOf="parent" 15 app:layout_constraintLeft_toLeftOf="parent" 16 app:layout_constraintRight_toRightOf="parent" 17 app:layout_constraintTop_toTopOf="parent" /> 18 19</androidx.constraintlayout.widget.ConstraintLayout>

投稿2020/04/09 11:42

編集2020/04/09 11:45
jimbe

総合スコア13209

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hatahata-tt

2020/04/10 05:14

ありがとうございます! このように実装すればよいのですね! こちら試させていただきますー!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問