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

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

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

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

Q&A

1回答

3168閲覧

android studioでボタンが反応しない

meijin

総合スコア4

Kotlin

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

0グッド

0クリップ

投稿2020/03/10 12:17

編集2020/03/10 21:17

前提・実現したいこと

android studio のkotlinでおみくじのアプリを作りたいです。アプリ自体は起動するのですが画面のボタンが反応せず困っています。私は初心者で本を買いコードをうつしています。エラーメッセージもなく改善する場所がわかりません。
ぜひ回答よろしくお願いします

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

該当のソースコード

ソースコード package jp.wings.nikkeibp.omikuji import android.os.Bundle import android.os.PersistableBundle import android.view.View import android.view.animation.Animation import android.view.animation.AnimationSet import android.view.animation.RotateAnimation import android.view.animation.TranslateAnimation import android.widget.ImageView import kotlinx.android.synthetic.main.omikuji.* import java.util.* class OmikujiBox: Animation.AnimationListener { lateinit var omikujiView: ImageView var finish = false // 箱から出たか? val number: Int // くじ番号 (0~19の乱数) get() { var rnd = Random() return rnd.nextInt(20) } fun shake() { val translate = TranslateAnimation(0f, 0f, 0f, -200f) translate.repeatMode = Animation.REVERSE translate.repeatCount = 5 translate.duration = 100 val rotate = RotateAnimation(0f, -36f, omikujiView.width / 2f, omikujiView.height / 2f) rotate.duration = 200 val set = AnimationSet(true) set.addAnimation(rotate) set.addAnimation(translate) set.setAnimationListener(this) omikujiView.startAnimation(set) finish = true } override fun onAnimationRepeat(animation: Animation?) { } override fun onAnimationEnd(animation: Animation?) { omikujiView.setImageResource(R.drawable.omikuji2) } override fun onAnimationStart(animation: Animation?) { } ```ここに言語を入力 コード

package jp.wings.nikkeibp.omikuji

import android.os.Bundle
import android.os.PersistableBundle
import android.view.MotionEvent
import android.view.View
import androidx.appcompat.app.AppCompatActivity
import kotlinx.android.synthetic.main.fortune.*
import kotlinx.android.synthetic.main.omikuji.*

class OmikujiActivity : AppCompatActivity() {

override fun onCreate(savedInstanceState: Bundle?, persistentState: PersistableBundle?) { super.onCreate(savedInstanceState, persistentState) setContentView(R.layout.omikuji) } // おみくじ棚の配列 val omikujiShelf = Array<OmikujiParts>(20) { OmikujiParts(R.drawable.result2, R.string.contents1) } // おみくじ番号保管用 var omikujiNumber = -1 val omikujiBox = OmikujiBox() override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.omikuji) omikujiBox.omikujiView = imageView // おみくじ棚の準備 omikujiShelf[0].drawID = R.drawable.result1 omikujiShelf[0].fortuneID = R.string.contents2 omikujiShelf[1].drawID = R.drawable.result3 omikujiShelf[1].fortuneID = R.string.contents9 omikujiShelf[2].fortuneID = R.string.contents3 omikujiShelf[3].fortuneID = R.string.contents4 omikujiShelf[4].fortuneID = R.string.contents5 omikujiShelf[5].fortuneID = R.string.contents6

/*
// くじ番号の取得
val rnd = Random()
val number = rnd.nextInt(20)

// おみくじ棚の準備 val omikujiShelf = Array<String>(20,{"吉"}) omikujiShelf[0] = "大吉" omikujiShelf[19] = "凶" // おみくじ棚から取得 val str = omikujiShelf[number] hello_view.text = str

*/
}

fun onButtonClick(v:View) { omikujiBox.shake()

/*
val translate = TranslateAnimation(0f,0f,0f,-200f)
translate.repeatMode = Animation.REVERSE
translate.repeatCount = 5
translate.duration = 100

val rotate = RotateAnimation(0f,-36f,imageView.width/2f,imageView.height/2f) rotate.duration = 200 val set = AnimationSet(true) set.addAnimation(rotate) set.addAnimation(translate) imageView.startAnimation(set)

*/
// imageView.setImageResource(R.drawable.result1)
}

fun drawResult() { // おみくじ番号を取得する omikujiNumber = omikujiBox.number // おみくじ棚の配列から、omikujiPartsを取得する val op = omikujiShelf[omikujiNumber] // レイアウトを運勢表示に変更する setContentView(R.layout.fortune) // 画像とテキストを変更する imageView2.setImageResource(op.drawID) textView.setText(op.fortuneID) } override fun onTouchEvent(event: MotionEvent?): Boolean { if (event?.action == MotionEvent.ACTION_DOWN){ if (omikujiNumber < 0 && omikujiBox.finish) { drawResult() } } return super.onTouchEvent(event) }

}

```ここに言語を入力 package jp.wings.nikkeibp.omikuji data class OmikujiParts(var drawID: Int, var fortuneID: Int)
コード<resources> <string name="app_name">Omikuji1</string> <string name="bt_action">うらなう</string> <string name="contents1">あ</string> <string name="contents2">a</string> <string name="contents3">aa</string> <string name="contents4">aaa</string> <string name="contents5">aaaaa</string> <string name="contents6">aaaaaa</string> <string name="contents7">aaaaaaa</string> <string name="contents8">aaaaaaaaaaa</string> <string name="contents9">aaaaaaaaaaa</string> </resources>
コード<?xml version="1.0" encoding="ISO-8859-1"?> <LinearLayout android:orientation="vertical" android:gravity="center_horizontal|center_vertical" android:layout_height="match_parent" android:layout_width="match_parent" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:android="http://schemas.android.com/apk/res/android"> <ImageView android:id="@+id/imageView" android:layout_height="wrap_content" android:layout_width="match_parent" app:srcCompat="@drawable/omikuji1" android:layout_weight="1"/> <Button android:id="@+id/button" android:layout_height="wrap_content" android:layout_width="match_parent" android:text="@string/bt_action"/> </LinearLayout>
コード<?xml version="1.0" encoding="ISO-8859-1"?> <RelativeLayout android:layout_height="match_parent" android:layout_width="match_parent" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:android="http://schemas.android.com/apk/res/android"> <ImageView android:id="@+id/imageView2" android:layout_height="wrap_content" android:layout_width="wrap_content" app:srcCompat="@drawable/result1"/> <TextView android:id="@+id/textView" android:layout_height="wrap_content" android:layout_width="wrap_content" android:text="TextView" android:width="200dp"/> </RelativeLayout>

試したこと

一度新規でプロジェクトを立ち上げなおしコピーしました

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

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

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

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

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

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

quadii.shii

2020/03/10 12:37

レイアウトXMLファイル(omikuji.xml)も含めていただけますか。 ボタンクリックリスナの登録が見当たりません。
meijin

2020/03/10 21:15

含めました!
guest

回答1

0

掲載いただいた情報の範囲で気づくことを書きます。

追加していただいたレイアウトXMLの1点目がomikuji.xmlで2点目がfortune.xmlであると思います。
(<code>タグとうまく絡めてファイル名を表示する機能もあるようなのですが、私もよく分かりません。)

omikuji.xml

omikuji.xmlを成形したものです。

xml

1<?xml version="1.0" encoding="ISO-8859-1"?> 2<LinearLayout android:orientation="vertical" 3 android:gravity="center_horizontal|center_vertical" 4 android:layout_height="match_parent" 5 android:layout_width="match_parent" 6 xmlns:app="http://schemas.android.com/apk/res-auto" 7 xmlns:android="http://schemas.android.com/apk/res/android"> 8 9 <ImageView android:id="@+id/imageView" 10 android:layout_height="wrap_content" 11 android:layout_width="match_parent" 12 app:srcCompat="@drawable/omikuji1" 13 android:layout_weight="1"/> 14 15 <Button android:id="@+id/button" 16 android:layout_height="wrap_content" 17 android:layout_width="match_parent" 18 android:text="@string/bt_action"/> 19</LinearLayout>

android:id="@+id/button"の部分がボタンの識別子ですが、コード本体ではこのボタンにクリックリスナをセットしていません。

OmikujiActivity.kt

onCreate内、setContentView以下にsetOnClickListener文を追加するとボタンが反応するようになります。

kotlin

1override fun onCreate(savedInstanceState: Bundle?) { 2 super.onCreate(savedInstanceState) 3 setContentView(R.layout.omikuji) 4 5 // この行を追加 6 button.setOnClickListener(this::onButtonClick)

投稿2020/03/11 00:08

quadii.shii

総合スコア257

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

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

meijin

2020/03/11 07:33

ご指摘いただいた部分を追加しましたがまだボタンが反応しません……
quadii.shii

2020/03/11 07:37

onCreate関数を2つオーバーライドしておられますが、`onCreate(savedInstanceState: Bundle?, persistentState: PersistableBundle?)`引数を2つとる方は私も使い方がよく分からずいつも使っていません。 もしかしてそちらに処理を追加してはいませんか? そちらはオーバーライドごと削除してしまっても動くと思います。
meijin

2020/03/11 07:56

試しましたがうまくいきません
quadii.shii

2020/03/11 10:28

現状気になるところはそのようなところでした。 お役に立てなくて申し訳ありません。
meijin

2020/03/11 10:53

ありがとうございました
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問