2012-05-01 12 views
2

私は内部(子)のカスタムイメージビューを保持する線形レイアウトを持っています。タッチイベントが子から親にうまくディスパッチされません - ソースが追加されました

私の目標は、画像ビューに背景セレクタを設定し、リスナーをリニアレイアウトに設定することです。

ただし、セレクタとリスナーを連携させることはできません。 イベントの処理方法がわかりません。

私はすばやくタップすると機能しますが、ビュー上で指をドラッグすると、画像ビュー は選択状態のままです。

ここでは、線形レイアウトとそのリスナーへの参照を持つアクティビティを示します。

public class EventDispatchingDemoActivity extends Activity 
{ 
    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) 
    { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 

     LinearLayout linearLayout = (LinearLayout) findViewById(R.id.my_layout); 

     linearLayout.setOnClickListener(new OnClickListener() { 

      @Override 
      public void onClick(View v) 
      { 
       Toast.makeText(getBaseContext(), "Click", Toast.LENGTH_SHORT).show(); 
      } 
     }); 
    } 
} 

ここでカスタムビューです(私はどこかに見つけ、そのコードは、作者のためのクレジット)

public class ImageSelector extends ImageView 
{ 

    public ImageSelector(Context context, AttributeSet attrs) 
    { 
     super(context, attrs); 
     setBackgroundDrawable(new NavStateListDrawable(getContext(), 0)); 
     setClickable(true); 
    } 

    @Override 
    public boolean onTouchEvent(MotionEvent event) 
    { 
     super.onTouchEvent(event); 
     return false; 
    } 

    public class NavStateListDrawable extends StateListDrawable 
    { 

     private int level; 

     public NavStateListDrawable(Context context, int level) 
     { 

      this.level = level; 
      // int stateChecked = android.R.attr.state_checked; 
      int stateFocused = android.R.attr.state_focused; 
      int statePressed = android.R.attr.state_pressed; 
      int stateSelected = android.R.attr.state_selected; 

      addState(new int[] { stateSelected }, context.getResources().getDrawable(R.drawable.slide_feedback)); 
      addState(new int[] { statePressed }, context.getResources().getDrawable(R.drawable.slide_feedback)); 
      addState(new int[] { stateFocused }, context.getResources().getDrawable(R.drawable.slide_feedback)); 
      addState(new int[] { -stateFocused, -statePressed, -stateSelected }, context.getResources().getDrawable(android.R.color.transparent)); 
     } 

     @Override 
     protected boolean onStateChange(int[] stateSet) 
     { 

      boolean nowstate = super.onStateChange(stateSet); 

      try 
      { 
       LayerDrawable defaultDrawable = (LayerDrawable) this.getCurrent(); 

       LevelListDrawable bar2 = (LevelListDrawable) defaultDrawable.findDrawableByLayerId(R.id.element_contact_image_selector); 
       bar2.setLevel(level); 
      } 
      catch (Exception exception) 
      { 

      } 

      return nowstate; 
     } 
    } 
} 

そして、ここでのxmlです:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:background="#acf1fa" 
    android:gravity="center" 
    android:orientation="vertical" > 

    <!-- outer layout --> 

    <LinearLayout 
     android:id="@+id/my_layout" 
     android:layout_width="200dp" 
     android:layout_height="200dp" 
     android:background="#00ff00" 
     android:gravity="center" > 

     <!-- inner layout --> 

     <dor.event.dispathing.ImageSelector 
      android:id="@+id/inner_layout" 
      android:layout_width="150dp" 
      android:layout_height="150dp" /> 
    </LinearLayout> 

</LinearLayout> 

は、私は、ソースをアップロード: http://www.filefactory.com/file/5ikfwyk9j5bx/n/EventDispatchingDemo.rar

ご協力いただきありがとうございます。

答えて

1

アプリケーションを作成しているときに同様の問題が発生したことを覚えています。

1)あなたのリストビューの行がクリックされた場合にキャプチャしようとしていますか?私はlistView.setonItemClickListenerがほしいと思います。リストビュー全体ではなく個々の行ごとにクリックをキャプチャします。

2)私は、あなたがその中のクリック可能なアイテムを持つリストビューを持っていると、その中のクリック可能なアイテムが、クリックを捕らえることに関して優先されると思います。優先順位以上に、彼らはブロックのクリックイベントが親のイベントハンドラに返されると信じています。

これらのクリック可能なアイテムのフォーカス可能性をfalseに設定するのがやや難しい解決策だと思います。これらのクリック可能な項目がフォーカス可能でなくなった場合、リストビューの行にフォーカスが戻されます。もう1つの解決策は、who(全体の行またはイメージ)が最初にクラックを取得し、行内でトリガーされたイベントを取得するコントロールdescendantFocusabilityプロパティを使用することです。ここでは、必要なものを持っているように見えるいくつかの他の質問です:

How to fire onListItemClick in Listactivity with buttons in list?

Android ListView with clickable items in it's rows causes problems continuing scrolling

関連する問題