我有一个Gallery,其Adapter可以创建多个LinearLayout实例。然而,这些线性布局实例具有按钮,当有人点击按钮时,他们无法拖动图库。
我的想法是拥有一个用户可以滚动的菜单。通常使用ScrollView完成的事情,但是因为我希望滚动视图“捕捉”到当前按钮页面,所以Gallery更好用。
这个问题类似于这个问题:Android gallery of LinearLayouts
然而,当我在拖动问题时修复了“点击按钮”时,我似乎无法让它像ScrollView一样工作,让按钮作为拖动区域的一部分工作。
任何提示?
不确定代码是否相关,但现在是。
包含图库的布局:
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<Gallery
android:id="@+id/gallery"
android:layout_width="match_parent"
android:layout_height="wrap_content" android:fadingEdge="none"
android:spacing="0dp"/>
</FrameLayout>
填充图库的测试活动:
import com.zehfernando.display.widgets.ZGallery;
public class ScrollTestActivity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.scrolltest);
Gallery gallery = (Gallery) findViewById(R.id.gallery);
gallery.setAdapter(new LayoutAdapter(this));
}
public class LayoutAdapter extends BaseAdapter {
private Context mContext;
public LayoutAdapter(Context c) {
mContext = c;
}
public int getCount() {
return 3;
}
public Object getItem(int position) {
return position;
}
public long getItemId(int position) {
return position;
}
public View getView(int position, View convertView, ViewGroup parent) {
LayoutInflater vi = (LayoutInflater) getApplicationContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View v = vi.inflate(R.layout.scrolllayout, null);
v.setMinimumWidth(getWindowManager().getDefaultDisplay().getWidth());
return v;
}
}
}
图库内的框架布局:
<?xml version="1.0" encoding="utf-8"?>
<com.zehfernando.display.widgets.ScrollableLinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<Button
android:id="@+id/buttonRegister"
android:layout_width="200dp"
android:layout_height="72dp"
android:text="REGISTER"/>
<Button
android:id="@+id/buttonUnregister"
android:layout_width="match_parent"
android:layout_height="72dp"
android:text="UNREGISTER" />
</com.zehfernando.display.widgets.ScrollableLinearLayout>
“ScrollableLinearLayout”只是我的类,它扩展了LinearLayout以覆盖onPressed。
答案 0 :(得分:10)
好吧,我认为我明白了,所以这是为了防止将来遇到这种情况。
我不太了解触摸事件如何在显示列表中传播,所以这比我想承认的尝试和错误要多得多,但基本上:一个人可以拦截父母的触摸事件而不是让它传播给孩子,基本上把按钮变得无用(允许用户点击并拖动它,将事件发送到父亲的onTouchEvent
)。这是通过onInterceptTouchEvent
方法完成的。
所以我没有使用Gallery
,而是扩展了它(现在称它为ZGallery
)。这足以使包含的按钮无用:
@Override
public boolean onInterceptTouchEvent(MotionEvent __e) {
return true;
}
但当然,我想确保按钮工作(它们是可点击的),同时也允许拖动。
可能有一种更聪明的方法可以做到这一点,但我所做的是拦截我的新图库上的触摸事件(如上所述),但允许它通过(返回{{1} })直到用户将'光标'移动了给定的阈值 - 然后我将其解释为拖动意图,开始正确拦截触摸事件。这会导致触摸事件发送到我自己的图库,按预期工作。
您可以对其进行修改,使其仅适用于垂直或水平拖动。
所以无论如何,这是false
类的简化版本,允许拖动它内部的任何元素:
Gallery
似乎运作良好。希望它对其他人有帮助!