2012-05-01 27 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(); 
      } 
     }); 
    } 
} 

這裏的自定義視圖(ITS我在什麼地方找到一個代碼,筆者學分)

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。一旦這些可單擊的項目不再可聚焦,則列表視圖行將變回焦點。另一種解決方案是使用descendantFocusability屬性來控制誰(整行或圖像)首先破解並獲取行內觸發的事件。下面是似乎有一些其他的問題,你需要什麼:

How to fire onListItemClick in Listactivity with buttons in list?

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

相關問題