AndroidはカスタムViewでフォーカスが得られない場合を解決

1891 ワード

引用:
私たちはAndroid ViewやSurface Viewを使ってグラフィックを描くことができ、いろいろな私たちの好きなグラフィックを描くことができます.そして、自信を持って私たちのViewにonTouchEvent、onKeyDown、onKeyUpを加えて、グラフィックを私たちの希望通りに移動させます.しかし、大きくなればなるほどショックが大きくなることを望んでいます.実行後、私たちのViewはタッチやクリックイベントを取得できないことを発見しました.(タッチしても何もしていないのに)、どうしてこんなことになったのでしょうか.このような問題をどのように解決しますか?このブログでは、その理由を詳しく説明します!
 
1.まずAndroidのイベント伝達メカニズムについてお話しします.いや、Javaのイベント伝達メカニズムです(Androidも同様に適用されます.Androidの開発はJavaに与えられているからです)
Androidイベントは下に伝わる特性がありますが、どういう意味ですか?例えば、あなたはView Groupを持っていて、View GroupにはViewボタンがあります.Viewをクリックすると、Buttonボタンはまずフォーカスを取得し(クリックイベントを取得)、View Groupに渡してからActivityに渡します.
 
実際に引用文で述べたどの問題は,ViewまたはSurfaceViewがまずタッチイベントを取得し,次いでViewまたはSurfaceViewがActivityにイベントを下に伝達し,Activityによってキャプチャされたためであり,イベントが実行されていないためではなく,イベントがActivityによって処理されただけである.
 
この問題を解決する方法は2つあります.
シナリオ1:
  1.カスタムViewの構築方法にsetFocusable(true)を加える.この方法は,現在のViewに焦点を当てることを意味する.例:
  
public GameView(Context context) {

        super(context);

        this.setFocusable(true);//        

    }

  2.ビューのタッチまたはクリックイベントの戻り値をtrueに変更します.例:
  
public boolean onTouchEvent(MotionEvent event) {

        

        return true;

    }

シナリオ2:
Activityのタッチイベントまたはクリックイベントで、カスタムViewのタッチイベントまたはクリックイベントを呼び出します.
 
AndroidのSdkの一部のバージョンでは、この2つの方法で設定してもタッチやクリックイベントが得られない可能性があります.