web-dev-qa-db-ja.com

OnClickListenerがConstraintLayoutで起動されない

私のAndroidアプリプロジェクトでは、背景にプログレスバーと2つのTextViewを備えたボタンを作成する必要があります。

私はこのような最初の試みをします:

    <Android.support.constraint.ConstraintLayout
        Android:id="@+id/keyboard_touch_1"
        Android:layout_width="60dp"
        Android:layout_height="85dp"
        Android:layout_marginBottom="150dp"
        Android:layout_marginStart="10dp"
        Android:focusable="true"
        Android:clickable="true"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintStart_toStartOf="parent">

        <ProgressBar
            Android:id="@+id/keyboard_touch_1_progress_bar"
            style="@Android:style/Widget.ProgressBar.Horizontal"
            Android:layout_width="match_parent"
            Android:layout_height="match_parent"
            Android:indeterminate="false"
            Android:max="100"
            Android:progress="50"
            Android:progressDrawable="@drawable/button_progress_bar_default"
            Android:clickable="false"
            Android:focusable="false" />

        <TextView
            Android:id="@+id/keyboard_touch_1_score"
            Android:layout_width="wrap_content"
            Android:layout_height="wrap_content"
            Android:layout_alignParentStart="true"
            Android:layout_marginEnd="8dp"
            Android:layout_marginTop="8dp"
            Android:text="2"
            Android:textColor="@color/colorAccent"
            Android:textSize="11dp"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintTop_toTopOf="parent"
            tools:text="3"
            Android:clickable="false"
            Android:focusable="false" />

        <TextView
            Android:id="@+id/keyboard_touch_1_letter"
            Android:layout_width="wrap_content"
            Android:layout_height="wrap_content"
            Android:layout_alignParentStart="true"
            Android:layout_marginTop="13dp"
            Android:text="A"
            Android:textColor="@color/colorAccent"
            Android:textSize="45dp"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toTopOf="parent"
            Android:clickable="false"
            Android:focusable="false" />

    </Android.support.constraint.ConstraintLayout>

見た目は良さそうですが、OnClickListenerを追加しようとすると、正しく機能しません。

keyboard_touch_1.setOnClickListener {
    Toast.makeText(this, "IT WORKS !!!", Toast.LENGTH_SHORT).show()
}

OnClickListenerは起動されず、理由がわかりません。おそらくとても簡単ですが、理由がわかりません。

前もって感謝します。

6

削除する

_Android:clickable="false"
_

ドキュメントから

このビューがクリックイベントに反応するかどうかを定義します

_keyboard_touch_1.setOnClickListener {...}_ は以前に設定されたレイアウト(onResume)をリセットするため、setContentViewの最後に_DataBindingUtil.setContentView_を移動します。したがって、新しいレイアウトが作成されます。新しいビューで。

注:通常の初期化setContentView(R.layout.activity_game)手法とともにデータバインディングを使用しているため、最適な方法は

データバインディングによるイベント処理

5
Pavneet_Singh

担当者が少ないためコメントできないので、回答を投稿する必要があります。

GitHubリンクを介して提供したコードに基づいて、実際にはコンテンツビューを2回設定しようとしています。

まず、onCreate()メソッド内でsetContentView(R.layout.activity_game)を呼び出し、次にonResume()メソッド内でDataBindingUtil.setContentView(this, R.layout.activity_game)を呼び出します。

setContentView(R.layout.activity_game)を削除してから、データバインディングセットアップコードをonCreate method()に移動してみてください。次に、プロパティとして「バインディング」オブジェクトを介して制約レイアウトビューにアクセスできます。

例えば:

override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        viewModel = GameViewModel()
        val binding: ActivityGameBinding = DataBindingUtil.setContentView(this, R.layout.activity_game)
        binding.viewModel = viewModel

        binding.keyboardTouch1.setOnClickListener {
            Toast.makeText(this, "IT WORKS !!!", Toast.LENGTH_SHORT).show()
        }
    }

    override fun onResume() {
        super.onResume()
        viewModel.startUpdate()
    }

    override fun onPause() {
        super.onPause()
        viewModel.stopUpdate()
    }
1
RhysP