web-dev-qa-db-ja.com

setEnabled()vs setClickable()、違いは何ですか?

これまで、ユーザーがボタンを押すのを止めたい場合、button.setClickable(false);を設定し、通常、テキストを何らかの種類のグレー色に変更しました(ボタンが無効であることをユーザーに知らせるため)。今日、私はsetEnabled()プロパティを見つけました。

だから私はドキュメントに行き、以下のメソッドの説明を見ました:

_setEnabled(boolean enabled)
   Set the enabled state of this view.
_

これはどういう意味ですか?有効状態/クリック可能状態と無効状態/クリック不可状態の違いは何ですか?誰かが私が以前やっていたこと、クリック可能なプロパティを使用することとsetEnabled()プロパティを使用することの違いは何ですか?いつ何を使うべきですか? Stack Overflowを検索しましたが、関連するものは見つかりませんでした。

68
Emil Adz

一体どういう意味ですか?

引用 「GUIウィジェット」のウィキペディアページ

アプリケーションのコンテキストでは、特定の時点でウィジェットを有効または無効にすることができます。有効なウィジェットには、キーストロークやマウス操作などのイベントに応答する機能があります。そのようなイベントに応答できないウィジェットは、無効と見なされます。無効なウィジェットの外観は通常、有効なウィジェットとは異なります。無効化されたウィジェットは明るい色で描画されるか、何らかの方法で視覚的に不明瞭になる場合があります。例については、右の画像を参照してください。

この概念は数十年前から存在しており、ほとんどのGUIフレームワークで見つけることができます。

有効状態/クリック可能状態と無効状態/クリック不可状態の違いは何ですか?

Androidでは、クリックできないウィジェットはクリックイベントに応答しません。無効なウィジェットはクリックできないだけでなく、無効であることを視覚的に示します。

「..ボタンを視覚的に「無効にする」ため、視覚的にどのように変更するのですか?

ButtonButtonのように見えて応答するのは、その背景、つまりStateListDrawableです。無効状態に使用される特定のイメージがあります。

76
CommonsWare

したがって、基本的に、有効なfalseは応答に応答せず、実行時に設定されたときにクリック可能なfalseはまだ応答し、私が試しただけで私を信頼します。

4
Dilip Poudel

他で言及されていない大きな違いは、ビューの重複です。 clickable = trueおよびenabled = falseのビューでは、背後のビューを押すことはできません。ただし、clickable = falseのビューでは、背後のビューを押すことができます。

1
Trevor

ビューは、外部キーボード、方向パッド(リモート/ゲーミングコントローラー)、および補助デバイス( switchscreen readers )にも応答できます。

1
Renato

Dilipが言ったように、実行時に設定された場合、setClickableは機能しません。これを機能させるコツを以下に示します。

ToggleButton toggle = ...
toggle.setOnTouchListener(new ToggleButton.OnTouchListener() {

  @Override
  public boolean onTouch(View v, MotionEvent event) {
     // If true is returned, the event is eated by the TouchListener
     return !v.isClickable();
  }
});
1

setClickable public void setClickable(ブールクリック可能)

特定のビューのクリックイベントを有効または無効にします。ビューがクリック可能になると、クリックするたびに状態が「押された」状態に変わります。ビューのこのプロパティが無効になっている場合、その状態は変更されません。

setEnabled public void setEnabled(ブール値が有効)

このビューの有効状態を設定します。特定のビューが有効に設定されている場合は、パラメータにtrueを渡し、そうでない場合はfalseを渡します

0

違いは上にリストされていますが、ヒントがあります。 setOnClickListener()の後にsetClickable()を使用します。このため:

public void setOnClickListener(@Nullable OnClickListener l) {
    if (!isClickable()) {
        setClickable(true);
    }
    getListenerInfo().mOnClickListener = l;
}
0
Aloys_寒风