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

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

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

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

Android Studio

Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

Kotlin

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

Q&A

解決済

1回答

696閲覧

jsonデータクラスの扱いがわからない

mokimokio

総合スコア53

Android

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

Android Studio

Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

Kotlin

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

0グッド

0クリップ

投稿2022/05/24 02:34

kotlinでアンドロイドスタジオを使ってアプリ開発の勉強しています。

php APIにAndroidアプリから値を送信して
返ってきたAPIのjsonデータの一つの値をアンドロイド画面のtextviewに表示させたいと思っているのですがかないません。
ちなみにtextviewに表示させたい値は"kind"の1つめ。『文化遺産』です。

どなたかご教授よろしくお願いいたします。

Post.kt

1 2data class Post(val btnId: String, val id: String, val time: String, val code: String)

sample.kt

1class sample : ArrayList<sampleItem>()

sampleItem.kt

1data class sampleItem( 2 val description: String, 3 val imageName: String, 4 val kind: String, 5 val name: String 6)

MyService.kt

1 2import retrofit2.Call 3import retrofit2.http.Body 4import retrofit2.http.POST 5 6interface MyService { 7 @POST("posts") 8 fun post(@Body post: Post): Call<sample> 9} 10

MainActivity.kt

1 2class MainActivity : AppCompatActivity() { 3 4 5 private val retrofit = Retrofit.Builder().apply { 6 baseUrl("https://~~~~~~~~~~~~~~~~~/sample.php/") 7 addConverterFactory(GsonConverterFactory.create()) 8 }.build() 9 private val service = retrofit.create(MyService::class.java) 10 11 12 13 override fun onCreate(savedInstanceState: Bundle?) { 14 super.onCreate(savedInstanceState) 15 setContentView(R.layout.activity_activity_main) 16 17 18 val logu : TextView = findViewById(R.id.logu) 19 20 //ボタンを押した時の処理 21 val btn : Button = findViewById(R.id.btn) 22 btn.setOnClickListener { 23 24 val data = Post(btnId = "inBtn", id = "1111", time = "12:34" , code = "22") 25 service.post(data).enqueue( 26 object : Callback<sample> { 27 override fun onResponse(call: Call<sample>, response: Response<sample>) { 28 Toast.makeText(this@MainActivity, "通信完了", Toast.LENGTH_SHORT).show() 29 runOnUiThread { 30 logu.setText(response.body()?.⭐️なんと書けば呼び出せるのかわからない⭐️) 31 } 32 } 33 override fun onFailure(call: Call<Result>, t: Throwable) { 34 Toast.makeText(this@dakoku_page, "通信エラー", Toast.LENGTH_SHORT).show() 35 Log.e("TEST", "通信エラー", t) 36 } 37 }) 38 39 } 40 } 41}

sample.php

1<?php 2// 文字化け対策 3$options = array(PDO::MYSQL_ATTR_INIT_COMMAND=>"SET CHARACTER SET 'utf8'"); 4 5// PHPのエラーを表示するように設定 6error_reporting(E_ALL & ~E_NOTICE); 7 8$json = file_get_contents('php://input'); 9$data = json_decode($json, true); 10 11if ($data["btnId"] == "inBtn") { 12 13if ($data["time"] == "12:34" && $data["id"] == "1111" && $data["code"] == "22") { 14print'['; 15print'{'; 16print'"name": "アンコール・ワット",'; 17print'"imageName": "angkor",'; 18print'"description": "アンコール・ワットは、カンボジア北西部に位置するユネスコの世界遺産であるアンコール遺跡の一つであり、その遺跡群を代表する寺院。ヒンドゥー教寺院として作られたが、16世紀後半に仏教寺院に改修され、現在も上座部仏教寺院となっている。",'; 19print'"kind": "文化遺産"'; 20print'},'; 21print'{'; 22print'"name": "ホースシューベンド",'; 23print'"imageName": "horseshoebend",'; 24print'"description": "ホースシューベンド(Horseshoe Bend)とは、アメリカ合衆国アリゾナ州ページの町付近にある、コロラド川が蹄鉄(horseshoe)の形に穿入蛇行している場所の名前である。グレンキャニオンダムとパウエル湖から少し下流、ページの南約6キロメートルに位置している。国道89号線から1.2キロメートル歩くとたどり着ける。",'; 25print'"kind": "自然・公園"'; 26print'}'; 27print']'; 28 29} 30

jsonの中身を見やすく

1[ 2 { 3 "name": "アンコール・ワット", 4 "imageName": "angkor", 5 "description": "アンコール・ワットは、カンボジア北西部に位置するユネスコの世界遺産であるアンコール遺跡の一つであり、その遺跡群を代表する寺院。ヒンドゥー教寺院として作られたが、16世紀後半に仏教寺院に改修され、現在も上座部仏教寺院となっている。", 6 "kind": "文化遺産" 7 }, 8 { 9 "name": "ホースシューベンド", 10 "imageName": "horseshoebend", 11 "description": "ホースシューベンド(Horseshoe Bend)とは、アメリカ合衆国アリゾナ州ページの町付近にある、コロラド川が蹄鉄(horseshoe)の形に穿入蛇行している場所の名前である。グレンキャニオンダムとパウエル湖から少し下流、ページの南約6キロメートルに位置している。国道89号線から1.2キロメートル歩くとたどり着ける。", 12 "kind": "自然・公園" 13 } 14] 15

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

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

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

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

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

guest

回答1

0

ベストアンサー

Retrofit の接続先の設定ですが、例えば https://example.com/sample.php なら、次のようにするのが一般的かと。

MainActivity.kt

kt

1 private val retrofit = Retrofit.Builder() 2 .baseUrl("https://example.com/") // ファイル名 (sample.php) の前まで 3 .addConverterFactory(GsonConverterFactory.create()) 4 .build()

MyService.kt

kt

1interface MyService { 2 @POST("sample.php") // ファイル名 (sample.php) はここに 3 fun post(@Body post: Post): Call<sample> 4}

また、サーバーを localhost で動かす場合、以下の変更が必要です。

  • PC の IP アドレス (エミュレータなら 10.0.2.2 でも可) を指定
  • http の場合、AndroidManifest に android:usesCleartextTraffic="true" を追加

そして、データの受け取り方ですが、response が Response<sample> 型の場合、response.body() は sample? になるようです。ので、こんな感じでしょうか。

kt

1 logu.text = response.body()!![0].kind 2 3 // または 4 val body = response.body() 5 if (body != null && body.size > 0) { 6 logu.text = body[0].kind 7 }

投稿2022/05/24 07:02

hoshi-takanori

総合スコア7895

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

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

mokimokio

2022/05/24 07:56

無事に想定通りのことが叶いました! 他のところまでご意見していただきありがとうございます😁
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問