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

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

ただいまの
回答率

87.48%

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

受付中

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 909

score 4

前提・実現したいこと

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/ツールのバージョンなど)

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • quadii.shii

    2020/03/10 21:37

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

    キャンセル

  • meijin

    2020/03/11 06:15

    含めました!

    キャンセル

回答 1

+1

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

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

omikuji.xml

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

<?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>

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

OmikujiActivity.kt

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

override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.omikuji)

        // この行を追加
        button.setOnClickListener(this::onButtonClick)

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2020/03/11 16:56

    試しましたがうまくいきません

    キャンセル

  • 2020/03/11 19:28

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

    キャンセル

  • 2020/03/11 19:53

    ありがとうございました

    キャンセル

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

  • ただいまの回答率 87.48%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る