2014-12-07 76 views
0

我的线性布局:main_linear_layout包含四个线性布局:ll1ll2ll3ll4。每个LinearLayout包含Buttons。我试图在main_linear_layout上实现onFling方法。我希望能够在Buttons的布局上的任意位置滑动,并调用一个操作。onFling和LinearLayouts

目前我能够在屏幕上的任何地方轻扫按钮布局以外的任何地方。我试着用下面的代码来解决这个问题:

swipeLayout = (LinearLayout) findViewById(R.id.main_linear_layout); 
//swipeLayout is the main Layout that contains 4 other linear layouts 

swipeLayout.setOnTouchListener(new View.OnTouchListener() { 

    @Override 
    public boolean onTouch(View v, MotionEvent event) { 
     // TODO Auto-generated method stub 
     gestureScanner.onTouchEvent(event); 
     return true; 
    } 
}); 

但是,我还是没能刷卡就Buttons布局。有人知道这是为什么吗?还有什么我需要实现?我是否应该为主线性布局中的每个线性布局实现OnTouchListener?或每个布局中的每个Button

而在xml我加了一堆代码到主线性布局:

android:clickable="true" 
android:focusable="true" 
android:focusableInTouchMode="true" 
android:longClickable="true" 

但是,这也不能工作。有人可以帮忙吗?

回答

1

如果你有一个LinearLayout,然后在里面有更多的布局,然后按照你所说的做那些按钮,那么这是按照预期工作的。

您只是将监听器添加到外部布局......当然,它只会在您滑动时触发。通过滑动其他布局,甚至按钮,滑动事件甚至不会到达该侦听器,因为它已被占用。

您需要将侦听器添加到您要检查的每个元素。要做到这一点

一种方法是创建按钮的数组,做这一切在一次:

private Button button1; 
private Button button2; 
.... 
private Button button10; 

... 
protected void onCreate(Bundle b) { 
    super.onCreate(b); 
    button1 = findViewById(R.id.button1); 
    ... 
    button10 = findViewById(R.id.button10); 
    OnClickListener onCL = new OnClickListener . . . //do all of your creation here 
    Button[] buttons = {button1, button2, . . . , button10}; 
    for(Button b : buttons) { 
     b.setOnClickListener(onCL); 
    } 
} 
+0

如果我有四个布局中的20个按钮,有没有办法让一个Listener影响整个布局,还是我需要重复相同的代码20次? – user2456977 2014-12-07 04:40:09

+0

@ user2456977看到我的回应 - 我已经添加了一个〜简单的方法来做到这一点。只需创建一个数组,然后查看按钮。 – 2014-12-07 04:45:49

+0

我没有机会检查答案。一旦我检查我会选择一个答案 – user2456977 2014-12-07 15:01:29

1

井的LL1,LL2,LL3,LL4不要触摸事件回暖的原因是因为父线性布局接收到运动事件并且不会进一步传播。

为什么在主线性布局上需要触摸事件侦听器?你想让所有的子布局一起玩吗?

如果你想在其他的布局拿起触摸事件的触摸听者

swipeLayout.setOnTouchListener(new View.OnTouchListener() { 

@Override 
public boolean onTouch(View v, MotionEvent event) { 

    gestureScanner.onTouchEvent(event); 
    return false; 
} 
}); 

返回false或者你可以创建4个GestureDetectors和事件传递给取决于正确的在其上按图

swipeLayout.setOnTouchListener(new View.OnTouchListener() { 

@Override 
public boolean onTouch(View v, MotionEvent event) { 

    switch(v.getId()){ 
    case R.id.ll1: 

     gesture1.ontouchEvent(e); 
     break; 

    case R.id.ll2: 

     gesture1.ontouchEvent(e); 
     break; 
    } 
    //etc 


    return false; 
} 
});