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

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

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

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

Kotlin

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

Q&A

解決済

1回答

1586閲覧

APIから取得した今日、明日の天気をAlertDialogに表示させたい

yu9718s

総合スコア9

Android

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

Kotlin

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

0グッド

0クリップ

投稿2020/06/02 01:36

編集2020/06/03 01:19
APIから取得した今日、明日の天気をAlertDialogに表示させたいのですが、 下記のコードを入力したところシュミレーターにfalseとdialogで表示されました。 エラーが起きていないので修正すべき箇所がわからないのですが、このような場合はどこを見直すべきでしょうか。
import android.annotation.SuppressLint import android.os.AsyncTask import androidx.appcompat.app.AppCompatActivity import android.os.Bundle import android.util.Log import org.json.JSONObject import java.io.BufferedReader import java.io.InputStream import java.io.InputStreamReader import java.net.HttpURLConnection import java.net.URL @Suppress("NULLABILITY_MISMATCH_BASED_ON_JAVA_ANNOTATIONS") class MainActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) Log.i("MainActivity", "onCreate") val receiver = WeatherInfoReceiver() receiver.execute("130010") } @SuppressLint("StaticFieldLeak") private inner class WeatherInfoReceiver(): AsyncTask<String, String, String>() { override fun doInBackground(vararg params: String?): String { Log.i("MainActivity", "doInBackground") val id = params[0] val urlStr = "http://weather.livedoor.com/forecast/webservice/json/v1?city=${id}" val url = URL(urlStr) val con = url.openConnection() as HttpURLConnection con.requestMethod = "GET" con.connect() val stream = con.inputStream val result = is2String(stream) con.disconnect() stream.close() return result } override fun onPostExecute(result: String?) { Log.i("MainActivity", "onPostExecute") val rootJSON = JSONObject(result) val forecasts = rootJSON.getJSONArray("forecasts") for (i in 0..1) { val forecastsNow = forecasts.getJSONObject(i) Log.i("MainActivity", "$i") val telop = forecastsNow.getString("telop") Log.i("MainActivity", "telop:$telop") //val text1 = findViewById<TextView>(R.id.text1) //text1.text = telop val dialogFragment = TestDialogFragment() val args = Bundle() args.putString("telop", telop) dialogFragment.arguments = args dialogFragment.show(supportFragmentManager, "TestDialogFragment") } } } private fun is2String(stream: InputStream): String { Log.i("MainActivity", "is2String") val sb = StringBuilder() val reader = BufferedReader(InputStreamReader(stream, "UTF-8")) var line = reader.readLine() while (line != null) { sb.append(line) line = reader.readLine() } reader.close() return sb.toString() } }
import android.app.AlertDialog import android.app.Dialog import android.os.Bundle import android.util.Log import androidx.fragment.app.DialogFragment class TestDialogFragment : DialogFragment() { override fun onCreateDialog(savedInstanceState: Bundle?): Dialog { Log.i("MainActivity", "onCreateDialog") val builder = AlertDialog.Builder(activity) val telop = arguments?.getString("telop") return builder.create() } }
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent"> <TextView android:id="@+id/text1" android:layout_width="wrap_content" android:layout_height="wrap_content" /> </LinearLayout>

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

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

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

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

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

nakasho_dev

2020/06/02 03:42

質問するときのヒント( https://teratail.com/help/question-tips )をよく読んで質問内容を整理しましょう。 ログ出力処理を各所に仕込んでいるようですが、どこまでが想定通りでどこからが想定外か整理できますか?
yu9718s

2020/06/02 04:02

ご指摘ありがとうございます。 現在ログを仕込んでいることもあり、APIから天気を取得するところまでは理解、確認ができております。 あとはダイアログに表示するだけだと考えonCreateDialogの中にbuilder.setMessage(R.id.text1)を書いてみたのですが、 それではうまくいきませんでした。 そのためAPIから欲しい情報を引っ張ってこれた点までは想定内でしたが、 そこから先ダイアログに表示する点が想定外と整理いたしました。
guest

回答1

0

ベストアンサー

今のコードを見ると、TestDialogFragmentのonCreateDialog()で、非同期処理の結果が出るまで待たせようとしているように見受けられますが、それは無理があります。考え方を逆にして、非同期処理の結果が出てからTestDialogFragmentを呼び出すように設計を改める必要があるのではありませんか。

まずAsyncTaskとそれに付随する処理はそっくりMainActivity側に移動しましょう。そして、MainActivityでは

kotlin

1 override fun onCreate(savedInstanceState: Bundle?) { 2 super.onCreate(savedInstanceState) 3 setContentView(R.layout.activity_main) 4 5 val receiver = WeatherInfoReceiver() 6 receiver.execute("130010") 7 } 8

のようにして非同期処理を走らせて、その結果を得られたonPostExecute()の末尾で、TestDialogFragmentを生成してshow()すればいいのでは。その際、取得した天気は、

kotlin

1 val dialogFragment = TestDialogFragment() 2 val args = Bundle() 3 args.putString("telop", telop) 4 dialogFragment.arguments = args 5 dialogFragment.show(supportFragmentManager, "TestDialogFragment") 6

のようにargumentsにセットすれば、TestDialogFragment側では

kotlin

1 val telop = arguments?.getString("telop")

のようにして受け取れるでしょう。

投稿2020/06/02 09:41

編集2020/06/02 09:42
keicha_hrs

総合スコア6768

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

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

yu9718s

2020/06/03 01:27

ご回答ありがとうございます。 ご指摘いただいた内容を書いてみましたが、 天気がダイアログではなく、元の画面に表示されました。 そのため下記の2文をコメントアウトしました。 val text1 = findViewById<TextView>(R.id.text1) text1.text = telop こちらの質問コードをいただいた内容をもとに修正いたしました。 お忙しいところ恐れ入りますが、、ご回答いただいた内容で私が間違った認識をしている箇所はないかご確認お願い申し上げます。
keicha_hrs

2020/06/03 06:59

TestDialogFragmentで val telop = arguments?.getString("telop") builder.setMessage(telop) のように、受け取った文字列をsetMessageで設定しないとダイアログが出てこないでしょう。
yu9718s

2020/06/03 08:58

ありがとうございます。 解決いたしました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問